翻译原文:http://docs.python.org/2/library/logging.config.html
配置文件的格式是由fileConfig()函数负责解析的,这个函数基于ConfigParser.
该文件中必须包含一下几段: [loggers]
, [handlers]
和 [formatters]
,用来标识文件定义的几种类型的实体.对每个这样的实体,都有一个特定的段来标识这个实体是如何配置的.比如说, [loggers]
段里面定义了一个叫log01的logger,那么关于这个logger的详细配置信息应该写在 [logger_loger01]
里面.同样的,如果 [handlers]
里面定义了一个名为hand01的handler ,那么它的详细配置信息应该放在 [handler_hand01]
里面,而 [formatters]
里面定义的form01就应该用一个名为 [formatter_form01]
的段来定义它的详细信息.对root logger来说,他的定义信息则必须放在名为 [logger_root]
的端中.
下面是一个关于配置文件中这几个段的一个示例::
[loggers]
keys=root,log02,log03,log04,log05,log06,log07
[handlers]
keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
[formatters]
keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
root logger必须包含一个标识logging等级的level和一个包含handlers的列表.下面给出一个root logger的示例 ::
[logger_root]
level=NOTSET
handlers=hand01
level可以是 DEBUG
, INFO
, WARNING
, ERROR
, CRITICAL
或 NOTSET
中的一个. NOTSET
标识用在root logger时,也只有用在root logger时,表示所有的信息都会被记录.Level变量会在logging包命名空间的上下文中被赋值.
handlers项可以接受一个由逗号分隔的handler名字列表,这些个handler的名字必须出现在 [handlers]
段中,而且配置文件中还需要有相关的详细描述这些handler的字段.
对于除root logger外的loggers 来说,有一些额外的信息需要提供.下面是一个这方面的例子::
[logger_parser]
level=DEBUG
handlers=hand01
propagate=1
qualname=compiler.parser
level和handlers项跟root logger的完全一样,如果一个非root logger的level项定义为 NOTSET
,系统会根据该logger的继承关系向上寻找一个有效的level值来作为该logger的level值. propagete
项如果为1,则表示该logger必须处理它继承的父类logger的log信息;如果为0则不必. qualname
项表示logger的分层结构的通道名,应用程序中就是用这个名字来获得这个logger的.
下面是一个定义handler的示例::
[handler_hand01]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stdout,)
class
项定义了handlers的类(通过eval()函数在logging包的命名空间中实例化).level项被用做logger的logging等级信息, NOTSET
表示记录所有的log信息.
formatter
项定义用于该handler的formatter,如果为空则用默认的formatter(logging._defaultFormatter).如果不为空,那么相应的formatter名字也应该出现在 [formatters]
段中,并且应该有相应的定义段.
args
项中定义的是用于handler类实例化时传给构造函数的参数.查阅相应的handler的构造函数,或者参考以下示例来看一下典型的配置项::
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form02
args=('python.log', 'w')
[handler_hand03]
class=handlers.SocketHandler
level=INFO
formatter=form03
args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
[handler_hand04]
class=handlers.DatagramHandler
level=WARN
formatter=form04
[handler_hand05]
class=handlers.SysLogHandler
level=ERROR
formatter=form05
args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
[handler_hand06]
class=handlers.NTEventLogHandler
level=CRITICAL
formatter=form06
args=('Python Application', '', 'Application')
[handler_hand07]
class=handlers.SMTPHandler
level=WARN
formatter=form07
args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject')
[handler_hand08]
class=handlers.MemoryHandler
level=NOTSET
formatter=form08
target=
args=(10, ERROR)
[handler_hand09]
class=handlers.HTTPHandler
level=NOTSET
formatter=form09
args=('localhost:9022', '/log', 'GET')
formatter
项用到的formatter定义如下::
[formatter_form01]
format=F1 %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter
format
项定义了整个的格式字符串, datefmt
项可以接受跟strftime()函数兼容的时间/日期格式字符串.如果为空,则默认用ISO8601格式的日期/时间格式,ISO8601格式也定义了微秒,可以用一个逗号隔开添加到上面的格式字符串之后,ISO8601格式的一个示例是 2003-01-23 00:29:50,411.
class
项是可选的,它指出了 formatter
的类名(模块名和类名通过点来分隔),这个选项在需要一个Formatter子类时很有用,Formatter的子类可以通过一种可伸缩的格式来展现更多的异常信息.
注解:笔者的一个完整的例子可见如下(ptailfile的源码):
[loggers]
keys=root, tailfile, tt2-client
[handlers]
keys=consoleHandler, fileHandler
[formatters]
keys=richFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_tailfile]
level=DEBUG
qualname=tailfile
handlers=fileHandler
[logger_tt2-client]
level=DEBUG
qualname=tt2-client
handlers=fileHandler
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=richFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=richFormatter
args=('../log/ptailfile.log', 'D', 1, 0)
[formatter_richFormatter]
format=%(asctime)s - %(name)s - %(module)s -%(threadName)s- %(levelname)s - %(message)s
class=logging.Formatter