让你迷糊的Log4python

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在日志界,最著名的是Log4J(Java日志框架),很多开发语言都基于Log4j实现了自己的日志框架,如.net下的Log4net,PHP的Log4PHP(都是Apache软件基金会的Logging下的开源项目)。

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
存储 缓存 程序员
Python程序员Debug利器,和Print说再见
Python程序员Debug利器,和Print说再见
47 2
|
6月前
|
存储 IDE 开发工具
【python原理】Python 3里面print为什么改成函数?为什么会有个奇怪的“...”对象?为什么推荐蛇形命名法?等常见问题
【python原理】Python 3里面print为什么改成函数?为什么会有个奇怪的“...”对象?为什么推荐蛇形命名法?等常见问题
84 0
|
3月前
|
XML 前端开发 数据格式
三分钟搞定 Python XPath 语法
XPath(XML Path Language)是一种用于在 XML 文档中查找信息的语言。它基于树状结构的 XML 文档,可以通过路径表达式来选取节点或节点集。也常常用来解析 HTML。 如果你是一个前端,对用路径获取元素可能陌生又熟悉。陌生是很多的路径,熟悉的路径上又有熟悉的属性和方法。下面我们就来探究一下 XPath 的魅力。
|
1月前
|
安全 Java 编译器
关于 Python 3.13 你所需要知道的几点
关于 Python 3.13 你所需要知道的几点
94 14
关于 Python 3.13 你所需要知道的几点
|
4月前
|
SQL 存储 算法
一些使用python过程中的小贴士
摘要: 在Python中,`type`是一个特殊类型,既是类型也是对象。`isinstance()`函数表明`type`和`object`都是类型并且是彼此的基类。`all()`和`any()`函数分别检查可迭代对象的所有元素是否都为真或至少有一个元素为真。链式操作如`==`和`in`具有相同的优先级,从左到右结合,可能导致意外的结果,例如`False == False in [False]`实际上是`True`,因为`False in [False]`先计算并返回`True`,然后与`False == True`比较。
|
6月前
|
数据采集 XML 程序员
最新用Python做垃圾分类_python垃圾分类代码用key和format,5年经验Python程序员面试27天
最新用Python做垃圾分类_python垃圾分类代码用key和format,5年经验Python程序员面试27天
最新用Python做垃圾分类_python垃圾分类代码用key和format,5年经验Python程序员面试27天
|
6月前
|
存储 Java 程序员
【Python】7. 基础语法(5) -- 文件+库+习题篇
【Python】7. 基础语法(5) -- 文件+库+习题篇
64 2
|
11月前
|
Ruby Python
Python(二十八)python 获取异常信息
在实际的开发工作中,我们光知道异常类型是不够的,我们还需要看到更详细的报错信息。 那么,我们应该如何看到报错信息呢? Python中为我们提供了两个可以查看标错信息的库,sys 模块中的 exc_info,traceback 模块 这是我们第一次使用python的模块 在文件中使用python的模块,需要引入才可以使用。 一:使用 sys 模块中的 exc_info 方法: 1:exc_info() 方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为 type、value 和 traceback,它们的含义分别是: type:异常类型的名称,python异常类型请参照
71 1
|
Java Python
【Python】1_Java与Python比较 再探 &&/and Python入门(循环判断if,elif,else,while,for和循环else(for-else)
​ 一、输出 height = 170.5 # 默认本来是几位,就显示几位 print(F"我的身高是{height}cm") # 我的身高是170.5cm # 指定小数位 2位小数 print(F"我的身高是{height:.2f}cm") # 我的身高是170.50cm # 指定小数位 3位小数 print(F"我的身高是{height:.3f}cm") # 我的身高是170.500cm 可以控制小数的位数,与Java不同,Java和c的float都只是单精度浮点数,而在Python中float代表的是小数。通过".2"的形式表示要有两位小数 name = "名之以
191 0
下一篇
无影云桌面