ホームページ  >  記事  >  バックエンド開発  >  Python でのロギングモジュールの分析 (コード例)

Python でのロギングモジュールの分析 (コード例)

不言
不言転載
2018-11-26 16:29:332491ブラウズ

この記事の内容はPythonのロギングモジュールの解析(コード例)ですので、ある程度参考になる内容ですので、困っている方は参考にしていただければ幸いです。

#1. ログ レベル

  1. #debug: 優先度 10、デバッグの詳細を記録し、デバッグ中にのみ有効になります

  2. info: 優先度 20、通常のメッセージをログに記録し、エラーと警告を報告して待機します。

  3. 警告: 優先度 30、関連する警告情報が記録されます。

  4. #エラー: 優先度 40、エラー情報を記録、プログラム クラッシュ
  5. #クリティカル: 優先度 50、エラー情報を記録
  6. 設定されていない場合、デフォルトは iwarning

    #2. ロギング モジュールの主な構造
#ロギングのソース コードを見ると、次のものが存在することがわかります。関数を実装するための 4 つの主要なクラス:

Loggers: 関連する構成設定など、プログラムで直接使用するためのインターフェイスを提供します。

  1. Handlers: 送信Logger によって生成されたログを指定された場所に保存し、ログの保存場所を設定します;

  2. フィルター: 出力ログをフィルターします;

  3. フォーマッター:ログの出力形式を制御する

  4. Formatters

Formatters オブジェクトはログの出力形式を定義し、さまざまなオプションのパラメーターを持ちます。

#パラメータ

意味##%(name)sロガーの名前%(levellno)s数値形式のログ レベル%(levelname)s テキスト形式のログ レベル%(pathname)sログ出力関数を呼び出すモジュールのフル パス名には、## が含まれていない場合があります。 #%(filename)s%(module)s ##%(funcName)sログ出力関数を呼び出す関数名%(lineno)dログ出力関数を呼び出すステートメントが配置されているコード行 %(created)fUNIX 表記で表現された現在時刻 時刻の浮動小数点表現 ログ情報を出力する場合、出力されてからのミリ秒数ロガーが作成されました文字列形式の現在時刻。デフォルトの形式は「2018-11-22 16:49:45,896」です。 、その後のカンマはミリ秒ですスレッド ID、使用できない可能性がありますスレッド名、使用できない可能性がありますプロセス ID、## によって出力される情報がない可能性があります#%(メッセージ)s

例:

import logging

#fmt:定义输出的日志信息的格式
#datefmt:定义时间信息的格式,默认为:%Y-%m-%d %H:%M:%S
#style:定义格式化输出的占位符,默认是%(name)格式,可选{}或$格式
formatter=logging.Formatter(fmt='%(asctime)s    %(levelname)s:  %(message)s'
                            ,datefmt='%Y-%m-%d %H:%M:%S',style='%')

ハンドラー ログ プロセッサ

ログ プロセッサは、ログがファイルに出力されるか、ログに出力されるかに関係なく、ログの特定のフロー方向を処理するために使用されます。標準出力など。出力形式を制御するフォーマッタを設定し、ログをフィルタリングするフィルタを追加します。

#一般的に使用されるプロセッサは 2 つあります

  1. StreamHandler: コンソールにログを出力するために使用されます

  2. FileHandler: ログをログ ファイルに出力するために使用されます

その他のプロセッサ

ログ出力関数を呼び出すモジュールのファイル名
ログ出力関数を呼び出すモジュール名
##%(relativeCreated)d
%(asctime)s
%(thread)d
%( threadName)s
%(process)d
名前詳細な場所説明##RotatingHandlerTimeRotatingHandlerSocketHandlerDatagramHandlerSMTPHandlerSysLogHandlerNTEventLogHandlerMemoryHandlerHTTPHandler##
from logging import Handler

#所有日志处理器的父类
handler=Handler()

print('处理日志的等级:',handler.level)
print('处理日志的名字:',handler.name)
print('处理器的日志过滤器::',handler.filters)
print('日志的格式::',handler.filters)

