📚

NestJSの構造化ロガーを公開しました

2024/03/18に公開

先日以下の記事で書いたNestJSの構造化ロガーを汎用的に使えるかたちにして npm に公開しました。

https://zenn.dev/ubie_dev/articles/4f2d5607875589

https://github.com/ubie-oss/nslog

使い方は普通のNestJSのカスタムロガーと同じでこんな感じで使います。

async function bootstrap() {
  const app = await NestFactory.create(AppModule, { bufferLogs: true });
  app.useLogger(new StructuredLogger({
    logLevel: process.env.LOG_LEVEL,
    format: process.env.LOG_FORMAT,
  }));

  const logger = new Logger("bootstrap");
  logger.log("Hello structured log!", { foo: "bar" });
  logger.debug("This is a debug log", { x: { y: "z" } });
  logger.warn("This is a warning");
  logger.error("something went wrong", { errorCode: "xxx", result: "error" });

  await app.listen(3000);
  logger.log(`Application is running on: ${await app.getUrl()}`);
}

formatには jsontext が指定できて、本番環境でCloud Loggingなどにログが出力される場合は json、ローカル開発時は text にする想定です。それぞれ以下のように出力されます。

json formatter

text formatter

また、すべてのログに共通で付与したいパラメーターがある場合は、次のように継承してoverrideすることで実現できます。

import { Injectable } from "@nestjs/common";
import { PrintMessageArgs, StructuredLogger, StructuredLoggerOptions } from "./structured-logger";

@Injectable()
class MyLogger extends StructuredLogger {
  protected printMessage(args: PrintMessageArgs): void {
    args.params.push({ requestId: getRequestId() });
    super.printMessage(args);
  }
}

また、テキストのフォーマットだけが気に入らないという場合は以下のようにできます。

import { Injectable } from "@nestjs/common";
import { PrintMessageArgs, StructuredLogger, StructuredLoggerOptions } from "./structured-logger";

@Injectable()
class MyLogger extends StructuredLogger {
  protected printText(args: PrintMessageArgs): void {
    this.print(`${args.severity} [${args.context}] ${args.message}`);
    // paramsは一行で表示しないで複数行でpretty printしたい
    this.print(JSON.stringify(args.params));
  }
}

NestJSデフォルトのConsoleLoggerを継承してカスタムロガーを実装しようとしたときにprivateなメソッドが多くて上書きしたい処理が上書きずにつらい思いをしたので、非公開メソッドは基本的に protected にしています。ご自由に上書きして使ってください[1]

脚注
  1. そもそもこのclassのメソッドを直接利用することはないのでメソッドの公開レベルを設定することにどれだけ意味があるかは不明 ↩︎

Ubie テックブログ

Discussion