一 前言
本篇内容是logging日志配置基础篇,学完本篇,读者将会理解日志,使用日志,自定义配置日志;
公众号:知识追寻者
知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)
二 日志
2.1 日志级别
日志级别从高到低顺序(50-10) :critical --> error --> warning --> info --> debug ;
日志级别越高,打印信息越少;
- debug 最详细的日志信息,经常用于开发调试 阶段
- info 打印关键信息;
- warning 警告信息,提示产生不期望的异常信息
- error 错误信息,异常信息;
- critical 严重错误信息,会导致程序无法运行;
2.2 日志函数
日志模块函数如下
- logging.debug(msg, *args, kwargs) debug级别日志
- logging.info(msg, *args, kwargs) info级别日志
- logging.warning(msg, *args, kwargs) warning级别日志
- logging.error(msg, *args, **kwargs) error级别日志
- logging.critical(msg, *args, kwargs) critical级别日志
- logging.log(level, *args, **kwargs) 指定级别日志
- logging.basicConfig(**kwargs) 一次性配置日志
常用参数如下
- filename 输出文件日志
- filemode 文件模式, r , a , w
- format 日志输出的格式
- datefat 默认日期格式
- level 设置日志输出级别
format大体参数如下
- %(levelno)s 打印日志级别的数值
- %(levelname)s 打印日志级别名称
- %(pathname)s 打印当前执行程序的路径
- %(filename)s 打印当前执行程序名称
- %(funcName)s 打印日志的当前函数
- %(lineno)d 打印日志的当前行号
- %(asctime)s 打印日志的时间
- %(thread)d 打印线程 ID
- %(threadName)s 打印线程名称
- %(process)d 打印进程 ID
- %(message)s 打印日志信息
- %(module)s:打印模块名称
简单日志示例如下,无法满足生产需求,最终还是需要自定义日志;
import logging
logging.basicConfig(filename="test.log", filemode="w", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%d-%m-%Y %H:%M:%S", level=logging.DEBUG)
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
输出至test.log文件内容
29-04-2020 17:34:44 root:DEBUG:debug message
29-04-2020 17:34:44 root:INFO:info message
29-04-2020 17:34:44 root:WARNING:warning message
29-04-2020 17:34:44 root:ERROR:error message
29-04-2020 17:34:44 root:CRITICAL:critical message
2.3 自定义Logger
logger组件如下
- 日志器 (Logger) 配置和发送日志消息;
- 处理器( Handler ) 日志的输出地方;一个日志器可以拥有多个处理器;
- 过滤器 (Filter) 过滤筛选日志,是否丢弃日志;
- 格式器( Formatter) 日志的输出格式
常用的 Handler
- logging.StreamHandler:日志输出到流,如sys.stderr,sys.stdout 或者文件;
- logging.FileHandler:日志输出到文件。
- logging.handlers.TimeRotatingHandler:在一定时间区域内回滚日志文件。
- logging.handlers.SMTPHandler;远程输出日志到邮件地址。
- logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets。
- logging.handlers.HTTPHandler;通过”GET”或者”POST”远程输出到HTTP服务器。
示例如下
import logging
import sys
# 取名为 zszsz 的日志器
logger = logging.getLogger("zszsz")
logger.setLevel(level=logging.DEBUG)
# 设置日志格式
formatter = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt="%d-%m-%Y %H:%M:%S")
""" 处理器1 """
# 输出到控制台
stream_handler = logging.StreamHandler(sys.stdout)
# 设置日志级别
stream_handler.setLevel(level=logging.DEBUG)
# 添加日志格式
stream_handler.setFormatter(formatter)
# 添加处理器
logger.addHandler(stream_handler)
""" 处理器2 """
# 输出到文件
file_handler = logging.FileHandler('zszsz.log')
# 设置日志级别
file_handler.setLevel(level=logging.INFO)
# 添加日志格式
file_handler.setFormatter(formatter)
# 添加处理器
logger.addHandler(file_handler)
# 日志
logger.debug('-------------知识追寻者!!!')
logger.info('-------------info级别!!!')
控制台输出
07-05-2020 10:59:27 - zszsz - DEBUG - -------------知识追寻者!!!
07-05-2020 10:59:27 - zszsz - INFO - -------------info级别!!!
文件输出
07-05-2020 10:59:27 - zszsz - INFO - -------------info级别!!!
2.4 日志配置
logging.conf 配置示例如下,根据自定义Logger的逻辑进行配置理解;
[loggers]
keys=root,simpleExample
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
调用示例
# -*- encoding:utf-8 -*-
import logging
from logging import config
# 获取配置
config.fileConfig(fname='logging.conf', disable_existing_loggers=False)
logger = logging.getLogger('simpleExample')
logger.debug('debug message')
logger.info('info message')
logger.error('error message')
logger.critical('critical message')
输出
2020-05-07 13:28:26,391 - simpleExample - DEBUG - debug message
2020-05-07 13:28:26,391 - simpleExample - INFO - info message
2020-05-07 13:28:26,391 - simpleExample - ERROR - error message
2020-05-07 13:28:26,391 - simpleExample - CRITICAL - critical message
更多内容参考官网
https://docs.python.org/3.3/howto/logging.html#configuring-logging