理系学生日記

おまえはいつまで学生気分なのか

logrusでナノ秒まで時刻を出力したい

golang の構造化ロガーのうち有名なものの一つに logrus があります。構造化ログとして JSON フォーマットを指定するとするとだいたいこんな感じになります

{"level":"info","msg":"hello world","time":"2019-09-01T06:56:59+09:00","user":"kiririmode"}

で、このログのタイムスタンプなんですが、できるだけ分解能を細かくしたい。ログにおいてはタイムスタンプって解析の貴重な手がかりなので、秒単位だときつい。せめてミリ秒まで、できればナノ秒まであってほしい。 というわけでプロジェクト内で何とかしてくれって話が上がったのですが、logrus においての出力時刻フォーマット指定は、以下のように JSONFormatterTimestampFormat でできる。

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") に変更すれば良い。

github.com

上記コードを出力すると、出力タイムスタンプの分解能がナノ秒に変わります。

{"level":"info","msg":"hello world","time":"2019-09-01T06:52:23.713652+09:00","user":"kiririmode"}