- 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()
, which defaults to
- disable_existing_loggers
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() 函数添加了一个参数,
- True
- logging.config.
(, , ),可以显式的将设置为 FALSE 来避免将原有的 logger 禁用。将上述代码中的 Test 类中的
- fileConfig
- logging.config.
logging.getLogger(LOGGOR_NAME) 函数引用同一个 logger,不用再调用 logging.config.fileConfig 函数重新加载一遍了。问题二解决方案:logger 对象有个属性 propagate,如果这个属性为 True,就会将要输出的信息推送给该 logger 的所有上级 logger,这些上级 logger 所对应的 handlers 就会把接收到的信息打印到关联的日志中。logger.conf 配置文件中配置了相关的 root logger 的属性,这个 root logger 就是默认的 logger 日志。修改后的如下:
- fileConfig函数改成logging.config.fileConfig("./logger.conf", disable_existing_loggers=0)就可以解决问题。 不过该代码中由于位于同一程序内,可以直接用
- 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()
来源: