多くのアプリケーションにはログ モジュールがあり、システムの動作中にいくつかの重要な情報を記録し、システムの動作ステータスの追跡を容易にするために使用されます。 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中国語ネットに注目!