📚
NestJSの構造化ロガーを公開しました
先日以下の記事で書いたNestJSの構造化ロガーを汎用的に使えるかたちにして npm に公開しました。
使い方は普通の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には json
と text
が指定できて、本番環境でCloud Loggingなどにログが出力される場合は json
、ローカル開発時は text
にする想定です。それぞれ以下のように出力されます。
また、すべてのログに共通で付与したいパラメーターがある場合は、次のように継承して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]。
-
そもそもこのclassのメソッドを直接利用することはないのでメソッドの公開レベルを設定することにどれだけ意味があるかは不明 ↩︎
Discussion