blog.yuzu441.com

datadogにpinoのログを流す時にlog statusを正しく設定する

pinoで書き出されるログのlevelは30, 40のような数値で表されるため、datadogに流すとログステータスが正しく認識されない 本来であればPipeline機能のPreprocess remapperを使って、datadogが認識できる内容に変換してやればよいが、諸事情でアプリケーション側でカバーすることになったため、それの調査メモ

前提

今回はstdoutにログを出力するとcloudwatch等を経由してdatadogにログを流すという構成を想定している(組んでくれた人に感謝)

ブラウザからログを収集する話ではない

datadogが認識できるログステータス

datadogが認識できるログステータスは以下の通り

  • Integers from 0 to 7 map to the Syslog severity standards.
  • Strings beginning with emerg or f (case-insensitive) map to emerg (0).
  • Strings beginning with a (case-insensitive) map to alert (1).
  • Strings beginning with c (case-insensitive) map to critical (2).
  • Strings beginning with err (case-insensitive) map to error (3).
  • Strings beginning with w (case-insensitive) map to warning (4).
  • Strings beginning with n (case-insensitive) map to notice (5).
  • Strings beginning with i (case-insensitive) map to info (6).
  • Strings beginning with d, t, v, trace, or verbose (case-insensitive) map to debug (7).
  • Strings beginning with o or s, or matching OK or Success (case-insensitive), map to OK.
  • All others map to info (6).

https://docs.datadoghq.com/logs/log_configuration/processors/?tab=ui#log-status-remapper

なのでこの内容でpinoのログレベルを変換してやればよい

ログステータスとして認識するプロパティ

ちなみにlevel以外にもdatadogは特定のプロパティを見てログステータスを判断してくれる。見てくれるプロパティは以下

  • status
  • severity
  • level
  • syslog.severity

Preprocessingのタブ?をStatusにすると見れる(地味にわかりづらい)

pinoでstatusを設定する

levelを上書きするのもなんか気になったのでseverityを追加することにした。それにはpinoのformattersのlevel機能を利用する

const PinoLevelToSeverityLookup = {
  trace: 'DEBUG',
  debug: 'DEBUG',
  info: 'INFO',
  warn: 'WARNING',
  error: 'ERROR',
  fatal: 'CRITICAL',
} as const satisfies Record<string, string>

const logger = pino({
  level: 'info',
  formatters: {
    level(label, level) {
      return {
        // ここでseverityに`INFO`などの文字列を設定
        severity: PinoLevelToSeverityLookup[label] ?? PinoLevelToSeverityLookup.info,
        level,
      }
    },
  },
})

これでログにはseverityが追加されるので以下のような感じになる

{
  "level": 30,
  "time": 1634871600000,
  "msg": "hello",
  "severity": "INFO"
}

これでdatadogがログのステータスを正しく認識してくれるようになる