ホームページ  >  記事  >  バックエンド開発  >  Pythonロギングモジュールのロギング

Pythonロギングモジュールのロギング

高洛峰
高洛峰オリジナル
2017-02-22 09:23:141101ブラウズ

モジュールレベルの関数

logging.getLogger([name]): ロガーオブジェクトを返します。名前が指定されていない場合は、ルートロガーが返されます

logging.debug()、logging.info()、logging.warning ()、logging.error()、logging.critical(): ルート ロガーのログ レベルを設定します

logging.basicConfig(): デフォルトのフォーマッタを使用してロギング システムの StreamHandler を作成し、基本構成を設定して追加しますルートロガーに送信します

Logger

logging .getLogger([name])

名前が指定されていない場合は、ルートロガーを返します。

すべてのプログラムは、情報を出力する前にロガーを取得する必要があります。ロガーは通常、プログラムのモジュール名に対応します。たとえば、チャット ツールのグラフィカル インターフェイス モジュールは次のようにロガーを取得できます:

LOG=logging.getLogger("chat.gui")

そして、コア モジュールは次のように取得できます。次のように:

LOG=logging .getLogger("chat.kernel")

Logger.setLevel(logging.WARNING): WARNING より低いレベルは無視されます

Logger.addFilter(filt) )、Logger.removeFilter(filt): 指定されたフィルターを追加または削除します

Logger.addHandler(hdlr)、Logger.removeHandler(hdlr): 指定されたハンドラーを追加または削除します

Handlers

handlerオブジェクトが担当します関連情報を指定された宛先に送信します。ファイル、画面、ネットワーク、ソケットなどを指定できます。

Handler.setLevel(lel): 処理する情報のレベルを指定します。 lel レベル未満の情報は無視されます。

Handler.setFormatter(): を選択します。このハンドラーの出力形式

Handler.addFilter(filt)、Handler.removeFilter(filt): フィルターオブジェクトを追加または削除します

ログは画面に出力されます

import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

 

返回:
WARNING:root:This is warning message

打印到屏幕

デフォルトでは、logging はログを画面に出力します

ログ レベルとサイズの関係は次のとおりです。もちろん、ログ レベルを自分で定義することもできます。

ログ出力のフォーマット


logging.basicConfig関数パラメータ:
filename: ログファイル名を指定します
filemode: file関数と同じ意味で、ログファイルを開くモード、'w'または'a'を指定します

format : 出力の形式と内容を指定します。形式は、上の例に示すように、多くの有用な情報を出力できます。

import logging

logging.basicConfig(level=logging.DEBUG,
                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='myapp.log',
                filemode='w')
    
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

 

./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

修改输出格式
ログ形式変数

