Go の 標準の log パッケージ の実装をベースに自前で管理のログ出力部分を実装してみました。
やったこと
Go の標準の log パッケージをベースにして自前でログを実装する機会があったので、そもそも log パッケージ内の実装を読んで見ようと思ったのがきっかけです。
以下のような感じで HTTP のリクエストログを表示するくんを実装しました。
2019/12/21 18:18:19 GET / 2019/12/21 18:18:20 GET /
コードは以下に置いてます。
(goimports かけ忘れましたw)
log パッケージの実装の詳細
ポイントを絞って車輪の再発明のときに参考にしたところを記載します。
出力する本体は https://golang.org/src/log/log.go#L143 の部分。
ログの出力箇所は
io.Writer
を使っている。出力するときは
byte
の配列にして出力している。- 出力する文字列を
[]byte
に溜め込んで一気に書き込んでいる。 - ここは json string で出力したり「何で出力するか?」は色々変えることができるポイントだなと思いました。
- 出力する文字列を
Logger 内の byte 配列は SliceTricks · golang/go Wiki · GitHub にあるようなアロケーションなしで byte を使い回すようになっていました。
New
したLogger
を使いまわしてログを出力している。
感想
車輪の再発明がてら本家のパッケージがどう実装してるか見るのはとても参考になります。