You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Moleculer中选择性过滤健康检查相关的调试日志?

解决Moleculer服务Healthcheck冗余Debug日志问题

问题背景

服务中/api/healthcheck接口被自动化系统频繁调用,产生两条冗余Debug日志:

  1. API模块路由映射日志:{"ts":1684139586416,"level":"debug","msg":" Alias: \u001b[35m GET\u001b[39m \u001b[36m/api/healthcheck\u001b[39m\u001b[90m => \u001b[39mapi.healthcheck","nodeID":"abc","ns":"","mod":"api","svc":"api"}
  2. Broker模块本地调用日志:{"ts":1684139586417,"level":"debug","msg":"Call action locally. { action: 'api.healthcheck', requestID: '0e62a5bd-7dfe-41b2-af84-f4186758cc99' }","nodeID":"abc","ns":"","mod":"broker"}

此前通过路由logging: false和日志级别配置仅屏蔽了第一条,现需同时过滤这两条日志且不影响其他API的正常日志输出。


解决方案

方案1:针对Healthcheck动作直接禁用日志(最精准)

在定义healthcheck动作时添加logging: false配置,直接关闭该动作的所有日志输出,包括Broker的本地调用日志:

// 服务的actions定义
module.exports = {
  name: "api",
  actions: {
    healthcheck: {
      logging: false, // 禁用该动作的日志
      handler(ctx) {
        return { status: "ok", timestamp: Date.now() };
      }
    }
  }
};

方案2:全局日志过滤器(适合批量过滤)

在moleculer.config.ts中配置自定义过滤函数,匹配healthcheck相关标识的日志并拦截:

// moleculer.config.ts
module.exports = {
  logger: {
    type: "Console",
    options: {
      level: "debug",
      formatter: "json",
      filter: (level, args, bindings) => {
        const logContent = args[0];
        // 过滤包含api.healthcheck或/api/healthcheck的字符串日志
        if (typeof logContent === "string") {
          return !logContent.includes("api.healthcheck") && !logContent.includes("/api/healthcheck");
        }
        // 过滤携带api.healthcheck动作的对象日志
        if (typeof logContent === "object" && logContent.action === "api.healthcheck") {
          return false;
        }
        // 其他日志正常输出
        return true;
      }
    }
  }
};

方案3:Broker中间件拦截(灵活定制)

编写Broker中间件,在日志输出前临时拦截healthcheck动作的日志逻辑:

// 自定义日志拦截中间件
const healthcheckLogFilter = {
  localAction(next, action) {
    if (action.name !== "healthcheck") {
      return next(action);
    }
    // 临时禁用healthcheck动作的日志
    return async ctx => {
      const originalLogging = ctx.options.logging;
      ctx.options.logging = false;
      const result = await next(action)(ctx);
      ctx.options.logging = originalLogging;
      return result;
    };
  }
};

// 在moleculer.config.ts中注册中间件
module.exports = {
  middlewares: [healthcheckLogFilter],
  // 其他配置...
};

方案对比

  • 方案1:简洁高效,直接针对目标动作,无额外性能开销
  • 方案2:全局生效,适合需要过滤多处healthcheck相关日志的场景
  • 方案3:灵活性最高,可扩展更多过滤规则,但代码复杂度稍高

内容的提问来源于stack exchange,提问作者ko5win

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:37:31