使用介绍
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:
# 创建handlerfh = 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
