Python ロギング モジュールの例と改善点
多くのアプリケーションにはログ モジュールがあり、システムの動作中にいくつかの重要な情報を記録し、システムの動作ステータスの追跡を容易にするために使用されます。 Python では、シンプルで使いやすく強力なロギング モジュールであるロギングがすでに提供されているため、サードパーティのロギング コンポーネントは必要ありません。
Pythonはオブジェクトのすべての属性値を出力します:
def prn_obj(obj): print '\n'.join(['%s:%s' % item for item in obj.__dict__.items()])
Pythonロガーオブジェクトの属性(上記の関数で取得)
name:get_data parent:<logging.RootLogger instance at 0x1d8bd88> handlers:[<logging.FileHandler instance at 0x21bcc68>] level:10 disabled:1 #当前的logger是否有效,默认为0 manager:<logging.Manager instance at 0x1d8bea8> propagate:0 #是否将本级日志 filters:[]
一部のログは出力できません
ファイル: logger .conf
[formatters] keys=default [formatter_default] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s class=logging.Formatter [handlers] keys=console, error_file [handler_console] class=logging.StreamHandler formatter=default args=tuple() [handler_error_file] class=logging.FileHandler level=INFO formatter=default args=("logger.log", "a") [loggers] keys=root [logger_root] level=DEBUG formatter=default handlers=console,error_file
ファイル: logger.py
#!/bin/env python import logging from logging.config import logging class Test(object): """docstring for Test""" def __init__(self): logging.config.fileConfig("logger.conf") self.logger = logging.getLogger(__name__) def test_func(self): self.logger.error('test_func function') class Worker(object): """docstring for Worker""" def __init__(self): logging.config.fileConfig("logger.conf") self.logger = logging.getLogger(__name__) data_logger = logging.getLogger('data') handler = logging.FileHandler('./data.log') fmt = logging.Formatter('%(asctime)s|%(message)s') handler.setFormatter(fmt) data_logger.addHandler(handler) data_logger.setLevel(logging.DEBUG) self.data_logger = data_logger def test_logger(self): self.data_logger.error("test_logger function") instance = Test() self.data_logger.error("test_logger output") instance.test_func() def main(): worker = Worker() worker.test_logger() if __name__ == '__main__': main()
質問 1: テスト中、test_logger 関数のステートメントは 1 つだけ出力できます
質問 2: ステートメントのみが出力されることは明らかですは data_logger に出力されますが、ロガー関連ログもログに表示されます。
問題 1 の解決策:
python -m pdb logger.py ステートメントを使用してスクリプトをデバッグし、instance = Test() ステートメントの実行後に print 'n'.join(['%s:%s ' % item for item in self.data_logger.__dict__.items()]) デバッグ ステートメントは、data_logger の disable 属性値が 0 から True に変更されたことを示しています。この時点で、logger の対応する属性も同じ変更を受けています。 。この変更により、ロガー オブジェクトはログ記録を停止します。 Python ロギング モジュールの関連マニュアルを参照すると、「fileConfig() 関数はデフォルト パラメータ disable_existing_loggers を取り、下位互換性の理由からデフォルトは True になります。これは、希望するものである場合とそうでない場合があります。設定内で明示的に名前が付けられていない限り、fileConfig() 呼び出しの前に存在するロガーはすべて無効になります。」つまり、fileconfig() 関数を呼び出すと、以前に存在していたすべてのロガーが無効になります。 Python 2.7 バージョンでは、fileConfig() 関数によりパラメーター logg.config.fileConfig(fname,defaults=None, disable_existing_loggers=True) が追加され、元のロガーの無効化を避けるために disable_existing_loggers を明示的に FALSE に設定できます。上記のコードの Test クラスのlogging.config.fileConfig 関数をlogging.config.fileConfig("./logger.conf", disable_existing_loggers=0) に変更すると、問題を解決できます。 ただし、このコードは同じプログラム内にあるため、logging.config.fileConfig 関数を呼び出してリロードしなくても、logging.getLogger(LOGGOR_NAME) 関数を直接使用して同じロガーを参照できます。
問題 2 の解決策:
ロガー オブジェクトには propagate 属性があります。この属性が True の場合、出力される情報はロガーのすべての上位ロガーにプッシュされ、これらの上位ロガーに対応するハンドラーが受信します。情報は関連するログに出力されます。関連するルート ロガー属性は、logger.conf 構成ファイルで構成されます。このルート ロガーは、デフォルトのロガー ログです。
変更されたものは次のとおりです:
ファイル: logger.conf
[formatters] keys=default, data [formatter_default] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s class=logging.Formatter [formatter_data] format=%(asctime)s|%(message)s class=logging.Formatter [handlers] keys=console, error_file, data_file [handler_console] class=logging.StreamHandler formatter=default args=tuple() [handler_error_file] class=logging.FileHandler level=INFO formatter=default args=("logger.log", "a") [handler_data_file] class=logging.FileHandler level=INFO formatter=data args=("data_new.log", "a") [loggers] keys=root, data [logger_root] level=DEBUG handlers=console,error_file [logger_data] level=DEBUG handlers=data_file qualname=data propagate=0
ファイル: logger.py
#!/bin/env python import logging from logging.config import logging class Test(object): """docstring for Test""" def __init__(self): self.logger = logging.getLogger(__name__) def test_func(self): self.logger.error('test_func function') class Worker(object): """docstring for Worker""" def __init__(self): logging.config.fileConfig("logger.conf") self.logger = logging.getLogger(__name__) self.data_logger = logging.getLogger('data') def test_logger(self): self.data_logger.error("test_logger function") instance = Test() self.data_logger.error("test_logger output") instance.test_func() def main(): worker = Worker() worker.test_logger() if __name__ == '__main__': main()
その他の Python ロギング モジュールの例と改善に関する関連記事については、お支払いください。 PHP中国語ネットに注目!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

正規表現は、プログラミングにおけるパターンマッチングとテキスト操作のための強力なツールであり、さまざまなアプリケーションにわたるテキスト処理の効率を高めます。

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...
