Python ロギング モジュールの例と改善点

高洛峰
リリース: 2017-02-14 13:46:51
オリジナル
1582 人が閲覧しました

多くのアプリケーションにはログ モジュールがあり、システムの動作中にいくつかの重要な情報を記録し、システムの動作ステータスの追跡を容易にするために使用されます。 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(&#39;test_func function&#39;)
 
class Worker(object):
  """docstring for Worker"""
  def __init__(self):
    logging.config.fileConfig("logger.conf")
    self.logger = logging.getLogger(__name__)
 
    data_logger = logging.getLogger(&#39;data&#39;)
    handler = logging.FileHandler(&#39;./data.log&#39;)
    fmt = logging.Formatter(&#39;%(asctime)s|%(message)s&#39;)
    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__ == &#39;__main__&#39;:
  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(&#39;test_func function&#39;)
 
class Worker(object):
  """docstring for Worker"""
  def __init__(self):
    logging.config.fileConfig("logger.conf")
    self.logger = logging.getLogger(__name__)
    self.data_logger = logging.getLogger(&#39;data&#39;)
 
  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__ == &#39;__main__&#39;:
  main()
ログイン後にコピー

その他の Python ロギング モジュールの例と改善に関する関連記事については、お支払いください。 PHP中国語ネットに注目!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!