1. ホーム
  2. logging

[解決済み] グローバルロギングの正しい考え方

2022-06-16 17:08:53

質問

Goのアプリケーションロギングにはどのようなパターンがありますか? 例えば、5つのゴルーチンからログを取る必要がある場合、私は...すべきでしょうか?

  • 単一の log.Logger を作成し、それを渡すか?
  • へのポインタを渡します。 log.Logger ?
  • 各ゴルーチンや関数はロガーを作成すべきですか?
  • ロガーはグローバル変数として作成すべきですか?

どのように解決するのですか?

<ブロッククオート
  • log.Loggerを1つ作成して、それを渡しますか?

それは可能です。A log.Logger は複数のゴルーチンから同時に使用することができます。

  • そのlog.Loggerへのポインタを渡しますか?

log.new *Logger を返します。これは通常、オブジェクトをポインタとして渡すべきであることを示します。値として渡すと、構造体のコピー (つまり Logger のコピー) が作成され、複数のゴルーチンが同じ io.Writer に同時に書き込むことになります。これは、ライターの実装によっては深刻な問題になるかもしれません。

  • 各ゴルーチンや関数はロガーを作成すべきですか?

私は、各関数またはゴルーチンに対して個別のロガーを作成しません。ゴルーチン (および関数) は非常に軽量なタスクに使用され、個別のロガーのメンテナンスを正当化することはできません。プロジェクトの大きなコンポーネントごとにロガーを作成するのは、良いアイデアかもしれません。たとえば、プロジェクトがメールを送信するために SMTP サービスを使用する場合、メール サービス用に別のロガーを作成すると、出力を別々にフィルタリングしてオフにできるため、良いアイデアだと思われます。

  • グローバル変数としてロガーを作成する必要がありますか。

それはあなたのパッケージに依存します。前のメールサービスの例では、サービスの各インスタンスに1つのロガーを持つことがおそらく良いアイデアでしょう。これにより、ユーザーはgmailメールサービス使用中の失敗を、ローカルMTA(例:sendmail)使用中に発生した失敗とは異なる形で記録することができます。