1. ホーム
  2. python

[解決済み] DjangoにおけるPythonロギングのエレガントなセットアップ

2022-12-06 13:07:50

質問

Django で Python ログをセットアップする方法で、私が満足するものをまだ見つけていません。私の要件はかなり単純です。

  • 異なるイベントに対して異なるログハンドラ - つまり、異なるファイルにログを記録できるようにしたいです。
  • モジュール内のロガーに簡単にアクセスできること。モジュールは少しの努力でそのロガーを見つけることができなければなりません。
  • コマンドラインモジュールに簡単に適用できること。システムの一部は、スタンドアロンのコマンドラインまたはデーモンプロセスです。ロギングはこれらのモジュールで容易に使用可能であるべきです。

私の現在のセットアップは logging.conf ファイルを使用して、ログを記録する各モジュールでログをセットアップすることです。それは正しいとは思えません。

あなたが好きなロギングセットアップをお持ちですか?どのように設定を行うか、詳しく教えてください。 logging.conf を使用するか、コードで設定するか)、いつどこでロガーを開始するか、モジュールでそれらにアクセスする方法などです。

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

私が見つけた最良の方法は、settings.pyでロギング設定を初期化することです。あなたは、設定ファイルを使用するか、プログラムによって段階的に行うことができます - それはあなたの要件に依存します。重要なことは、私は通常、root logger に必要なハンドラを追加し、levels と時には logging.Filters を使って、必要なイベントを適切なファイル、コンソール、syslogs などに取得することです。もちろん、他のロガーにハンドラを追加することもできますが、私の経験では、一般的にこの必要性はありません。

各モジュールでは、ロガーを

logger = logging.getLogger(__name__)

を作成し、それをモジュール内のイベントのロギングに使用します(さらに差別化したい場合は、上で作成したロガーの子であるロガーを使用します)。

私のアプリがsettings.pyでロギングを設定しないサイトで使用される可能性がある場合、私は以下のようにNullHandlerをどこかに定義します。

#someutils.py

class NullHandler(logging.Handler):
    def emit(self, record):
        pass

null_handler = NullHandler()

で、そのインスタンスが私のアプリでロギングを使用するモジュールで作成されたすべてのロガーに追加されることを確認します。(注意: NullHandler は Python 3.1 の logging パッケージにすでに含まれており、Python 2.7 にも含まれる予定です)。だから

logger = logging.getLogger(__name__)
logger.addHandler(someutils.null_handler)

これは、settings.py でロギングを設定していないサイトで、あなたのモジュールがうまく動作することを保証し、迷惑な "No handlers could be found for logger X.Y.Z" メッセージ(潜在的に誤ったロギング設定に関する警告)を受け取らないようにするために行われます。

この方法で行うことは、指定された要件を満たします。

  • 現在行っているように、異なるイベントに対して異なるログ ハンドラを設定することができます。
  • モジュール内のロガーに簡単にアクセスできるようになりました。 getLogger(__name__) .
  • コマンドラインモジュールに簡単に適用できる - これらはまた、インポートされた settings.py .

更新しました。 バージョン 1.3 で、Django には をサポートするようになりました。 .