logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;
2 logging模块使用
2.1 基本使用
首先安装logging第三方模块
pip logging
配置logging基本的设置,然后在控制台输出日志
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
可见,默认情况下python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志, 这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET),
默认的日志格式为: 日志级别:Logger名称:用户输出消息。
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='/tmp/test.log', filemode='w') logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
可见在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有 - filename: 用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。 - - filemode: 文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 - format: 指定handler使用的日志显示格式。 - - datefmt: 指定日期时间格式。 - level: 设置日志级别
2.3 handlers的使用
handler决定了你的日志最终出现的位置, 你的log信息是直接输出到终端(StreamHandler) 还是 保存到 log文件(FileHandler)
典型的日志记录的步骤是这样的:
- 创建logger
- 创建handler(streamhandler与fileHandler)
- 定义formatter
- 给handler添加formatter
- 给logger添加handler
import logging logger = logging.getLogger() logger.setLevel(level = logging.INFO)
#建立一个FileHandler handler = logging.FileHandler("log.txt",encoding='utf8') handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter)
#建立一个streamHandler console = logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(handler) logger.addHandler(console) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")
附录:日志封装文件
#封装日志 def get_log(self): # 创建一个logger logger = logging.getLogger() logger.setLevel(logging.INFO) # 设置日志存放路径,日志文件名 # 获取本地时间,转换为设置的格式 rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) # 通日志存放路 all_log_path = 'Logs/All_Logs/' error_log_path ='Logs/Error_Logs/'# 设置日志文件名 all_log_name = all_log_path + rq + '.log' error_log_name = error_log_path + rq + '.log' # 创建handler # 创建一个handler写入所有日志 fh = logging.FileHandler(all_log_name, encoding='utf8') fh.setLevel(logging.INFO) # 创建一个handler写入错误日志 eh = logging.FileHandler(error_log_name, encoding="utf8") eh.setLevel(logging.ERROR) # 创建一个handler输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.INFO) # 定义日志输出格式 # 以时间-日志器名称-日志级别-日志内容的形式展示 all_log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 以时间-日志器名称-日志级别-文件名-函数行号-错误内容 error_log_formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(module)s - %(lineno)s - %(message)s') # 将定义好的输出形式添加到handler fh.setFormatter(all_log_formatter) ch.setFormatter(all_log_formatter) eh.setFormatter(error_log_formatter) # 给logger添加handler logger.addHandler(fh) logger.addHandler(eh) logger.addHandler(ch) return logger