日志对于系统开发的开发、调试和运行整个过程中都起着很重要的作用,调试阶段需要查看日志来明确问题所在,运行阶段如果程序崩溃,日志可以记录程序崩溃的相关原因。 而且有时候python脚本的作用是返回文本给调用方,此时更加需要把返回值和用于调试跟踪的日志区分。 本文介绍了python常用用法。
logging提供了两种日志配置方式,简单日志(logging.basicConfig和标准的流式处理框架
简单日志
logging.basicConfig配置日志,一般支持标准输出和文件(不能同时配置)
代码语言:javascript复制# -*- coding:utf-8 -*-
import logging
import sys
# 日志输出到文件tenmao.log,级别是INFO,同时配置日志格式和日期时间格式
#logging.basicConfig(level=logging.INFO,
# format='%(asctime)s %(filename)s %(levelname)s %(message)s',
# datefmt='%a %d %b %Y %H:%M:%S',
# filename='tenmao.log',
# filemode='a')
# 日志输出到标准错误sys.stderr(默认是标准输出sys.stdout),filename和stream是互斥的,不可以同时配置
logging.basicConfig(level=logging.DEBUG, stream=sys.stderr,
format='%(asctime)s %(filename)s[line:%(lineno)d]%(levelname)s %(message)s')
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')
- 输出的日志内容: tenmao.log
Sat 16 Jan 2021 22:45:28 simple_log.py INFO This is info message
Sat 16 Jan 2021 22:45:28 simple_log.py WARNING This is warning message
Sat 16 Jan 2021 22:45:28 simple_log.py ERROR This is error message
Sat 16 Jan 2021 22:45:28 simple_log.py CRITICAL This is critical message
标准配置: 流式处理
logging模块包括Logger,Handler,Filter,Formatter四个部分。
Logger 记录器
,用于设置日志采集。Handler 处理器
,将日志记录发送至合适的路径。Filter 过滤器
,提供了更好的粒度控制,它可以决定输出哪些日志记录。Formatter 格式化器
,指明了最终输出中日志的格式。- 配置示例代码
# -*- coding:utf-8 -*-
import logging
# 第一步,创建日志记录器
# 1,创建一个日志记录器logger
logger = logging.getLogger()
# 2,设置日志记录器的日志级别,这里的日志级别是日志记录器能记录到的最低级别,区别于后面Handler里setLevel的日志级别
logger.setLevel(logging.DEBUG)
# 第二步,创建日志处理器Handler。这里创建一个Handler,用于将日志写入文件
# 3,创建一个Handler,用于写入日志文件,日志文件的路径自行定义
logFile = './log.txt'
fh = logging.FileHandler(logFile, mode='a', encoding='utf-8')
# 4,设置保存至文件的日志等级
fh.setLevel(logging.INFO)
# 第三步,定义Handler的输出格式
# 5,日志输出格式定义如下
format= logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
# 6,设置 写入日志文件的Handler 的日志格式
fh.setFormatter(format)
# 第四步,将Handler添加至日志记录器logger里
logger.addHandler(fh)
# 同样的,创建一个Handler用于控制台输出日志
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(format)
logger.addHandler(ch)
# 输出日志
logger.info("This is info message")
logger.warning("This is warning message")
logger.error("This is error message")
logger.critical("This is critical message")
实例
- 异常信息
try:
raise Exception("hello error")
except Exception as e:
logger.error("登录错误,原因为:{}".format(e))
logger.error("登录错误,stack trace", exc_info=True)
else:
logger.info("登陆成功...")
exc_info=True就可以输出异常栈
输出内容如下
代码语言:javascript复制2021-01-16 23:01:42,203 mylog.py[line:35] INFO This is info message
2021-01-16 23:01:42,203 mylog.py[line:36] WARNING This is warning message
2021-01-16 23:01:42,204 mylog.py[line:37] ERROR This is error message
2021-01-16 23:01:42,204 mylog.py[line:38] CRITICAL This is critical message
2021-01-16 23:01:42,204 mylog.py[line:43] ERROR 登录错误,原因为:hello error
2021-01-16 23:01:42,204 mylog.py[line:44] ERROR 登录错误,stack trace
Traceback (most recent call last):
File "mylog.py", line 41, in <module>
raise Exception("hello error")
Exception: hello error
参考
- Python日志采集(详细)
- Python日志最佳实践
- Python logging 模块之 logging.basicConfig 用法和参数详解