2011-09-15 3 views
10

を再定義します。は、このようなコードの行数千がある私の現在のプロジェクトでのロギングルートロガー

logging.config.fileConfig(path_to_logger_config) 
logging.root = logging.getLogger('Experimental') 

はの再定義されています:今、新しいルートロガーは、コードのこの部分で行われている設定

[loggers] 
keys = Experimental 

[formatter_detailed] 
format = %(asctime)s:%(name)s:%(levelname)s %(module)s:%(lineno)d: %(message)s 

[handler_logfile] 
class = FileHandler 
args = ('experimental.log', 'a') 
formatter = detailed 

[logger_Experimental] 
level = DEBUG 
qualname = Experimental 
handlers = logfile 
propagate = 0 

:私の考えは、INIファイルで構成されている他のExperimentalロガーへのルートロガーを変えていますルートロガーは安全ですか?たぶんもっと便利な方法がありますか?

Googleを使用しようとしましたが、stackoverflowの質問を見てみましたが、答えが見つかりませんでした。

+0

最初。これは機能しましたか?実際の問題がありますか?二番目。 "より便利"を定義する2行のコードはとても便利なようです。どのくらい便利だと思いますか? –

+0

それは動作します!しかし、私は疑うが、これはハックのように見える。 「より便利」とは、「ロギングモジュールの標準機能を使用する」という意味です。ごめんなさい。 –

+0

いい男!書式設定は素晴らしいです。 –

答えて

11

ではなく、で説明した方法でルート・ロガーを再定義することをお勧めします。一般に、あなただけの小さなスクリプトの直接ルートロガーを使用する必要があります - 大規模なアプリケーションのために、ベストプラクティスは、など)(ロギングを使用して、各モジュールに

logger = logging.getLogger(__name__) 

を使用して、logger.infoへの呼び出しを作ることです

ファイルにログを記録するだけであれば、ファイルハンドラをルートロガーに追加するだけではどうですか?たとえば、

if __name__ == '__main__': 
    logging.basicConfig(filename='experimental.log', filemode='w') 
    main() # or whatever your main entry point is called 

またはコンフィギュレーションファイルを介して。

アップデート:私は「あなたがお勧めしている」と言うとき、あなたのシナリオのいずれかの問題に実行しないことがありますが、私は;-)ここにこの答えでは、私が意味し、それはモジュールを上書きすることをお勧めではありません上書きされるように設計されていない属性。たとえば、ルート・ロガーは、(パブリックAPIの一部ではない)別のクラスのインスタンスであり、ロギング・マシナリーにはそれまでの古い値を指し示す他の参照があります。これらの事実のどちらかが、デバッグの難しい問題につながる可能性があります。ロギングパッケージは、あなたが望むようなものを実現するためのさまざまな方法を可能にします(一見、コンソールではなくファイルにロギングする)ので、提供されているメカニズムを使用するべきです。

+0

「あなたはアドバイスを受けています...」どこですか?これによって引き起こされる問題は何ですか?答えの残りの部分は "一般的に..."が優れています。しかし、その最初の文章は、いくつかの裏付け証拠または証拠資料の恩恵を受けるでしょう。 –

+0

'logging.root'は' logging.Logger'ではなく 'logging.RootLogger'クラスです。これらのクラスはほとんど同じように動作しますが、場合によっては異なる動作が発生することがあります。また、タイプチェッカーによっては警告も発生することがあります。 – DarksteelPenguin

1

logger = logging.getLogger() 名前を空のままにすると、ルートロガーが返されます。

logger = logging.getLogger('name') 別のロガーが表示されます。

関連する問題