以一个实际使用例子开始:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import os
import sys
logger = logging.getLogger('log_a') # 获取名称为log_a的日志器,相当于获取一个实例
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler = logging.FileHandler('aaa.log')
file_handler.setFormatter(formatter)
logger.setLevel(logging.DEBUG)
formatter_2 = logging.Formatter('%(pathname)s - %(name)s - %(levelname)s - %(message)s')
file_handler_2 = logging.FileHandler('bbb.log')
file_handler_2.setFormatter(formatter_2)
file_handler_2.setLevel(logging.ERROR) # 如果不设置,默认为warn (这个是logging默认等级)。而不是继承logger.setLevel(),本来就不会继承,这个
# hander 和 上面的logger没任何关系,直到这个hander被加到logger日志器中。就算被加到日志器中,还是默认等级
logger.addHandler(file_handler) # 将hander加入日志器
logger.addHandler(file_handler_2) # 所有的log信息都会同时输出到日志器的hander
logger.debug('0debug message')
logger.info('0info message')
logger.warning('0warning message')
logger.error('0error message')
logger.critical('0critical message')
file_handler_2.setLevel(logging.WARN)
logger.debug('2debug message')
logger.info('2info message')
logger.warning('2warning message')
logger.error('2error message')
logger.critical('2critical message')
实际使用中可以加入异常处理:
# 这个在日志设置失败时,会把信息输出到控制台
except OSError as e:
print(str(e) + ". Using stdout instead.")
stream_handler = logging.StreamHandler(stream=sys.stdout)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
1 logging模块简介
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
2 logging模块使用
2.1 基本使用
配置logging基本的设置,然后在控制台输出日志,
import logging
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
运行时,控制台输出,
2016-10-09 19:11:19,434 - __main__ - INFO - Start print log
201