詳細なPythonのloggingモジュール

使用するのは簡単

#!は/ usr / local / bin / pythonの
# -  *  - コーディング:UTF-8  -  *  - 
インポートのログ

logging.debug( 'デバッグメッセージ')
logging.info( '情報メッセージ')
logging.warn( 'メッセージを警告')
logging.error( 'エラーメッセージ')
logging.critical( '重要なメッセージ') 

出力:

警告:ルート:メッセージを警告
ERROR:ルート:エラーメッセージ
CRITICAL:ルート:重要なメッセージ

デフォルトでは、画面(stdout)に印刷されたロギングモジュールログ、ログレベル警告以下に示すように、ログ形式(すなわち、より高いログレベルの警告情報のみが出力されるログ)。

質問です

ログレベルを設定し、どのレベル?
出力ログを設定するには?例えば、ログファイルに出力?

シンプルな設定

ログレベル

レベル ときに使用します
デバッグ 通常、問題をデバッグする際の詳細な情報は、対象としています
INFO 期待通りに物事が働くことを証明
警告 (このような「フルディスク」など)いくつかの事故や問題が近い将来に起こるであろうがあったことを示しています。ソフトウェアや仕事で
エラー より深刻な問題に、ソフトウェアは、いくつかの機能を実行することはできません
CRITICAL ソフトウェアを実行し続けることができないことを示す深刻なエラー、

コンフィギュレーションコード

#!は/ usr / local / bin / pythonの
# -  *  - コーディング:UTF-8  -  *  - 
インポートのログ

#以下の方法により、簡単な構成ログレベル出力
logging.basicConfig(ファイル名= 'logger.log'、レベル= logging.INFO)

logging.debug( 'デバッグメッセージ')
logging.info( '情報メッセージ')
logging.warn( 'メッセージを警告')
logging.error( 'エラーメッセージ')
logging.critical( '重要なメッセージ')

出力:
標準出力(画面)、任意の情報は表示されませんが、次のようにlogger.logの下に作成された現在の作業ディレクトリは、読み込みことがわかりました。

INFO:ルート:情報メッセージ
警告:ルート:メッセージを警告
ERROR:ルート:エラーメッセージ
CRITICAL:ルート:重要なメッセージ

であるのでレベル= logging.INFOは、ログレベルを設定するので、すべてのログ情報を出力している、INFOです。

問題再び

上記構成により、その情報を構成することができますか?

上記の問題を解決する前に、あなたはさらにいくつかの重要な概念を理解する必要があり、ロガー、ハンドラー、フォーマッタ、フィルター  

いくつかの重要な概念

  • ロガーレコーダ露出インターフェース・アプリケーション・コードを直接使用することができます。
  • ハンドラプロセッサ、適切な宛先に送信される(レコードが生成された)ログレコード。
  • フィルタフィルタは、粒子サイズのよりよい制御を提供し、それは、ログ出力を決定してもよいです。
  • フォーマッタフォーマッタ、出力は、最終的なログのレイアウトを指定します。

ロガーレコーダー

Loggerは、ツリー階層であるLoggerインスタンスは、インターフェイスのデバッグを使用して前に作成する必要があり、情報、警告、エラー、致命的、すなわち、レコードが明示的に作成されていない場合は、デフォルトルートロガーを作成するために、作成され、デフォルトを適用していますログレベル(WARN)、プロセッサ(ログ情報を標準出力に印刷されてくるStreamHandlerは、)ハンドラ、およびフォーマッタフォーマッタ(デフォルトフォーマットは、単純なプログラムの出力を用いて第1のフォーマットです)。
作成方法:ロガー= logging.getLogger(logger_name)

あなたはLoggerインスタンスを作成した後、プロセッサハンドラを増やし、ログレベルを設定するには、次の方法を使用することができます。

  • ERRORにlogger.setLevel(logging.ERROR)#ログレベルのセット、すなわちのみエラーログレベルより大きいまたはログ出力の意志に等しいです
  • logger.addHandler(HANDLER_NAME)#上昇ロガーインスタンスプロセッサ
  • logger.removeHandler(HANDLER_NAME)#ロガーインスタンスプロセッサを削除

ハンドラプロセッサ

プロセッサのハンドラタイプ3一般的に使用される、あり、多くがありStreamHandlerはのFileHandlerNullHandler、詳細にアクセスすることができるPythonのlogging.handlersでは

