解决Pythonlogging模块无法正常输出日志的问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解决Pythonlogging模块⽆法正常输出⽇志的问题废话少说,先上代码
File:logger.conf
[formatters]
keys=default
[formatter_default]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
class=logging.Formatter
[handlers]
keys=console, error_file
[handler_console]
class=logging.StreamHandler
formatter=default
args=tuple()
[handler_error_file]
class=logging.FileHandler
level=INFO
formatter=default
args=("logger.log", "a")
[loggers]
keys=root
[logger_root]
level=DEBUG
formatter=default
handlers=console,error_file
File:logger.py
#!/bin/env python
import logging
from logging.config import logging
class Test(object):
"""docstring for Test"""
def __init__(self):
logging.config.fileConfig("logger.conf")
self.logger = logging.getLogger(__name__)
def test_func(self):
self.logger.error('test_func function')
class Worker(object):
"""docstring for Worker"""
def __init__(self):
logging.config.fileConfig("logger.conf")
self.logger = logging.getLogger(__name__)
data_logger = logging.getLogger('data')
handler = logging.FileHandler('./data.log')
fmt = logging.Formatter('%(asctime)s|%(message)s')
handler.setFormatter(fmt)
data_logger.addHandler(handler)
data_logger.setLevel(logging.DEBUG)
self.data_logger = data_logger
def test_logger(self):
self.data_logger.error("test_logger function")
instance = Test()
self.data_logger.error("test_logger output")
instance.test_func()
def main():
worker = Worker()
worker.test_logger()
if __name__ == '__main__':
main()
问题⼀:测试过程中,只能打印出test_logger function⼀条语句
问题⼆:明明只在data_logger中打印出语句,但是logger的⽇志中也出现了相关的⽇志。
问题⼀解决⽅案:
利⽤python -m pdb logger.py 语句对脚本进⾏调试发现,在执⾏instance = Test()语句后,通过print '\n'.join(['%s:%s' % item for item in self.data_logger.__dict__.items()])调试语句看到data_logger的disable属性值由0变成了True,此时logger的对应属性也发⽣了相同的变化。
这种变化导致了logger对象停⽌记录⽇志。
参考python logging模块的相关⼿册发现
“The function takes a default parameter, disable_existing_loggers, which defaults to True for reasons of backward compatibility. This may or may not be what you want, since it will cause any loggers existing before the call to be disabled unless they (or an ancestor) are explicitly named in the configuration.”
的说明,即调⽤fileconfig()函数会将之前存在的所有logger禁⽤。
在python 2.7版本该fileConfig()函数添加了⼀个参数,logging.config.fileConfig(fname, defaults=None,
disable_existing_loggers=True),可以显式的将disable_existing_loggers设置为FALSE来避免将原有的logger禁⽤。
将上述代码中的Test类中的logging.config.fileConfig函数改成logging.config.fileConfig("./logger.conf",
disable_existing_loggers=0)就可以解决问题。
不过该代码中由于位于同⼀程序内,可以直接⽤logging.getLogger(LOGGOR_NAME)函数引⽤同⼀个logger,不⽤再调⽤logging.config.fileConfig函数重新加载⼀遍了。
问题⼆解决⽅案:
logger对象有个属性propagate,如果这个属性为True,就会将要输出的信息推送给该logger的所有上级logger,这些上级logger所对应的handlers就会把接收到的信息打印到关联的⽇志中。
logger.conf配置⽂件中配置了相关的root logger的属性,这个root logger就是默认的logger⽇志。
修改后的如下:
File:logger.conf
[formatters]
keys=default, data
[formatter_default]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
class=logging.Formatter
[formatter_data]
format=%(asctime)s|%(message)s
class=logging.Formatter
[handlers]
keys=console, error_file, data_file
[handler_console]
class=logging.StreamHandler
formatter=default
args=tuple()
[handler_error_file]
class=logging.FileHandler
level=INFO
formatter=default
args=("logger.log", "a")
[handler_data_file]
class=logging.FileHandler
level=INFO
formatter=data
args=("data_new.log", "a")
[loggers]
keys=root, data
[logger_root]
level=DEBUG
handlers=console,error_file
[logger_data]
level=DEBUG
handlers=data_file
qualname=data
propagate=0
File:logger.py
#!/bin/env python
import logging
from logging.config import logging
class Test(object):
"""docstring for Test"""
def __init__(self):
self.logger = logging.getLogger(__name__)
def test_func(self):
self.logger.error('test_func function')
class Worker(object):
"""docstring for Worker"""
def __init__(self):
logging.config.fileConfig("logger.conf")
self.logger = logging.getLogger(__name__)
self.data_logger = logging.getLogger('data')
def test_logger(self):
self.data_logger.error("test_logger function")
instance = Test()
self.data_logger.error("test_logger output")
instance.test_func()
def main():
worker = Worker()
worker.test_logger()
if __name__ == '__main__':
main()
以上这篇解决Python logging模块⽆法正常输出⽇志的问题就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。