在日志界,最著名的是Log4J(Java日志框架),很多开发语言都基于Log4j实现了自己的日志框架,如.net下的Log4net,PHP的Log4PHP(都是Apache软件基金会的Logging下的开源项目)。Python除了系统自带的logging模块外,也有基于Log4j的框架实现,名曰Log4Python(https://pypi.org/project/log4python/),但是要使用此库,按照官方的Example你或许会迷糊半天。
首先,虽然此框架2019年更新到了0.2.31版本,但还是仅支持Python2.x版本,对Python3.x版本还不支持。如果要在3版本下使用,你可能还需要做些修改才行。
其次,此框架还需要flumelogger的支持。所以需要一并安装。
第三,按照官方的Example,你应该是运行不成功的。官方的Example如下:
from log4p import log
TestLog = log(__name__)
TestLog.debug("Debug Log")
TestLog.info("Info Log")
按照官方说明,会输出如下信息:
2015-01-20 16:18:47,692 DEBUG [Thread-3] data.LogInsert (LogInsert.py:172) - Debug Log
2015-01-20 16:18:47,692 DEBUG [Thread-3] data.LogInsert (LogInsert.py:173) - Info Log
但其实你可能会发现提示你的是找不到log4p模块。
参照框架下的TestLog.py才发现,第一句导入就是错误的,正确的应该是:
from log4python.Log4python import log
TestLog = log(__name__)
TestLog.debug("Debug Log")
TestLog.info("Info Log")
真不知道软件的作者是怎么想的,太不负责任了。
即使这样,但你仍然无法输出日志,得到的消息是没有handlers.
No handlers could be found for logger "__main__"
再按照官方的文档使用配置文件log4p.py(官方的这个配置文件还有点小错误),我直接贴出我修改后的:
config = {
'monitorInterval': 10,
'loggers': {
'LogThread': {
'level': "DEBUG",
'additivity': False,
'AppenderRef': ['A1']
},
'root': {
# 'level' : "CRITICAL",
'level': "ERROR",
'AppenderRef': ['output_root']
},
'__main__':{
'level': "DEBUG",
'additivity': False,
'AppenderRef': ['console']
}
},
'appenders': {
'output_root': {
'type': "file",
'FileName': "root_error.log",
'backup_count': 5,
'file_size_limit': 1024 * 1024 * 20,
'PatternLayout': "[level:%(levelname)s-file:%(filename)s-lineno:%(lineno)d] %(asctime)s %(message)s"
},
'A1': {
'type': "file",
'FileName': "A2.log",
'PatternLayout': "[level:%(levelname)s-file:%(filename)s-lineno:%(lineno)d] %(asctime)s %(message)s"
},
'flumeTest': {
'type': "FLUME",
'host': "192.168.10.120",
'port': 44444,
'headers': {'application': 'Skyline.Analyzer'},
'PatternLayout': "[PID:%(process)d-level:%(levelname)s-file:%(filename)s-lineno:%(lineno)d] %(asctime)s %(message)s"
},
'console': {
'type': "console",
'target': "console",
#'PatternLayout': "[%(levelname)s] %(asctime)s %(message)s",
'PatternLayout': "[PID:%(process)d-level:%(levelname)s-file:%(filename)s-lineno:%(lineno)d] %(asctime)s %(message)s"
}
}
}
这个配置文件倒是和Log4j的差不太多。
到这个时候日志基本上可以输出了。但控制台的输出也很莫名其妙,有时候还重复,有时第一条Debug会报找不到Handler,看截图:
还是希望开源的作者能做好单元测试,既然提供了,还是提供一个更可靠的框架。我对Python也是入门者,如果功力深厚我就好好去研究研究给完善一下。