Go でのアプリケーション ロギングのパターンは何ですか? たとえば、ログに記録する必要がある goroutine が 5 つある場合、次のようにすればよいでしょうか...
- シングルを作っ
log.Logger
て回す? - そこへのポインタを渡しますか
log.Logger
? - 各 goroutine または関数はロガーを作成する必要がありますか?
- ロガーをグローバル変数として作成する必要がありますか?
ベストアンサー1
- 単一の log.Logger を作成してそれを渡しますか?
それは可能です。ログロガー複数の goroutine から同時に使用できます。
- その log.Logger へのポインタを渡しますか?
ログ。新規を返します。*Logger
これは通常、オブジェクトをポインタとして渡す必要があることを示しています。これを値として渡すと、構造体のコピー(つまり、Loggerのコピー)が作成され、複数のゴルーチンが同じものに書き込む可能性があります。io.ライター同時に。ライターの実装によっては、深刻な問題になる可能性があります。
- 各 goroutine または関数はロガーを作成する必要がありますか?
各関数またはゴルーチンごとに個別のロガーを作成するのはお勧めしません。ゴルーチン (および関数) は、個別のロガーのメンテナンスを正当化しない非常に軽量なタスクに使用されます。プロジェクトの各主要コンポーネントごとにロガーを作成することをお勧めします。たとえば、プロジェクトでメールの送信に SMTP サービスを使用する場合、メール サービス用に個別のロガーを作成して、出力を個別にフィルタリングしたりオフにしたりできるようにすると良いでしょう。
- ロガーをグローバル変数として作成する必要がありますか?
それはパッケージによって異なります。前のメール サービスの例では、サービスのインスタンスごとに 1 つのロガーを用意して、ユーザーが Gmail メール サービスの使用中に発生した障害を、ローカル MTA (sendmail など) の使用中に発生した障害とは別にログに記録できるようにするのが良いでしょう。