log
パッケージを利用する、高度にインストルメント化されたコードがいくつかあります。いよいよロギングをオフにするときが来ましたが、標準のロガーをオフにする方法がわかりません。
私は何かを逃しましたか?ログ呼び出しを行う前にフラグをチェックする必要がありますか、それとも本番環境でコメントアウトする必要がありますか?
io / ioutilパッケージに存在する場合、共通のio.Writer用に独自のタイプを作成する理由はありません。
import (
"log"
"io/ioutil"
)
func init() {
log.SetOutput(ioutil.Discard)
}
type NullWriter int
func (NullWriter) Write([]byte) (int, error) { return 0, nil }
// ...
log.SetOutput(new(NullWriter))
このアプローチにより、実行時にログのオンとオフを切り替えることができます。
type LogWriter struct{
enabled bool
}
func (l *LogWriter) Enable() {
l.enabled = true
}
func (l *LogWriter) Disable() {
l.enabled = false
}
func (l *LogWriter) Write([]byte) (int, error) {
if l.enabled {
//...
}
return 0, nil
}
そして、このアプローチは、ランタイム全体のロギングを有効または無効にします。
type LogWriter struct{}
func (l *LogWriter) Write([]byte) (int, error) {
if some.Constant {
//...
}
return 0, nil
}
wheresome.Constant
は、コンパイル前に設定する定数 ( 「プロダクション」バイナリを生成する) またはコマンドライン フラグを介してプログラムを実行するときに一度だけ設定される変数 (のようなものmyprogram --enable-logging=true
)のいずれかになります。
どちらのアプローチでも、現在のコードをほとんどそのままにしておくことができます。
このログ機能や他のログ機能を探してここに来る他の人へのメモ:ログのオフ、ログレベルの設定、ログローテーション、ファイルへのリダイレクトなどをカバーするlog4goパッケージをご覧ください。
http://godoc.org/code.google.com/p/log4goのドキュメントを参照してください