使用Python的logging.config
Python的logging模块接口仿log4j,概念上一致,使用上相当方便。
利用logging.config.fileConfig(),可以将日志的配置用文件来描述,简化了日志的初始化。
例程:
#
test.py
import
logging
import
logging.config
logging.config.fileConfig(
"
logging.conf
"
)
#
create logger
logger
=
logging.getLogger(
"
example
"
)
#
"application" code
logger.debug(
"
debug message
"
)
logger.info(
"
info message
"
)
logger.warn(
"
warn message
"
)
logger.error(
"
error message
"
)
logger.critical(
"
critical message
"
)
logHello
=
logging.getLogger(
"
hello
"
)
logHello.info(
"
Hello world!
"
)
配置文件示例如下:
# logging.conf
[
loggers
]
keys =
root
,
example
[
handlers
]
keys =
consoleHandler
,
rotateFileHandler
[
formatters
]
keys =
simpleFormatter
[
formatter_simpleFormatter
]
format =
[
%(asctime)s
]
(%(levelname)s)%(name)s : %(message)s
[
logger_root
]
level =
DEBUG
handlers =
consoleHandler
,
rotateFileHandler
[
logger_example
]
level =
DEBUG
handlers =
consoleHandler
,
rotateFileHandler
qualname =
example
propagate =
0
[
handler_consoleHandler
]
class =
StreamHandler
level =
DEBUG
formatter =
simpleFormatter
args =
(sys.stdout
,
)
[
handler_rotateFileHandler
]
class =
handlers.RotatingFileHandler
level =
DEBUG
formatter =
simpleFormatter
args =
('test.log'
,
'a'
,
200000
,
9
)
注意,RotatingFileHandler中doRollover()会因为rename()出错而中途退出,造成日志文件没有打开,并且后继的日志消息都因为日志文件没有打开而失败。可以自己在rename()处加上try,或者不用RotatingFileHandler。估计隔一段时间就fileConfig()一次也是可以恢复正常。
详见: Python logging RotatingFileHandler bug
该错误仅当日志文件满时切换文件时才可能发生,当文件被锁定时才会出错。正常使用不会有问题,并且日志出错不会影响主程序的运行。所以可以放心使用,想再可靠点就直接在源码中加个try.