StreamHandlerのを作成した後、あなたは、フォーマッタフォーマッタを設定するには、次の方法を使用してログレベルを設定するフィルタフィルターを追加または削除することができます。

  • ch.setLevel(logging.WARN)#指定したログレベル、WARNレベルのログは無視されますよりも低く
  • ch.setFormatter(formatter_name)#は、フォーマッタフォーマッタを設定します。
  • ch.addFilter(FILTER_NAME)位の数を増やすことができ、フィルタを追加します
  • ch.removeFilter(FILTER_NAME)#は、フィルタを削除します
StreamHandlerは
作成方法:SH = logging.StreamHandler(ストリーム=なし)
FileHandlerの
创建方法:FH = logging.FileHandler(ファイル名、モード= ''、コード=なし、遅延=偽)
NullHandler

任意のフォーマットや出力せずに、コアに位置NullHandlerクラスloggingパッケージ。
それは本質的に、ライブラリの開発者によって使用される、「何もしない、」ハンドラ、です。

フォーマッタフォーマッタ

%のM:%S.最終規則のセットを使用して、フォーマッタは、ログ情報、構造及びコンテンツ、デフォルトの時間フォーマット%Y-%M-%D%Hオブジェクト

作成方法:フォーマッタ= logging.Formatter(FMT =なし、datefmt =なし)

ここで、FMTは、フォーマット文字列メッセージ、datefmt日付文字列です。'%(メッセージ)s' を使用して、FMTを指定しない場合。あなたがdatefmtを指定しない場合、我々はISO8601日期格式を使用します。

フィルターフィルター

ハンドラとロガーフィルタは、濾過のレベルよりも複雑行うために使用することができます。フィルターの基本クラスの特定のロガーレベル以下のイベントのみが許可されています。たとえば、初期化フィルター「A.Bは、」ロガー「A.B」、イベント「ABC」、「ABCD」、logger'A.BB、のような「ABD」のレコードが「」BAB「を可能にし、動作しませんように。空の文字列が初期化されている場合、すべてのイベントが受け入れられています。
作成方法:フィルター= logging.Filter(名= '')

以下は、関連する概念の要約です:

あなたはこれらの概念に精通しているしたら、別の重要なことがあることが明らかでなければならないがあり Loggerは階層ツリー構造で
ロガーは、つまりロガーとハンドラまたはFitler多くの関係、一つ以上のハンドラとフィルタを含むことができ;
A Loggerインスタンスは、複数のハンドラ、ハンドラは、1つまたは複数のフィルタを追加することができ、およびログレベルが継承するフォーマッタを複数追加することができます。

ロギングワークフロー

  • 最初のインポート機能モジュールをロギングまたは再ロードモジュールロギングに再導入、モジュールのコードが実行されるログ、プロセスは、ロギング・システムのデフォルト設定をロギング生成します。
  • カスタム設定(オプション)。dictConfig、fileConfig、聞く:ロギングモジュールは、3つの標準構成をサポートしています。fileConfigはファイルで構成され;ここで、dictConfigロガーはフォーマッター、ハンドラー、フィルター、辞書で構成されているとlistenデータを受信することにより、ネットワークを構成するには、リスニングポートネットワークです。もちろん、集団構成上記に加えて、だけでなく、直接明示的コードで構成されたような方法でオブジェクトロガー、ハンドラを呼び出すことができます。
  • グローバルスコープのgetLogger機能(すなわち、その引数は、オブジェクトインスタンスロガーの名前を表す文字列であり、すなわち、名前によって対応するオブジェクトインスタンスロガーを得た)ロギングモジュールLoggerオブジェクトのインスタンスを取得するために使用されます。
  • 使用Loggerオブジェクトのデバッグ、情報、エラー、警告、重要なログ情報など。

ロギングプロセス・フロー・モジュール

  • Loggerオブジェクトのレベルよりもログレベルより高いかどうかを判断し、もしそうならば、次いで、そうでなければ処理を終了ダウン実行します。
  • ログを生成します。存在する場合は、例外があるかどうかを決定する最初のステップは、例外メッセージを追加します。第二ステップ、ロギング処理方法プレースホルダに(例えば、デバッグ、情報、等)、即ち、一般的な文字列フォーマット処理。
  • ロガーオブジェクトのフィルタフィルタを使用するために登録。複数のフィルタがある場合、フィルタは連続であり、長い偽フィルタ、フィルタ端、および廃棄があるようにログ情報が処理されず、処理はこの目的のためにも流れるように。そうでない場合、プロセスフローはダウン進みます。
  • それはハンドラに対処するために、よりハンドラ、ログ情報の一つを見つけた場合、または、任意のハンドラを見つけることができない場合、それを見つけるために親ロガーLoggerオブジェクトにアップしている、現在のLoggerオブジェクトハンドラを検索します。しかし、ハンドラは、最初にランクする各処理工程でのログ情報は、ログ情報は、ハンドラのレベルよりも大きいか否かを判断し、YESの場合、ダウンを行う(オブジェクトによってロガーハンドラオブジェクトに入る)、そうでない場合、プロセスフローは終了します。
  • 执行Handler对象中的filter方法,该方法会依次执行注册到该Handler对象中的Filter。如果有一个Filter判断该日志信息为假,则此后的所有Filter都不再执行,而直接将该日志信息丢弃,处理流程结束。
  • 使用Formatter类格式化最终的输出结果。 注:Formatter同上述第2步的字符串格式化不同,它会添加额外的信息,比如日志产生的时间,产生日志的源代码所在的源文件的路径等等。
  • 真正地输出日志信息(到网络,文件,终端,邮件等)。至于输出到哪个目的地,由Handler的种类来决定。

