2012-03-25 10 views
9

Pythonのロギングモジュールでは、モジュールまたはクラスで独自のロガーを定義できます。そして、異なるロガーは異なるハンドラを持つことができます。それらのうちのいくつかはファイルにログすることを選ぶかもしれませんが、いくつかは例えばstdoutにログすることを選択します。アプリケーション内のすべてのロガーを設定する方法

私のアプリケーションは、さまざまなハンドラを持つ独自のロガーを持つこれらのモジュールをいくつか使用しています。すべてのログが指定したログファイルに移動するようにログの動作を統一できますか?つまり、すべてのロガーのハンドラを一度に.config()する方法はありますか?

答えて

10

これはどのように動作するかを理解するためにはPython Logging HOWTOを調べるべきでしょう。

要するに、そのモジュールは通常、G_LOG = logging.getLogger('package.name')の形式のロガーを取得し、メッセージをロガーに送信します:G_LOG.info('some message'), G_LOG.exception('something bad happened')。モジュールは通常、何も構成しません。

モジュールは、上のログを有効にしてロガー名に基づいてハンドラを設定することができます使用するアプリケーション:

  • は、すべてのメッセージを聞く、または
  • が一定の閾値以上のメッセージのみを聞く、または
  • など、唯一の名前がpackageで始まる、または
  • だけ名前がwoth package.nameを開始ロガーからのメッセージを聞くロガーからのメッセージを聞く

最も簡単な方法は、アプリケーションの最初のどこかにlogging.basicConfigてロギングを設定することです:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(levelname)-8s %(message)s', 
        datefmt='%Y-%m-%d %H:%M:%S', 
        filename=log_file, filemode='a') 

その方法は、あなたがlog_fileにすべてのモジュールからすべてのログメッセージを書き込みます。

あなたが(別のファイルに異なるロガーからログを置く、または別のファイルにスタックトレースを送信する)、より詳細なログ戦略を必要とする場合は、ログの設定ファイルを定義し、logging.config.dictConfigまたはlogging.config.fileConfigを使用してロギングを設定することをお勧めします。

P.S. G_LOG

G_LOG = logging.getLogger(__name__) 
ST_LOG = logging.getLogger('stacktrace.' + __name__) 

は、私が唯一の1行のメッセージを送信:私は通常、モジュール変数として2つのロガーを作成します。 ST_LOGへ私は暗黙的にexc_info=Trueを持つST_LOG.exceptionを使用して重要なメッセージを複製し、現在の例外のスタックトレースを書き込みます。

アプリケーションの開始時に、stacktraceで始まり、propagate=0で始まるメッセージを受信する(つまり、スタックトレースメッセージが上部に表示されない)2つのロガー(2つのファイルハンドラ)残りのメッセージを処理するルートロガーがあります。私は完全なログ設定ファイルをここには載せません。それは、それがどのように動作するのかを理解するのに便利なホーム作業です。

+1

ここにあるstacktraceのアイデアが大好きですが、私はあなたの "完全なログ設定ファイルをここに入れません"というのは嫌いです。私はほぼ10年間python devをやってきたが、ドキュメンテーションがひどいので、非常に貧弱なログを残している。 1年に数回、私は何か良いものを見つけることに全仕事日を投資します。私はたいてい過去にやったことをあきらめて解決します。 –

+0

@BrunoBronosky、おそらく、あなたは正しいです。いい考えだね。 – newtover

関連する問題