文章目录
-
- [1、logging 基本架构](#1、logging 基本架构)
- [2、Logger 日志记录器及基础配置](#2、Logger 日志记录器及基础配置)
-
- [2.1 基础配置函数logging.basicConfig()](#2.1 基础配置函数logging.basicConfig())
- [3、Handler 日志处理器 、 Formatter 格式化器和 Filterer 日志过滤器](#3、Handler 日志处理器 、 Formatter 格式化器和 Filterer 日志过滤器)
- [4、输出python 错误信息 tracebak](#4、输出python 错误信息 tracebak)
- 5、使用配置文件,动态地配置日志记录器、处理器、过滤器和格式化器
-
- [5.1 创建配置文件setting.py](#5.1 创建配置文件setting.py)
- [5.2 使用配置](#5.2 使用配置)
1、logging 基本架构
-
LogRecord类: 一个实例就是一条日志记录信息
-
Logger 类: 生成日志记录(LogRecord)的主类,按照相应配置和调用的方法生成一条条不同日记记录(LogRecord)
-
Formatter类: 控制日志输出格式的类,格式化日志文本内容
-
Filter 类: 过滤日志记录(LogRecord)的类,过滤日志的级别或包含某些关键字的日志
-
Handler 类: 处理日志记录(LogRecord)的类,修改日志记录格式(通过Formatter),控制日志输出位置(控制台、文件、远程服务器等)
2、Logger 日志记录器及基础配置
2.1 基础配置函数logging.basicConfig()
logging.basicConfig(args) 用于快速设置日志系统基本配置,若不设置,默认采用BASIC_FORMAT文本格式输出控制台sys.stderr
args配置参数:
-
filename: 日志输出文件名,若指定则默认启用FileHandler
-
filemode: 若日志输出到文件,指定日志文件写入方式(a:追加;w:覆盖写入)
-
encoding: 若日志输出文件,指定filename日志文件编码
-
format: 日志记录输出文本格式
- %(levelno)s:打印日志级别的数值
- %(levelname)s:打印日志级别的名称
- %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
- %(filename)s:打印当前执行程序名
- %(funcName)s:打印日志的当前函数
- %(lineno)d:打印日志的当前行号
- %(asctime)s:打印日志的时间
- %(thread)d:打印线程ID
- %(threadName)s:打印线程名称
- %(process)d:打印进程ID
- %(processName)s:打印进程名称
- %(module)s:打印模块名称
- %(name)s:日志记录器的名称
- %(message)s:打印日志信息的内容
-
datefmt: 日志记录输出日期格式 '%Y-%m-%d %H:%M:%S'
-
style: 与format一起使用,指定文本格式化时占位符('%', '{', '$'),默认%
-
level: 日志级别
- logging.DEBUG
- logging.INFO
- logging.WARNING
- logging.ERROR
- logging.CRITICAL
-
stream: 指定日志输出的StreamHandler,如 sys.stdout、sys.stderr
Python
import logging
import sys
# 日志配置
logging.basicConfig(format='{asctime}:{levelname} {name}.py {message}',
datefmt='%Y-%m-%d %H:%M:%S',
style='{',
level=logging.DEBUG,
stream=sys.stdout
)
# 注: logging.basicConfig()函数配置,对于直接使用logging.Logger(name)类创建的日志logger对象不起作用,需要单独设置特定的日志处理器和格式化器。
# logging.basicConfig() 的主要目的是为应用程序设置基本的日志配置,它只在调用时对 "根日志记录器" 起作用,并且只会在第一次调用时生效。对于通过 logging.getLogger(name) 获取的命名日志记录器,如果未设置特定的处理器和格式化器,它们会继承 "根日志记录器" 的配置。
# 日志输出
logger = logging.getLogger('test')
logger.info('日志提示信息')
logger.warning('日志警告信息')
logger.error('日志错误信息')
logger.critical('日志严重信息')
3、Handler 日志处理器 、 Formatter 格式化器和 Filterer 日志过滤器
3.1 logging 模块提供的 Handler:官方网址
- StreamHandler: 将日志消息输出到标准输出或者标准错误输出流(sys.stdout 或 sys.stderr)。
- FileHandler: 将日志消息输出到指定的文件中。
- RotatingFileHandler: 在达到指定的大小时自动创建新的日志文件,用于控制日志文件大小的日志处理程序。
- TimedRotatingFileHandler: 在达到指定的时间间隔或者指定的时间时创建新的日志文件,用于按时间轮换日志文件的处理程序。
- SocketHandler: 将日志消息发送到网络 socket 上,用于通过网络发送日志消息的处理程序。
- DatagramHandler: 将日志消息作为 UDP 数据包发送到网络上的远程服务器,用于通过 UDP 协议发送日志消息的处理程序。
- SysLogHandler: 将消息发送到Unix syslog守护进程,可能在远程机器上,适用于将日志记录到系统级日志的处理程序。
- NTEventLogHandler: 将向Windows NT/2000/XP事件日志发送消息,用于在 Windows 系统上记录日志消息的处理程序。
- SMTPHandler: 将日志消息作为电子邮件发送到指定的邮件地址,用于通过电子邮件发送日志消息的处理程序。
- MemoryHandler: 缓存日志消息到内存中的循环缓冲区,并在达到指定的容量时触发处理程序来处理日志消息。
- HTTPHandler: 将日志消息通过 HTTP 协议发送到远程服务器上的 Web 服务器,用于通过 HTTP 发送日志消息的处理程序。
- NullHandler: 空处理程序,不对日志消息进行任何处理,用于在不需要实际记录日志的情况下使用。
- WatchedFileHandler: 监视指定的文件,如果文件发生变化,将重新打开该文件并继续写入日志消息,用于监视文件并写入日志的处理程序。
python
import logging
import sys
logger = logging.Logger('handler 测试') # 创建一个未绑定handler的logger对象
logger.setLevel(level=logging.WARNING) # 设置日志记录级别
# StreamHandler 工作台输出
stream_handler = logging.StreamHandler(stream=sys.stdout) # 重定向到控制台标准输出
stream_handler.setLevel(logging.INFO)
formatter = logging.Formatter(fmt='{asctime}:{levelname} {name}.py {message}',datefmt='%Y-%m-%d %H:%M:%S',style='{')
stream_handler.setFormatter(formatter)
# filterer 日志过滤器
class MyFilter(logging.Filter):
def filter(self,record):
return True if '000' not in record.msg else False # 控制台输出过滤掉含"000"日志
stream_handler.addFilter(MyFilter())
# FileHandler 日志文件输出
file_handler = logging.FileHandler(filename='./data/log.out',encoding='utf-8') # 日志输出文件
file_handler.setLevel(logging.INFO)
formatter1 = logging.Formatter(fmt='{asctime}:{levelname} {message}',datefmt='%Y-%m-%d %H:%M:%S',style='{')
file_handler.setFormatter(formatter1)
# 添加处理器
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
a = logger.info('日志提示信息')
logger.warning('日志警告信息')
logger.error('日志错误信息')
logger.critical('0000日志严重信息')
-
控制台输出
-
日志输出文件
注: 一个logger日志记录器可以添加多个日志处理器,handler日志处理器和logger日志记录器 同时设置 level 以最高的级别为准
4、输出python 错误信息 tracebak
Python
import logging
logger = logging.getLogger('追踪错误')
try:
res = 2/0
except Exception:
logging.error('failed',exc_info=True) # 设置参数exc_info
5、使用配置文件,动态地配置日志记录器、处理器、过滤器和格式化器
5.1 创建配置文件setting.py
Python
import sys
# logging 配置
LOGGING = {
'version':1,
'disable_existing_loggers':False,
'formatters':{
# 定义格式化器
'formatter1':{
'format':'{asctime}:{levelname} 被调用 {message}',
'style':'{'
},
'formatter2':{
'format':'{asctime}:{levelname}-{module}.py-{message}',
'style':'{'
}
},
'handlers':{
# 定义日志处理器
'handler1':{
'level':'DEBUG',
'class':'logging.StreamHandler',
'formatter':'formatter1',
'stream':sys.stdout
},
'handler2':{
'level':'DEBUG',
'class':'logging.FileHandler',
'formatter':'formatter2',
'filename':'./data/log.out'
}
},
'loggers':{
# 自定义日志记录器
'logger1':{
'level':'INFO',
'handlers':['handler1','handler2'],
'propagate':False # 设置为0表示不传播日志消息到父级Logger
},
'logger2':{
'level':'INFO',
'handlers':['handler1'],
'propagate':False # 设置为0表示不传播日志消息到父级Logger
}
},
}
5.2 使用配置
Python
import logging
from setting import LOGGING
# 加载配置
logging.config.dictConfig(LOGGING)
logger = logging.getLogger('logger2') # 调用配置文件中logger2 日志记录器
logger.info('调用logger2')