【问题标题】:Where is the most reasonable place to write logs at a debug level?在调试级别写入日志最合理的位置在哪里?
【发布时间】:2019-11-09 04:06:51
【问题描述】:

我和我的团队在几天内陷入沉思,以找出在开发期间编写调试级日志的正确位置。

我们使用winstonwinston-daily-rotate-file 来解耦部分日志记录过程,以及nest-winston,这是winston 记录器的嵌套模块包装器。

我们决定通过扩展内置的 Logger 类来创建一个灵活的自定义记录器即服务。

@Injectable()
export class LoggerService extends Logger {
  constructor(
    @Inject('winston')
    private readonly logger: winston.Logger,
  ) { super(); }

 info(message: string, context?: string): void {
   this.logger.info(message, { context });
   super.log(message, context);
  }

 debug(message: string, context?: string): void {
   // To delegate the call to the parent class, no winston used.
   super.debug(message, context);
  }

 error(message: string, trace: string, context?: string): void {
   this.logger.error(message, { context });
   super.error(message, trace, context);
  }
}

您可能已经从debug() 方法中注意到,存储设备 (Transports) 并未故意在调试级别进行配置。我们希望它们仅在开发时通过控制台打印出来。

现在我们可以在同一上下文中的任何地方使用我们的 LoggerService。例如,

@Controller('users')
export class UsersController {
  constructor(private readonly logger: LoggerService) {}

}

@Injectable()
export class UsersService {
  constructor(private readonly logger: LoggerService) {}

  // Inside a method, debug some logic.
  this.logger.debug(message, UsersService.name);
}

这种方法乍一看还不错,但当代码被其他地方过度使用时,它可能会变得非常混乱。

出于这个原因,我们想有一个地方在一个共享的地方处理调试过程,并想出了一个让拦截器处理工作的想法。

import { LoggerService } from '../../logger/logger.service';

@Injectable()
export class DebuggingInterceptor implements NestInterceptor {
  constructor(private readonly logger: LoggerService) {}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const ctx = `${context.getClass().name} ➜ ${context.getHandler().name}()`;

    return next
      .handle()
      .pipe(
        tap((response) => {
          if (process.env.NODE_ENV === 'development') {
            this.logger.debug(response, ctx);
          }
        }),
      );
  }
}

在打印出调试日志之前,检查环境是否处于开发中对我来说有点难看。

如果上面使用拦截器的方法可能完全错误怎么办?

我怎样才能更好地解决这个问题?

【问题讨论】:

    标签: typescript express logging nestjs


    【解决方案1】:

    我认为使用拦截器的方法很好。如果您不喜欢在拦截器中检查环境的想法,您可以随时在LoggerService 类中检查它来决定是否调用super.debug() 方法,这样您就可以调用this.logger.debug(response, ctx) .

    作为旁注,我正在开发自己版本的被覆盖记录器,并解决将类名注入记录器的问题,以便在记录器中设置上下文并从那里使用,但这需要一些时间来处理。只是一个想法到另一个想法。

    【讨论】:

    • 感谢杰伊的回答。我有个问题。在拦截器和 LoggerService 中检查环境有什么区别?在我看来,这几乎是一回事。
    • 完全一样,只是清理了拦截器的逻辑,让 LoggerService 处理检查它是否应该打印。这完全是一个见仁见智的问题,但是如果您只想在开发环境中打印调试级别的日志,我建议让 LoggerService 检查它是否应该这样,这样您就不必在有调试行的任何地方实现该逻辑。
    • 那么 Jay,从 LoggerServcie 类处理开发环境中的调试级别日志是目前最好的解决方法吗?我正在寻找比这更清洁的东西。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 2016-12-12
    • 2016-05-07
    • 2021-08-31
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多