import logging logger = logging.getLogger(__name__) handler = logging.StreamHandler() logger.setLevel(logging.DEBUG) # 定义格式器,添加到处理器中 fmt = '%(asctime)s , %(levelname)s , %(filename)s %(funcName)s line %(lineno)s , %(message)s' datefmt = '%Y-%m-%d %H:%M:%S %a' log_fmt = logging.Formatter(fmt=fmt, datefmt=datefmt) handler.setFormatter(log_fmt) logger.addHandler(handler) logger.debug('debug msg') logger.info('info msg')
控制台输出如下:
2019-03-29 19:36:03 Fri , DEBUG , log_test2.py <module> line 14 , debug msg
2019-03-29 19:36:03 Fri , INFO , log_test2.py <module> line 15 , info msg
(4)过滤器:Filter
在我们已经知道的logging使用方法中,都是通过日志级别来控制日志是否输出,Filter能够实现更加强大的过滤功能,控制日志输出。自定义的过滤器中必须覆写filter方法,当filter的返回值判断为True则允许输出,反之不允许输出。例如过滤包含敏感信息的日志,过滤器定义如下:
import logging class CountryFilter(logging.Filter): def filter(self,record): return "America" not in record.getMessage() logger = logging.getLogger() handler = logging.StreamHandler() logger.addHandler(handler) logger.setLevel(logging.DEBUG) logger.addFilter(CountryFilter()) logger.critical('I love America') logger.debug('I love China')
输出结果:
I love China
可以看到,虽然第一条日志记录的日志等级更高,但是因为包含了过滤器中包含的敏感信息,所以不被允许输出。
4 logging奇淫巧技 4.1 记录异常信息:捕获traceback如果在日志中,只是记录发生了异常,那其实作用不大,如果traceback也记录到日志中,那就完美了。强大的logging确实也提供了这一功能,而且使用也很简单:
import logging logger = logging.getLogger(__name__) handler = logging.FileHandler('./.log',encoding='utf-8') logger.setLevel(logging.DEBUG) # 定义格式器,添加到处理器中 fmt = '%(asctime)s , %(levelname)s , %(filename)s %(funcName)s line %(lineno)s , %(message)s' datefmt = '%Y-%m-%d %H:%M:%S %a' log_fmt = logging.Formatter(fmt=fmt, datefmt=datefmt) handler.setFormatter(log_fmt) logger.addHandler(handler) try: logger.info('Running …') 1/0 except Exception as e: logger.error('Exception occurs!',exc_info = True) # logger.exception(e) # 与上面这行效果一样
运行后,文件.log会被写入以下内容:
2019-03-29 19:53:14 Fri , INFO , log_test2.py <module> line 15 , Running …
2019-03-29 19:53:14 Fri , ERROR , log_test2.py <module> line 18 , Exception occurs!
Traceback (most recent call last):
File "E:/myCode/test1/log_test2.py", line 16, in <module>
1/0
ZeroDivisionError: division by zero
4.2 多模块共享日志