Python日志实践

2021-01-20 19:40:08 浏览数 (1)

日志对于系统开发的开发、调试和运行整个过程中都起着很重要的作用,调试阶段需要查看日志来明确问题所在,运行阶段如果程序崩溃,日志可以记录程序崩溃的相关原因。 而且有时候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
代码语言:javascript复制
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 格式化器,指明了最终输出中日志的格式。
  • 配置示例代码
代码语言:javascript复制
# -*- 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")

实例

  • 异常信息
代码语言:javascript复制
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 用法和参数详解

0 人点赞