ロギングモジュールの紹介
Python のログ モジュールは、サードパーティのモジュールまたはアプリケーションで使用できる一般的なログ システムを提供します。このモジュールはさまざまなログ レベルを提供し、ファイル、HTTP GET/POST、SMTP、ソケットなどのさまざまな方法でログを記録できます。特定のログ記録メソッドを自分で実装することもできます。
ロギング モジュールと log4j のメカニズムは同じですが、具体的な実装の詳細は異なります。このモジュールは、ロガー、ハンドラー、フィルター、およびフォーマッタを提供します。
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 ウィンドウでは、エラーとそれ以上のレベルのログのみが出力されますが、デバッグとそれ以上のレベルの情報はログに出力されます
プロジェクトが比較的大きく、ログが別のファイルで使用されている場合は、それをクラスにカプセル化して使用することを検討できます
リーリー
リーリー
リーリー
複数のモジュールでロギングを使用する
ロギング モジュールは、同じ Python インタープリター内で、logging.getLogger('log_name') を複数回呼び出すと、複数のモジュールの場合でも同じロガー インスタンスを返すことを保証します。したがって、マルチモジュール シナリオでロギングを使用する一般的な方法は、メイン モジュールでロギングを構成し、この構成が複数のサブモジュールに影響を及ぼし、他のモジュールで getLogger を介して Logger オブジェクトを直接取得することです。
プロフィール:
リーリー
リーリー
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是输出到标准输出。