如何解决将 Winston Logger 与上下文 NestJS
我正在尝试在我的 NestJS 项目中使用 Winston Logger,并结合来自 nestjs 的 Logger 的“上下文”。
如果我在创建 NestFactory 时直接分配记录器:
const app = await NestFactory.create(AppModule,{
httpsOptions: serverOptions,logger: WinstonModule.createLogger({
level: 'info',handleExceptions: true,format: winston.format.combine(
winston.format.errors({ stack: true }),winston.format.timestamp(),winston.format.json(),),transports: [
new winston.transports.File({
level: 'debug',filename: 'logging.log',}),new winston.transports.Console({
level: 'debug',format: winston.format.combine(
winston.format.errors({ stack: true }),winston.format.colorize(),winston.format.printf(
({ level,message,context,timestamp,stack,trace }) => {
return `${timestamp} [${context}] ${level}: ${message} ${stack ? stack : ''} ${trace ? trace : ''}`;
}),],
我可以从每个服务设置上下文,并且日志记录正确显示上下文:
export class AppService implements OnModuleInit {
constructor(private logger: Logger) {
this.logger.setContext(AppService.name);
}
async onModuleInit(): Promise<void> {
this.logger.log('Testing...');
}
Output: 2021-07-30T05:40:52.742Z [AppService] info: Testing...
但是,如果我将 winston logger 提取到另一个模块:
import { Injectable,Scope,Logger } from '@nestjs/common';
import { Logger as WinstonLogger } from 'winston';
import * as winston from 'winston';
@Injectable()
export class MyLogger extends Logger {
private logger: WinstonLogger;
constructor() {
super();
this.logger = winston.createLogger({ ... same options
并从引导程序间接设置它:
// add global logger
const logger: MyLogger = new MyLogger();
const app = await NestFactory.create(AppModule,{
httpsOptions: serverOptions,logger: logger
“上下文”不再有效,输出为:
2021-07-30T05:50:07.933Z [undefined] info: Testing...
我扩展Logger的原因是我可以添加查询功能并使用winston的查询功能。
我不明白为什么上述两种方法对“上下文”的工作方式不同
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。