midwayjs / logger

midway logger
MIT License
4 stars 3 forks source link

contextFormat 对 appLogger 不生效 #123

Open geekberryonekey opened 5 months ago

geekberryonekey commented 5 months ago

版本: @midwayjs/logger: 3.4.0

  midwayLogger: {
    default: {
      transports: {
        console: {
          level: 'debug',
        },
        file: {
          level: 'debug',
          dir: `logs/${injectedEnv.nodeEnv}/${injectedEnv.project}`,
        },
        error: false,
      },
    },
    clients: {
      appLogger: {
        fileLogName: 'app.log',
        format: formatLogger,
        contextFormat: formatLogger,
      },
    },
  },
@Middleware()
export class TraceIdMiddleware implements IMiddleware<Context, NextFunction> {
  @Inject()
  logger: ILogger;

  resolve() {
    return async (ctx: Context, next: NextFunction) => {
      console.log(this.logger === ctx.logger); // false
      console.log(ctx.getLogger() === ctx.logger); // true

      ctx.logger.error('ctx.logger'); // 没有到 formatLogger
      this.logger.error('this.logger'); // 走到了 formatLogger

      return await next();
    };
  }
}
geekberryonekey commented 5 months ago

以下是各种注入方式和行为表现:

@Controller('/v1/health')
export class HealthController {
  @Logger('customLogger') // 能输出, 能被 format 处理, 不等于 ctx.logger
  // @Logger('appLogger') // 能输出, 能被 format 处理, 不等于 ctx.logger
  // @Logger() // this.myLogger === undefined
  // @Inject() // this.myLogger === undefined
  myLogger: ILogger; // 名字不叫 logger

  // @Logger('customLogger') // 能输出, 能被 format 处理 (自定义 logger), 不等于 ctx.logger
  // @Logger('appLogger') // 能输出, 能被 format 处理, 不等于 ctx.logger
  // @Logger() // 能输出, 能被 format 处理, 不等于 ctx.logger
  @Inject() // 能输出, 不能被 format 处理, 不能被 contextFormat 拦截, 等于 ctx.logger
  logger: ILogger;

  @Inject()
  ctx: Context;

  @Get('/')
  async health() {
    this.myLogger.info('myLogger');
    this.logger.info('logger');
    this.ctx.logger.info('ctx.logger');

    return true;
  }
}
czy88840616 commented 5 months ago

https://midwayjs.org/docs/logger_v3#%E9%85%8D%E7%BD%AE%E4%B8%8A%E4%B8%8B%E6%96%87%E6%97%A5%E5%BF%97%E8%BE%93%E5%87%BA%E6%A0%BC%E5%BC%8F

这里有写。

geekberryonekey commented 5 months ago

format 和 contextFormat 是 clients 的两个参数是吧, 请看我上文的测试结果, 均不能被 contextFormat 拦截 (而能被 format 拦截的, ctx 都是 null)

czy88840616 commented 5 months ago

文档里的链接底下有特殊场景,原因是 web framework 类型覆盖了 appLogger 的 context format,这里的确不好理解,下个大版本是计划重构掉的。

image