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
orf
(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
, orverbose
(case-insensitive) map to debug (7). - Strings beginning with
o
ors
, or matchingOK
orSuccess
(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がログのステータスを正しく認識してくれるようになる