日志配置

  • 显式创建记录器Logger、处理器Handler和格式化器Formatter,并进行相关设置;
  • 通过简单方式进行配置,使用basicConfig()函数直接进行配置;
  • 通过配置文件进行配置,使用fileConfig()函数读取配置文件;
  • 通过配置字典进行配置,使用dictConfig()函数读取配置信息;
  • 通过网络进行配置,使用listen()函数进行网络配置。

basicConfig关键字参数

关键字 描述
filename 创建一个FileHandler,使用指定的文件名,而不是使用StreamHandler
filemode 如果指明了文件名,指明打开文件的模式(如果没有指明filemode,默认为'a')
format handler使用指明的格式化字符串
datefmt 使用指明的日期/时间格式
level 指明根logger的级别
stream 使用指明的流来初始化StreamHandler。该参数与'filename'不兼容,如果两个都有,'stream'被忽略

有用的format格式

格式 描述
%(levelno)s 打印日志级别的数值
%(levelname)s 打印日志级别名称
%(pathname)s 打印当前执行程序的路径
%(filename)s 打印当前执行程序名称
%(funcName)s 打印日志的当前函数
%(lineno)d 打印日志的当前行号
%(asctime)s 打印日志的时间
%(thread)d 打印线程id
%(threadName)s 打印线程名称
%(process)d 打印进程ID
%(message)s 打印日志信息

有用的datefmt格式

参考time.strftime

配置示例

# -*- encoding:utf-8 -*-
import logging

# create logger
logger_name = "example"
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)

# create file handler
log_path = "./log.log"
fh = logging.FileHandler(log_path)
fh.setLevel(logging.WARN)

# create formatter
fmt = "%(asctime)-15s %(levelname)s %(filename)s %(lineno)d %(process)d %(message)s"
datefmt = "%a %d %b %Y %H:%M:%S"
formatter = logging.Formatter(fmt, datefmt)

# add handler and formatter to logger
fh.setFormatter(formatter)
logger.addHandler(fh)

# print log info
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')```

##### 文件配置
配置文件logging.conf如下:
```[loggers]
keys=root,example01

[logger_root]
level=DEBUG
handlers=hand01,hand02

[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0

[handlers]
keys=hand01,hand02

[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)

[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('log.log', 'a')

[formatters]
keys=form01,form02

[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s```

使用程序logger.py如下:
```#!/usr/bin/python
# -*- encoding:utf-8 -*-
import logging
import logging.config

logging.config.fileConfig("./logging.conf")

# create logger
logger_name = "example"
logger = logging.getLogger(logger_name)

logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')```

##### 字典配置
有兴趣的童靴可以使用```logging.config.dictConfig(config)```编写一个示例程序发给我,以提供给我进行完善本文。

##### 监听配置
有兴趣的童靴可以使用```logging.config.listen(port=DEFAULT_LOGGING_CONFIG_PORT)```编写一个示例程序发给我,以提供给我进行完善本文。

更多详细内容参考[logging.config日志配置](http://python.usyiyi.cn/python_278/library/logging.config.html#module-logging.config)

### 参考资料
* [英文Python logging HOWTO](https://docs.python.org/2/howto/logging.html#logging-basic-tutorial)
* [中文Python 日志 HOWTO](http://python.usyiyi.cn/python_278/howto/logging.html#logging-basic-tutorial)
* [Python日志系统Logging](http://www.52ij.com/jishu/666.html)
* [logging模块学习笔记:basicConfig配置文件](http://www.cnblogs.com/bjdxy/archive/2013/04/12/3016820.html)
* 其他一些前辈博客相关文章

参考文档:https://www.jianshu.com/p/feb86c06c4f4  

  

  

  

  

  

  

  

  

  

  

おすすめ

転載: www.cnblogs.com/hester/p/12085047.html