golang の構造化ロガーのうち有名なものの一つに logrus があります。構造化ログとして JSON フォーマットを指定するとするとだいたいこんな感じになります
{"level":"info","msg":"hello world","time":"2019-09-01T06:56:59+09:00","user":"kiririmode"}
で、このログのタイムスタンプなんですが、できるだけ分解能を細かくしたい。ログにおいてはタイムスタンプって解析の貴重な手がかりなので、秒単位だときつい。せめてミリ秒まで、できればナノ秒まであってほしい。
というわけでプロジェクト内で何とかしてくれって話が上がったのですが、logrus においての出力時刻フォーマット指定は、以下のように JSONFormatter
の TimestampFormat
でできる。
func main() {
log := &logrus.Logger{
Out: os.Stderr,
Formatter: &logrus.JSONFormatter{
TimestampFormat: time.RFC3339Nano,
},
Level: logrus.InfoLevel,
}
log.WithField("user", "kiririmode").Infoln("hello world")
}
logrus においては、デフォルトのフォーマットは time.RFC3339 ("2006-01-02T15:04:05Z07:00"
) で指定されているので、それを time.RFC3339Nano ("2006-01-02T15:04:05.999999999Z07:00"
) に変更すれば良い。
- see: https://github.com/sirupsen/logrus/blob/251d6bf71382da18d56ae619e48a8404728b40b0/formatter.go#L7
上記コードを出力すると、出力タイムスタンプの分解能がナノ秒に変わります。
{"level":"info","msg":"hello world","time":"2019-09-01T06:52:23.713652+09:00","user":"kiririmode"}