%(levelno)s: 打印日志级别的数值
 %(levelname)s: 打印日志级别名称
 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 %(filename)s: 打印当前执行程序名
 %(funcName)s: 打印日志的当前函数
 %(lineno)d: 打印日志的当前行号
 %(asctime)s: 打印日志的时间
 %(thread)d: 打印线程ID
 %(threadName)s: 打印线程名称
 %(process)d: 打印进程ID
 %(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

日志格式
ロギングメソッド

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件

日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器

logging方法
StreamHandler と FileHandler は一般的に使用されるログ処理メソッドであるため、 , これらは直接loggingモジュールに含まれていますが、他のメソッドはlogging.handlersモジュールに含まれています

プログラム内でログモジュールを定義

import logging
# create logger
def logger(log_type):
logger = logging.getLogger(log_type) # 创建Logger对象,类型是'TEST-LOG'
logger.setLevel(logging.WARNING) # 设置最低的日志级别,此级别覆盖ch and fh的级别
# 创建输出到控制台处理程序,并设置级别为DEBUG
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 控制输出到屏幕的级别
# 创建输出到文件的处理程序,并设置级别
fh = logging.FileHandler("access.log")
fh.setLevel(logging.WARNING)
# 创建日志格式
formatter_Stream = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
formatter_File = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch and fh
ch.setFormatter(formatter_Stream)
fh.setFormatter(formatter_File)
# add ch and fh to logger
logger.addHandler(ch)
logger.addHandler(fh)
return logger
eee = logger('EEE')
rrr = logger('RRR')
rrr.debug('debug message')
rrr.info('info message')
rrr.warning('warn message')
eee.error('error message')
eee.critical('critical message')

代码
画面表示内容

RRR - INFO - 情報メッセージ

RRR - WARNING -警告メッセージ

EEE - エラー - エラーメッセージ

EEE - クリティカル - クリティカルメッセージ

ファイルの内容


2017-02-21 21:35:05,700 - RRR - 警告 - 警告メッセージ

2017-02- 21 21:35:05,700 - EEE - ERROR - エラー メッセージ


2017-02-21 21:35:05,700 - EEE - CRITICAL - クリティカル メッセージ


Filter


呼び出し時のパラメータの形式logging.getLogger() は「A.B.C」に似ています。この形式はフィルターを構成するために使用されます。フィルタを追加すると、ログは出力前にフィルタによって処理されます。フィルタ「AAA.BBB」では、名前が「AAA.BBB」で始まるロガーのみが情報を出力できます。フィルターが拒否した場合、ログは出力されません

import logging
def logger(log_type):
logger = logging.getLogger(log_type) # 创建Logger对象,类型是'TEST-LOG'
logger.setLevel(logging.DEBUG) # 此级别覆盖ch and fh的级别
# 创建输出到控制台处理程序,并设置级别为DEBUG
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 控制输出到屏幕的级别
 
# 设置过滤器
filter = logging.Filter('AAA.BBB.CCC')
ch.addFilter(filter)
formatter_Stream = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter_Stream)
logger.addHandler(ch) # ch加入logger
return logger
eee = logger('AAA.BBB.CCC')
rrr = logger('AAA.BBB.DDD')
rrr.error('debug message')
rrr.error('info message')
eee.error('critical message')
eee.error('critical message')

代码

ログをカット

サイズでカット

import logging
from logging import handlers
# create logger
def logger(log_type):
logger = logging.getLogger(log_type)
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler("access.log")
fh.setLevel(logging.WARNING)
# 按时间切割日志文件
fh = handlers.TimedRotatingFileHandler(filename='access.log', when='s', interval=10 )
formatter_File = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter_File)
logger.addHandler(fh)
return logger
rrr = logger('AAA.BBB.DDD')
rrr.error('debug message')
rrr.error('info message')
rrr.error('warn message')

代码
interval:時間間隔

when:時間単位S秒M分H時間D日W毎週(間隔==0 時間 月曜日) 毎朝午前 0 時を表します


ルートロガーとロガーの親子関係について

ルートロガーについては、これまで何度も触れてきましたが、実は、ロガー インスタンス間の親子関係。ルート ロガーは最上位のロガーであり、すべてのロガーの祖先です。以下に示すように: ロガー インスタンスを作成せず、logging.debug()、logging.info()、logging.warning()、logging.error()、およびlogging.criticalを直接呼び出す場合、ルート ロガーがデフォルトのロガーになります。 () 関数を使用する場合は、ロガーはルート ロガーであり、自動的に作成でき、単一インスタンスでもあります。


ルート ロガーを取得する方法。logging.getLogger() またはlogging.getLogger("") を通じてルート ロガー インスタンスを取得します。
levelroot ロガーのデフォルトのレベルは、logging です。警告
親子関係を表現する方法。ロガー名の命名方法により、ロガー間の親子関係を示すことができます。例:parent_logger =logging.getLogger('foo)。 ')child_logger =logging.getLogger( 'foo.bar')
有効レベルとは Loggerには有効レベルという概念があります。 ロガーが明示的にレベルを設定しない場合、親のレベルが使用されます。父親がレベルを明示的に設定しない場合は、父親の父親のレベルが使用され、以下同様です...最終的にルート ロガーに到達すると、レベルが設定されているはずです。デフォルトは、logging.WARNING です。子ロガーがメッセージを取得すると、そのメッセージをそのハンドラーに配布して処理するだけでなく、処理のためにすべての祖先ロガーにも渡します

Python ログ モジュールのロギング関連記事については、こちらをご覧ください。 PHP 中国語 Web サイトに注意してください。

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