簡體   English   中英

如何自定義 nest.js 記錄器

[英]how to customize nest.js logger

我想刪除默認日志格式,只使用自定義日志消息。 ::1 2021-08-10T10:29:52.000Z PUT / http 200 18 3000 27ms我需要幫助創建自定義記錄器,以下是我到目前為止的代碼。 它以默認日志格式記錄[Nest] 28869 - 2021. 08. 10 10:23:03AM LOG ${custom log message}

 @Injectable() export class LoggingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next) { const now = Date.now(); const req = context.switchToHttp().getRequest(); const method = req.method; const url = req.url; return next.handle().pipe( tap(() => { const res = context.switchToHttp().getResponse(); const delay = Date.now() - now; Logger.log( `${req.ip} ${new Date()} ${method} ${url} ${req.protocol} ${res.statusCode} ${ req.headers['content-length'] || '0' } ${req.headers.host.split(':')[1]} ${delay}ms`, ); }), ); } }

先感謝您!

您可以通過覆蓋默認記錄器並在應用程序在 main.ts 中引導時使用該記錄器來做到這一點。

您的自定義記錄器是這樣的。

import { LoggerService } from '@nestjs/common';

export class CustomLogger implements LoggerService {
  /**
   * Write a 'log' level log.
   */
  log(message: any, ...optionalParams: any[]) {
     console.log(message);
  }

  /**
   * Write an 'error' level log.
   */
  error(message: any, ...optionalParams: any[]) {}

  /**
   * Write a 'warn' level log.
   */
  warn(message: any, ...optionalParams: any[]) {}

  /**
   * Write a 'debug' level log.
   */
  debug?(message: any, ...optionalParams: any[]) {}

  /**
   * Write a 'verbose' level log.
   */
  verbose?(message: any, ...optionalParams: any[]) {}
}

然后創建一個模塊並將客戶記錄器提供給該模塊。 並使其全球化,以便您可以在代碼的任何地方使用它。

import { Module, Global } from '@nestjs/common';
import { CustomLogger } from './logger.service';
import { LoggingInterceptor } from './logging.interceptor';

@Global()
@Module({
  providers: [CustomLogger, LoggingInterceptor],
  exports: [CustomLogger],
})
export class LoggerModule {
}

在您的 AppModule 中注冊 LoggerMoudle。 將客戶記錄器添加到您的 main.ts。


import { CustomLogger } from './logger/logger.service';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    bufferLogs: true,
  });
  app.useLogger(app.get(CustomLogger));
  await app.listen(PORT)
}

然后你可以將customeLogger服務注入到Logging攔截器中,你的工作就完成了。

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

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  constructor(private customLogger: CustomLogger) {}
  intercept(context: ExecutionContext, next) {
    const now = Date.now();
    const req = context.switchToHttp().getRequest();
    const method = req.method;
    const url = req.url;

    return next.handle().pipe(
      tap(() => {
        const res = context.switchToHttp().getResponse();
        const delay = Date.now() - now;
        this.customLogger.log(
          `${req.ip} ${new Date()} ${method} ${url} ${req.protocol} ${res.statusCode} ${
            req.headers['content-length'] || '0'
          } ${req.headers.host.split(':')[1]} ${delay}ms`,
        );
      }),
    );
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM