让你迷糊的Log4python

简介: 在日志界,最著名的是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日志并进行多维度分析。
目录
相关文章
|
3月前
|
Python
Python学习 -- 异常捕获技巧
Python学习 -- 异常捕获技巧
20 0
|
4天前
|
Python
求助 当前python 3.12.3 怎么解决
在尝试从`modelscope.pipelines`导入`pipeline`时,遇到了导入错误。问题出在`modelscope.msdatasets.utils.hf_datasets_util`模块尝试从`datasets.utils`导入`_datasets_server`,但该名称未找到,可能应导入的是`_dataset_viewer`。这是Python项目中的一个依赖冲突或库更新问题。
|
1月前
|
程序员 Python
【python基础知识】python怎么查看对象的属性
【python基础知识】python怎么查看对象的属性
19 0
|
4月前
|
Ruby Python
Python(二十八)python 获取异常信息
在实际的开发工作中,我们光知道异常类型是不够的,我们还需要看到更详细的报错信息。 那么,我们应该如何看到报错信息呢? Python中为我们提供了两个可以查看标错信息的库,sys 模块中的 exc_info,traceback 模块 这是我们第一次使用python的模块 在文件中使用python的模块,需要引入才可以使用。 一:使用 sys 模块中的 exc_info 方法: 1:exc_info() 方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为 type、value 和 traceback,它们的含义分别是: type:异常类型的名称,python异常类型请参照
42 1
|
9月前
|
Python
#PY小贴士# 别弄错了 Python 里的这几个运算符
会出现这样问题的同学,多半是之前用过其他的编程语言,所以习惯性地认为 ^ 是表示次方,& 是表示逻辑与(同时满足条件)、| 是表示逻辑或(满足条件之一)。
|
10月前
|
Python
python中的%s %d都是什么意思?
python中的%s %d都是什么意思?
|
存储 IDE 开发工具
Python 为什么会有个奇怪的“...”对象?
... 是 Python 3 中的一个内置常量,它是一个单例对象,虽然是 Python 2 中就有的 Ellipsis 的别称,但它的性质已经跟旧对象分道扬镳 ... 可以替代 pass 语句作为占位符使用,但是它作为一个常量对象,在占位符语义上并不严谨。很多人已经在习惯上接受它了,不妨一用 ... 在 Python 中不少的使用场景,除了占位符用法,还可以支持扩展切片语法、丰富 Type Hint 类型检查,以及表示容器对象的无限循环 ... 对大多数人来说,可能并不多见(有人还可能因为它是一种符号特例而排斥它),但它的存在,有些时候能够带来便利。希望本文能让更多人认识它,那么文章的目的也就
157 0
|
Python
【Python】题集 of ③
道题目是很容易的一道基础题,首先输入数字,我们需要用到输入函数 input(),数字是整形转换成 int,输入偶数可以退出循环这个进行判断,但前提是我们需要给上一层循环,当我们输入偶数的时候为真,则用 break 退出循环,输入奇数也进行判断这里我们不退出循环,他就会再次进
123 0
|
Python
Python 一行代码的神奇之处!!
你们知道今天聊聊关于 Python 一行代码的神奇之处!!!
80 0
|
Java C++ Python
一分钟学Python | 第一个Python程序
一分钟学Python | 第一个Python程序
93 0
一分钟学Python | 第一个Python程序