2016-04-18 23 views
0

私はこのようになりますGo多くのコードを参照してください。私の質問はありプロダクションコードでfmtを使用する必要がありますか?

func main() { 
    response, _, err := http.Get("http://golang.org/") 
    if err != nil { 
     fmt.Printf("%s", err) 
     os.Exit(1) 
    } 

    defer response.Body.Close() 
    contents, err := ioutil.ReadAll(response.Body) 
    if err != nil { 
     fmt.Printf("%s", err) 
     os.Exit(1) 
    } 

    fmt.Printf("%s\n", string(contents)) 
} 

を:生産で

  1. 、私はこれらのfmt.Printf文おくべき?愚かな質問私は確信しているが、ちょうどチェックする

  2. プロダクションコードとデベロッパーにはどのようなログオプションをお勧めしますか?

+0

なぜコードの書式設定が機能しないのか分かりませんが、私はそれを数回修正しようとしました。 –

+0

あなたのアプリケーションについてもっと知らないとこれに答えることは難しいです。上記のコードは、いくつかの状況では受け入れられますが、他の状況では受け入れられません。 –

+1

"printとexit"というシーケンスは 'log.Fatal *()'関数を使ってうまくいくことに注意してください。 – kostix

答えて

0

ある状況ではprintfを使用することもできます。運用環境では、異なるロギング戦略を使用する方が優れています。

たとえば、アプリケーションがバックグラウンドで実行されているデーモンの場合、ファイルにパイプしない限り、fmt.Printfのすべてを見逃すことになります。

loogingを行う良い方法は、あなた自身のlogrotateを再作成するのではなく、必要に応じて標準パッケージまたは外部パッケージを使用することができるように、ログローテーションを使用することです。

Golangは、logパッケージsyslogサブパッケージを提供しています。これは、OSのsyslogに依存する単純なロギングを行うのに最適なソリューションです。

0

fmt.Printf()は、プログラムのスケッチを開始するのに適していますが、おそらくそれらを削除するか、実際のロギングステートメントで置き換えるべきです。

もっと必要な場合は、私は標準loglogrusで幸運を祈っています。

ログはすべて他の操作に関連しているため、ログを処理している/見ている人は大変です。

0

ベストプラクティスは、開発環境からプロダクション環境に簡単に切り替えるためのコードを、アプリケーションを起動するときに入力パラメータを使用して準備することです。あなたはログのvariuosレベルを作成することができます

:(必要な場合)

「常に」レベル

このログレベルは常に有効になっているが、あなたのアプリケーションの状況に関する重要な情報を提供します。クラッシュメッセージも報告します。

あなたのコードが終了すると便利な情報が含まれていますが、コードが生産

「デバッグ」上にあるときに便利もはやいくつかの情報を確認する必要がない。このログレベルレベル

をログ「テスト」ログレベル

このログレベルには、開発環境で新しい機能を開発したり、既存のコードを最適化したりするときに役立つ情報が含まれています

私の意見では、chanを使用して、非同期デーモンを作成し、必要な場所にログすることができます。

chan hereについての情報を読むことができます。

デーモンの例は次のようになります。

func daemonLogging(importantMessage chan error, testingMessage chan error,debugMessage chan error){ 
    for{ 

     if globalDebugFlag == true{ 
      // Log debug message 
     } 

     if globalTestingMessage == true{ 
      // Log Testing message 
     } 

     // Log important message 
    } 
} 

は、私はそれはあなたがどんなニーズを持っていない場合は、(使用しているものパッケージ重要ではないと思いますgoキーワード

でこの関数を呼び出すことを忘れないでください)しかしそれは重要ですあなたのメッセージをログに記録することを決める方法

0

これは私が取るのは、比較的単純な "サービスのような" soluti (systemddaemonrunitなど)の下でサービスを実行するlog.Fatal*()に切り替えると、このアプローチは非常にうまくいきます。プログラムは適切なシステムログシンクに出力します。

ロギングへのアプローチも、プログラムの性質に大きく依存します。 一言で言えば、標準エラーストリームにロギングして終了するコマンドラインアプリケーション(curlまたはwgetはそのようなプログラムの良い例です)は、唯一の正常な動作モードです。デーモン(サービス)は無人で実行されることが予想されます。したがって、ログに記録され、どこかに保存され、タイムスタンプが付いていることを確認する必要があります。

マイナーノート:よく動作するプログラムは、エラーメッセージを標準エラーストリームに出力することになっているため、log.Fatal*()をいくつかのreaseonに使用しない場合は、少なくともfmt.Fprint*(os.Stderr, ...となります。

関連する問題