読者です 読者をやめる 読者になる 読者になる

Go で cronolog ライクにファイル作成・ログ出力するパッケージ

Go

github.com

を書いてみた。似たようなの既にあったりするけど、使い勝手とか含めてピンポイントで欲しい感じじゃなかったし、せっかくなので Go の勉強も兼ねて作ってみた。

仕様

引数で受け取ったフォーマット文字列を、現在時刻に置き換えてファイルパスにする。
ファイルパスに含まれるディレクトリもなければ作成して、ファイルに文字列を出力する。

フォーマットは下記例のとおり。

入力フォーマット 出力パス
/path/to/example.log.%Y%m%d /path/to/example.log.20170205
/path/to/%Y/%m/%d/example.log /path/to/2017/02/05/example.log

だいたい cronolog にならっていて、時間をベースにファイル分割していく。

使い方

せっかくなので使い方も書いておく。
基本は、Logger と組み合わせて使う。
例えば、uber-go/zap と組み合わせるときは、👇🏼 のとおり Writer オブジェクトをつくって io.Writer の受け口に渡してあげるだけ。

package main

import (
    "github.com/uber-go/zap"
    "github.com/utahta/go-cronowriter" // 👈🏼
)

func main() {
    w1 := writer.MustNew("/tmp/example.log.%Y%m%d") // 👈🏼
    w2 := writer.MustNew("/tmp/internal_error.log.%Y%m%d") // 👈🏼
    l := zap.New(
        zap.NewJSONEncoder(),
        zap.Output(zap.AddSync(w1)),
        zap.ErrorOutput(zap.AddSync(w2)),
    )
    l.Info("test")
}

// Output:
// /tmp/example.log.20170204
// {"level":"info","ts":1486198722.1201255,"msg":"test"}

他の Logger と組み合わせるときも、同じように io.Writer に渡す。
interface 便利!

オプション

いろいろオプションも用意していて、たいていのものは揃ってる(はず)。

WithLocation

タイムゾーンの設定。デフォルトはシステムロケール。

w := writer.MustNew("/path/to/example.log.%Z", writer.WithLocation(time.UTC))
// /path/to/example.log.UTC

WithSymlink

シンボリックリンクの設定。現在書き込み対象のファイルに対してシンボリックを貼る。

w := writer.MustNew(
    "/path/to/example.log.%Y%m%d", 
    writer.WithSymlink("/path/to/example.log")
)
// /path/to/example.log -> /path/to/example.log.20170218

WithMutex

排他制御する設定。大抵の Logger は write 前で mutex.Lock していることから writer はデフォルトで排他制御しなくした。

w := writer.MustNew("/path/to/example.log.%Y%m%d", writer.WithMutex())

WithDebug

デバッグ機能。ファイル書き込みと同時に標準出力する。

w := writer.MustNew("/path/to/example.log.%Y%m%d", writer.WithDebug())

WithInit

writer を New したときにファイルを作成する。デフォルトは Write が呼ばれたタイミングでファイルを作成している。
書き込み権限があるかどうか事前に知りたいとき使うと便利。

w := writer.MustNew("/path/to/example.log.%Y%m%d", writer.WithInit())

もうちょっと複雑なものが欲しいとき

は、lestrrat/go-file-rotatelogs を使うとよさそう。
安心の製品。
ローテーションする時間を決めたり(ちょっと理解できていない)、一定時間経過したファイルをパージしたりする機能が備わっていて便利!