#一些常用方法:
handler.get_name()
handler.set_name('')
handler.createLock()#创建线程锁
handler.acquire()#获取线程锁
handler.release()#释放线程锁
handler.setLevel('info') #设置日志处理器的记录级别
handler.setFormatter(fmt='')#设置日志的输出格式
handler.addFilter('')#往处理器中添加过滤器
handler.removeFilter('')#往处理器中移除过滤器
handler.emit('')#日志记录的处理逻辑,由子类实现
Logger ログ オブジェクト
logging.handlers.RotatingHandler ログのロールバック メソッド、ログ ファイルの最大数とログ ファイルのロールバックをサポートします
logging.handlers.TimeRotatingHandler ログ ロールバック メソッド、次の範囲内でログ ファイルをロールバックします特定の時間範囲
logging.handlers.SocketHandler TCP/IPソケットにログをリモート出力
logging.handlers.DatagramHandler UDP ソケットへのリモート出力ログ
logging.handlers .SMTPHandler 電子メール アドレスにログをリモート出力
logging.handlers.SysLogHandler syslog にログ出力
logging.handlers.NTEventLogHandler Windows NT/2000/xp のイベント ログへのリモート出力
logging.handlers.MemoryHandler ログはメモリ内の指定されたバッファに出力されます
logging.handlers.HTTPHandler 「GET」または「POST」による HTTP サーバーへのリモート出力

Logger はすべてのロギング方法を管理します。

from logging import error, debug, warning, info, fatal, critical, getLogger

#返回一个Logger实例
#以'root'为名字的日志对象在Logger对象中只有一个实例
logger=getLogger('root')

print('获取根日志对象',logger.root)
print('获取manager',logger.manager)
print('获取根日志对象的名字',logger.name)
print('获取根日志对象记录水平',logger.level)
print('获取根日志对象过滤器列表',logger.filters)
print('获取根日志对象处理器列表',logger.handlers)
print('获取根日志对象',logger.disabled)

#设置日志记录水平
logger.setLevel('info')

#输出日志信息,格式化输出
logger.info('this is %s','info',exc_info=1)
#记录warning信息
logger.warning('')
#记录error信息
logger.error('')
#等价于logger.error('',exc_info=1)
logger.exception('')
#记录debug信息
logger.debug('')
#记录critical信息
logger.critical('')
#直接指定级别
logger.log('info','')

#添加处理器
logger.addHandler()
#移除处理器
logger.removeHandler()
#判是否有处理器
logger.hasHandlers()

3. ロガーの基本的な使用法

例:

import logging
import sys

def my_get_logger(appname):
    #获取logger实例,如果参数为空则返回root logger
    logger=logging.getLogger(appname)
    #创建日志输出格式
    formatter=logging.Formatter('%(asctime)s    %(levelname)s:  %(message)s')

    #指定输出的文件路径
    file_handler=logging.FileHandler('test.log')
    # 设置文件处理器,加载处理器格式
    file_handler.setFormatter(formatter)

    #控制台日志
    console_handler=logging.StreamHandler(sys.stdout)
    console_handler.formatter=formatter

    #为logger添加的日志处理器
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    #指定日志的最低输出级别,默认为warn级别
    logger.setLevel(logging.INFO)
    return logger

if __name__ == '__main__':
    logger=my_get_logger('test')
    logger.debug('this is debug info')
    logger.info('this is information')
    logger.warning('this is warning message')
    logger.error('this is error message')
    logger.fatal('this is fatal message,it is same ad logger.critical')
    logger.critical('this is critical message')
結果:

2018-11-22 16:31:34,023 INFO: this is information
2018-11-22 16:31:34,023 WARNING: this is warning message
2018-11-22 16:31:34,023 ERROR: this is error message
2018-11-22 16:31:34,024 CRITICAL: this is fatal message,it is same ad logger.critical
2018-11-22 16:31:34,024 CRITICAL: this is critical message

