D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2014年01月

goで書いたwebappでもApache形式のログを出したい!ということでgo-apache-logformatを書きました。

最初はこのツールを使って毎回ServeHTTP()関数の中でログを出力する関数を呼び出すようにしようと思ったんだけど簡単なラッパーを用意したので多分かなり簡単にApacheログを出力できるようになるはず

まず最初にやらないといけないのがApacheLog構造体を作るところ。出力先のio.Writerと出力フォーマットを指定して作成するんだけど、いわゆるcombined logフォーマットだったらもうすでに作ってあるので、それをClone()しちゃえば簡単:

import (
"github.com/lestrrat/go-apache-logformat"
)

....
logger := apachelog.CombinedLog.Clone()
logger.SetOutput(...) // io.Writer. os.FileとかでもOK. デフォルトはos.Stderr

で、あとはそれをhttp.HandlerFuncで使用されるようにすればいい。もしServeHTTP()関数を実装した構造体があればそれをラップするだけでもOK:

http.ListenAndServe(":8080", apachelog.WrapLoggingWriter(handler.ServeHTTP, logger)

もし色々自分でやりたいなら、ServeHTTP関数の中で自分で以下のようにフックしてもいい:

func ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
lw := apachelog.NewLoggingWriter(w, r, logger)
defer lw.EmitLog() ...
}

ここでひとつ気をつけないといけないのが、上記のServeHTTPの中ではw ではなく lw (LoggingWriter)のほうを使う事。そうしないと諸々必要な値が取れない。

最後にもしこれをログファイルにはき出しつつローテーションも行いたいならgo-file-rotatelogsを最初のloggerにかませばそれでおしまい:

import (
"github.com/lestrrat/go-file-rotatelogs"
"github.com/lestrrat/go-apache-logformat"
) ...
logfile := rotatelogs.NewRotateLogs("/path/to/accesslog.%Y%m%d")
logfile.LinkName = "/path/to/accesslog" logger := apachelog.CombinedLog.Clone()
logger.SetOutput(logfile)

というわけで是非お試しください。ツッコミ、PR、お待ちしております
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

Yet another Yak-shaving... 

というわけで、Perl5のFile::RotateLogsgoにさくっとポートしました。使い方はREADMEのままです!

これでちょちょっと書けばgoアプリでも勝手にログファイルがローテートされるようになります!
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

正月ですが、一歳半の子供にはそんなこと関係ありません。毎日心を新しい事で潤してやり、体をクタクタにさせてあげる必要があります。なおこれまでは自分、妻、長男と3人で行動していましたが、次男が産まれたばかりのため次男、そして必然的に妻は移動ができません。よって自分一人で一歳半の子供をとにかく疲れさせてやる必要があるわけです。

そんなわけで、朝早くから「さすがに正月二日からなら混んでないだろう」という打算の元、みなとみらいMARK ISのボーネルンドへの遠征を計画しました。

続きを読む
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

このページのトップヘ