Python开发之日志记录模块:logging(6)

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 多模块共享日志

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d642fc980407ebf79378f34feecfa099.html