4. ロガーのログ記録の論理呼び出しプロセス

logger.debug およびその他のメソッドを呼び出してログを記録します。
  1. まず、ログ レベルがこのレコードは設定されたレベルを超えています。そうでない場合は、直接渡して実行しません。
  2. ログ情報をパラメータとして使用して、LogRecord ログ オブジェクトを作成します。
  3. LogRecord オブジェクトをロガー フィルターでフィルターします。フィルターされている場合は、渡します。
  4. ログ レコード オブジェクトは、ハンドラー プロセッサのフィルターによってフィルターされます
  5. 判定 このレコードのログ レベルは、ハンドラー プロセッサによって設定されたレベルより大きいですか? そうでない場合は、直接渡して実行しません。
  6. 最後に呼び出します。ログ レコードを処理するためのプロセッサの出力メソッド;
  7. 5. ロガーの設定

コードによる設定の完了主に getLogger メソッドを使用しますが、変更は簡単ではありません
  1. basicConfig メソッドによって実現されます。高速ではありますが、十分な階層構造ではありません
  2. logging.config.fileConfig(filepath) を通じて、ファイル設定を行います
  3. py3.2 バージョンで導入された新しい設定方法である dictConfig の辞書を通じて設定します
  4. ファイル構成を使用する

#logging.cong

[loggers]
#定义日志的对象名称是什么,注意必须定义root,否则报错
keys=root,main

[handlers]
#定义处理器的名字是什么,可以有多个,用逗号隔开
keys=consoleHandler

[formatters]
#定义输出格式对象的名字,可以有多个,用逗号隔开
keys=simpleFormatter

[logger_root]
#配置root对象的日志记录级别和使用的处理器
level=INFO
handlers=consoleHandler

[logger_main]
#配置main对象的日志记录级别和使用的处理器,qualname值得就是日志对象的名字
level=INFO
handlers=consoleHandler
qualname=main
#logger对象把日志传递给所有相关的handler的时候,会逐级向上寻找这个logger和它所有的父logger的全部handler,
#propagate=1表示会继续向上搜寻;
#propagate=0表示停止搜寻,这个参数涉及重复打印的坑。
propagate=0

[handler_consoleHandler]
#配置处理器consoleHandler
class=StreamHandler
level=WARNING
formatter=simpleFormatter
args=(sys,)

[formatter_simpleFormatter]
#配置输出格式过滤器simpleFormatter
format=%(asctime)-%(name)s-%(levelname)s-%(message)s
注: ロガーとハンドラーの両方でログ レベルを設定でき、ログ出力が最高レベルになることがわかります。 辞書フォーム構成を使用する

辞書フォーム構成は、より強力かつ柔軟です。 dictConfig 関数を使用すると、他の形式の構成ファイルを json、YAML などの辞書に変換できます。

例:

import yaml
from logging.config import dictConfig
import os
filename=os.path.dirname(os.path.abspath(__file__))
with  open(filename+'/logging.yaml','r') as f:
    log=yaml.load(f.read())
    dictConfig(log)
#logging.yaml
#注意:yaml格式严格,:后面一定要带空格
version: 1
formatters:
    simple:
          format: '%(asctime)s-%(name)s-%(levelname)s-%(message)s'
handlers:
    console:
          class: logging.StreamHandler
          level: DEBUG
          formatter: simple
          stream: ext://sys.stdout
    console_err:
          class: logging.StreamHandler
          level: DEBUG
          formatter: simple
          stream: ext://sys.stderr
loggers:
    simpleExample:
          level: DEBUG
          handlers: [console]
          propagate: no
root:
    level: DEBUG
    handlers: [console_err]]

6. ロガー設定の変更をリッスンする

logging.config.listen(port) 関数を使用すると、英語のプログラムが新しいロガーをリッスンできるようになります。ソケット アプリケーションを再起動せずに実行時に構成を変更するという目的を達成するための構成情報。ああ、

以上がPython でのロギングモジュールの分析 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。