2016-12-30 2 views
3

私はlogfmtを使って変数やエラーを出力できることを知っています。私は、変数を印刷する場合例えば、私はこれを行うことができます。デバッグと印刷のエラーでログオフfmtを使用するタイミングは?

h := "world" 
fmt.Printf("hello = %v\n", h) 
log.Printf("halo = %v\n", h) 

は、出力は次のようになります。

hello = world 
2016/12/30 09:13:12 halo = world 

を、通常はエラー処理中に私が見つかりました。この

if err != nil { 
    log.Println("Error : something terrible happen -> ", err) 
    return err 
} 

などのログ上記のような場合はfmtを使ってこのようなエラーを印刷することもできます

fmt.Printf("Error : something terrible happen -> %v\n",err.Error()) 

logの代わりにfmtを使用することをお勧めしますか? そして、デバッグ時に変数を出力するのに、logの代わりに常にfmtを使用します。これらの事実を使用してlogfmt

+0

[なぜ私はlog.Printlnの代わりfmt.Printlnを使うべきなのでしょうか?]の可能な重複(https://stackoverflow.com/questions/19646889/why-should-i-use- log-println-fmt-printlnの代わりに) – mayo

答えて

9

選択は:

3つのサブ質問に対する答えは、「それに依存する」です。あなたがプログラム出力ためfmt.Print *を使用してログインするために固執する場合

+0

「ログ機能はタイムスタンプ、ソースコードの場所、その他の情報を印刷できます」に関するサンプルを表示できますか? – BlackMamba

+1

@BlackMamba https://play.golang。org/p/ayyU7Yuo6l –

2

あなたは、一般的にトラブルに得ることはありません。*プログラムログため。

もちろん、あなたのプログラムには "ローカル"出力(ほとんどのネットワークサーバプログラム)がない場合は、両方をロギングに使うことができますが、ロギングログ。*はより柔軟で適切です。

3

私は1つ以上の点を追加したいと思います:FMTようでない場合

  • ログは、スレッドセーフです。

    ロガーは複数のゴルーチンから同時に使用できます。ライターへのアクセスをシリアライズすることが保証されます。

Link

+0

'log'がスレッドセーフであるかどうか知りませんか?これのための任意の参照?ありがとう –

+2

@GujaratSantana [loggerドキュメント](https://godoc.org/log#Logger)には、複数のgoroutineから同時にロガーを使用できることが記載されています。 'fmt.Printf'のスレッド安全性に関する文書はありません。 'fmt.Printf'実装はスレッドセーフですが、スレッドセーフではないように変更されることはほとんどありません。 –

+2

実際、 'fmt.Printf'はデータレースを持たないという点でスレッドセーフですが、' Logger'はミューテックスを使って出力をシリアライズし、fmtはそれを直接書き出します。十分な並行性で、stdoutへのインターリーブされた書き込みを得ることができます。 – JimB

関連する問題