ホームページ  >  記事  >  バックエンド開発  >  Python のロギング組み込みモジュールの使用方法の詳細な説明

Python のロギング組み込みモジュールの使用方法の詳細な説明

WBOY
WBOYオリジナル
2016-08-04 08:55:501056ブラウズ

ロギングモジュールの紹介

Python のログ モジュールは、サードパーティのモジュールまたはアプリケーションで使用できる一般的なログ システムを提供します。このモジュールはさまざまなログ レベルを提供し、ファイル、HTTP GET/POST、SMTP、ソケットなどのさまざまな方法でログを記録できます。特定のログ記録メソッドを自分で実装することもできます。
ロギング モジュールと log4j のメカニズムは同じですが、具体的な実装の詳細は異なります。このモジュールは、ロガー、ハンドラー、フィルター、およびフォーマッタを提供します。

  • logger: アプリケーション コードで使用するログ インターフェイスを提供します。ロガーの最も一般的に使用される操作は、構成とログ メッセージの送信という 2 つのカテゴリに分類されます。ロガー オブジェクトは、logging.getLogger(name) を通じて取得できます。名前が指定されていない場合、同じ名前の getLogger メソッドを複数回呼び出すと、同じロガー オブジェクトが返されます。
  • ハンドラー: ログレコードをファイル、ソケットなどの適切な宛先に送信します。ロガー オブジェクトは、addHandler メソッドを通じて複数のハンドラーに 0 を追加でき、各ハンドラーは異なるログ レベルを定義して、階層的なフィルタリングとログの表示を実現できます。
  • フィルター: ログ レコードがハンドラーに送信されるかどうかを決定するエレガントな方法を提供します。
  • フォーマッタ: ログ出力の特定の形式を指定します。フォーマッタのコンストラクタには、メッセージのフォーマット文字列と日付文字列の 2 つのパラメータが必要です。どちらもオプションです。

log4j と同様に、ロガー、ハンドラー、およびログ メッセージの呼び出しには、ログ メッセージのレベルがロガーおよびハンドラーのレベルより大きい場合にのみ、特定のログ レベル (レベル) を設定できます。

ロギング使用状況分析

1. logger =logging.getLogger("endlesscode") を初期化します。後続のログ形式の %(name)s は、ここでのモジュール名に対応します。
2. レベル logger.setLevel(logging.DEBUG) を設定します。 ログには、設定されたレベルを超えるログが記録されます。 3. ハンドラー、一般的に使用されるものは StreamHandler と FileHandler です。Windows では、1 つはコンソールとファイル ログ、1 つは CMD ウィンドウに出力され、もう 1 つはファイルに記録されると理解できます
。 4. 最終的なログ情報の順序、構造、内容を定義するフォーマッタ。私はこの形式 '[%(asctime)s] [%(levelname)s] %(message)s', '%Y- を使用するのが好きです。 %m -%d %H:%M:%S'、
%(name)s ロガーの名前
%(levelname)s のテキスト形式のログレベル
%(message)s ユーザーが出力したメッセージ
%(asctime)s 文字列としての現在時刻。デフォルトの形式は「2003-07-08 16:49:45,896」です。カンマの後に来るのはミリ秒です
%(levelno)s 数値形式のログレベル
%(pathname)s ログ出力関数を呼び出すモジュールのフルパス名には
が含まれていない可能性があります %(filename)sはログ出力関数を呼び出すモジュールのファイル名です
%(module)s ログ出力関数を呼び出すモジュールの名前
%(funcName)sはログ出力関数を呼び出す関数名です
%(lineno)d は、ログ出力関数を呼び出すステートメントが配置されているコード行です
%(created)f 現在の時刻。時刻を表す UNIX 標準浮動小数点数で表されます
%(relativeCreated)d ログ情報を出力する場合、ロガーが作成されてからのミリ秒数
%(thread)d スレッド ID。おそらくそうではありません
%(threadName)s スレッド名。おそらくそうではありません
%(process)d プロセス ID。おそらくそうではありません
5. 記録 object.debug(message) を使用してログを記録します
以下に例を書いてみましょう。CMD ウィンドウでは、エラーとそれ以上のレベルのログのみが出力されますが、デバッグとそれ以上のレベルの情報はログに出力されます

リーリー
実行すると、CMD ウィンドウには 2 つのログのみが記録され、spam.log には 5 つのログが記録されていることがわかります


2016712145241018.jpg (773×353)

プロジェクトが比較的大きく、ログが別のファイルで使用されている場合は、それをクラスにカプセル化して使用することを検討できます

リーリー
この方法では、オブジェクトを使用するたびにインスタンスを作成するだけで済みます

リーリー
CMD ウィンドウでエラー ログを赤、警告ログを黄色でマークしたい場合は、ctypes モジュールを使用できます


2016712145318276.jpg (732×225)

リーリー

複数のモジュールでロギングを使用する
ロギング モジュールは、同じ Python インタープリター内で、logging.getLogger('log_name') を複数回呼び出すと、複数のモジュールの場合でも同じロガー インスタンスを返すことを保証します。したがって、マルチモジュール シナリオでロギングを使用する一般的な方法は、メイン モジュールでロギングを構成し、この構成が複数のサブモジュールに影響を及ぼし、他のモジュールで getLogger を介して Logger オブジェクトを直接取得することです。
プロフィール:

リーリー
メインモジュールmain.py:

リーリー
サブモジュール mod.py:

リーリー
サブサブモジュール submod.py:

import logging 
 
logger = logging.getLogger('main.mod.submod') 
logger.info('logger of submod say something...') 
 
def tst(): 
  logger.info('this is submod.tst()...') 

然后运行python main.py,控制台输出:

2012-03-09 18:22:22,793 - root - DEBUG - test root logger... 
2012-03-09 18:22:22,793 - main - INFO - test main logger 
2012-03-09 18:22:22,809 - main - INFO - start import module 'mod'... 
2012-03-09 18:22:22,809 - main.mod.submod - INFO - logger of submod say something... 
2012-03-09 18:22:22,809 - main.mod - INFO - logger say something... 
2012-03-09 18:22:22,809 - main - DEBUG - let's test mod.testLogger() 
2012-03-09 18:22:22,825 - main.mod - DEBUG - this is mod.testLogger... 
2012-03-09 18:22:22,825 - main.mod.submod - INFO - this is submod.tst()... 
2012-03-09 18:22:22,841 - root - INFO - finish test... 

可以看出,和预想的一样,然后在看一下tst.log,logger配置中的输出的目的地:

2012-03-09 18:22:22,793 - main - INFO - test main logger 
2012-03-09 18:22:22,809 - main - INFO - start import module 'mod'... 
2012-03-09 18:22:22,809 - main.mod.submod - INFO - logger of submod say something... 
2012-03-09 18:22:22,809 - main.mod - INFO - logger say something... 
2012-03-09 18:22:22,809 - main - DEBUG - let's test mod.testLogger() 
2012-03-09 18:22:22,825 - main.mod - DEBUG - this is mod.testLogger... 
2012-03-09 18:22:22,825 - main.mod.submod - INFO - this is submod.tst()... 

tst.log中没有root logger输出的信息,因为logging.conf中配置了只有main logger及其子logger使用RotatingFileHandler,而root logger是输出到标准输出。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。