Gojiのデフォルトのアクセスログはあまりセクシーではないので、JSON形式で出力できればfluentd等のログプロセッサとの相性も高まり、利便性が向上しそうなので試してみました。
Logrus / glogrus
github.com/Sirupsen/logrusはGoで利用できるロガーで、出力フォーマットを自由に設定することができます。今回は、これを利用してJSON形式でアクセスログを出力させるようにします。
GojiアプリケーションからLogrusを利用するには、github.com/goji/glogrusを利用するのが簡単です。これはLogrusのインスタンスを渡すと、それををロガーとして使用できるようにするGojiミドルウェアでです。
import(
"github.com/zenazn/goji"
"github.com/zenazn/goji/web/middleware"
"github.com/goji/glogrus"
"github.com/Sirupsen/logrus"
)
// ロガーを生成し、出力フォーマットと出力ファイルを設定する
logger := logrus.New()
logger.Formatter = new(logrus.JSONFormatter)
f, _ := os.OpenFile("/var/log/my_app.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
logger.Out = f
// 生成したロガーをGojiで使用するようにする
goji.Use(glogrus.NewGlogrus(logger, "my_app"))
// Gojiデフォルトのロガーを無効にする
goji.Abandon(middleware.Logger)
// Gojiアプリケーションの開始
goji.Serve()
上記のようにすることで、アクセスログをJSON形式で出力できるようになりました。ここではJSON形式を選択しましたが、Formatterを変更することで他の形式でも出力することができるようになります(たとえば、LTSVならgithub.com/doloopwhile/logrusltsvを利用できます)。