让你迷糊的Log4python

在日志界,最著名的是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,看截图:
让你迷糊的Log4python
还是希望开源的作者能做好单元测试,既然提供了,还是提供一个更可靠的框架。我对Python也是入门者,如果功力深厚我就好好去研究研究给完善一下。

上一篇:浅析C#/Java程序中字符串操作的性能问题。


下一篇:如何在这个不确定时期通过战略远见来加强战略规划