使用介绍
logging日志模块四大组件:
组件名称 | 对应类名 | 功能描述 |
---|---|---|
日志器 | Logger | 提供了应用程序可一直使用的接口 |
处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
过滤器 | Filter | 提供了日志过滤 |
格式器 | Formatter | 决定日志记录的最终输出格式 |
组件之间的关系:
- 日志器需要通过处理器将日志信息输出到目标位置;
- 不同的处理器可以将日志输出到不同的位置;
- 日志器可设置多个处理器将同一个日志记录输出到不同的位置;
- 每个处理器可设置自己的过滤器实现日志过滤,只保留感兴趣的日志;
- 每个处理器都可设置自己的格式器,实现同一条日志以不同的格式输出到不同的地方;
Logger常用方法:
方法 | 描述 |
---|---|
Logger.setlevel() | 设置日志器将会处理的最低级别日志 |
Logger.addHandler()和Logger.removeHandler() | 为该logger对象添加 和 移除一个handler对象 |
Logger.addFilter()和Logger.removeFilter() | 为logger对象添加和移除一个filter对象 |
Logger.debug()、Logger.info()、Logger.warnings()、Logger.error()、Logger.critical() | 日志等级 |
常用的Handler:
Handler | 描述 |
---|---|
logging.StreamHandler | 将日志消息发送到输到stream |
logging.FileHandler | 将日志消息发送到磁盘文件 |
logging.Handlers.SMTPHandler | 将日志消息发送给指定的email地址 |
logging常用函数:
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):创建一条级别为level的日志记录
logging.basicConfig(**kwargs): 对root logger进行一次性配置
logging.basicConfig()函数包含参数说明:
参数名称 | 描述 |
---|---|
filename | 指定日志输出目标文件的文件名 |
filemode | 指定日志文件的打开模式,默认为’a’ |
format | 指定日志格式字符串 |
datefmt | 指定日期/时间格式,需要再format中设置%(asctime)s才生效 |
level | 指定日志器的日志级别 |
stream | 指定日志输出目标stream,如sys.stdout |
style | 指定format格式字符串的风格,”%” 、”{“、”$” |
logging中定义好用于format格式字符串说明:
参数说明 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 将日志时间可读式输出,默认精确到毫秒 |
name | %(name)s | 所使用的日志器名称 |
filename | %(filename)s | 调用日志输出函数的模块的文件名 |
funcName | %(funcName)s | 由哪个function发出的log,调用日志输出函数的函数名 |
levelname | %(levelname)s | 日志的最终等级 |
message | %(message)s | 日志信息 |
lineno | %(lineno)d | 当前日志的行号 |
levelno | %(levelno)s | 该日志记录的数字形式的日志级别(10、20、30、40、50) |
pathname | %(pathname)s | 完整路径,调用日志输出函数的模块的完成 |
简单模式
import logging
# 配置日志输出级别、格式
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s %(name)s %(levelname)s %(message)s",
datefmt='%Y-%m-%d %H:%M:%S'
)
logging.debug("debug log")
logging.info("info log")
logging.warning("warning log")
logging.error("error log")
logging.critical("critical log")
日志流
日志流处理流程:
- 创建一个logger;
- 设置下logger的日志的等级;
- 创建合适的Handler;
- 设置每个Handler的日志等级;
- 创建下日志的格式
- 向Handler添加已创建的格式
将Handler添加到logger中 ```python
解决重复日志问题,判断是否已有handler
def log(msg):
创建logger
_logger = logging.getLogger(“zaygee”) _logger.setLevel(logging.DEBUG)
如果没有handlers,则创建,有则直接写日志
if not _logger.handlers:
# 创建handler
fh = logging.FileHandler("test.log", encoding="utf-8")
ch = logging.StreamHandler()
# 设置日志输出格式
formatter = logging.Formatter(
fmt="%(asctime)s %(name)s %(filename)s %(message)s",
datefmt="%Y-%m-%d"
)
# 为handler指定输出格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 为logger添加日志处理器
_logger.addHandler(fh)
_logger.addHandler(ch)
输出日志
_logger.info(msg)
log(“测试一下”) log(“测试二下”)
2020-11-08 zaygee logging_test.py 测试一下
2020-11-08 zaygee logging_test.py 测试二下
```
参考原文:https://www.cnblogs.com/Nicholas0707/p/9021672.html#_label1_5