python3 logging 模块使用教程
导入 logging 模块
1 | import logging |
日志级别
DEBUG
- 详细信息,典型地调试问题时会感兴趣
INFO
- 证明事情按预期工作
WARNING
- 表明发生了一些意外
- 或者不久的将来会发生问题(如‘磁盘满了’)
- 但是软件还是在正常工作
ERROR
- 由于更严重的问题,软件已不能执行一些功能了
CRITICAL
- 严重错误,表明软件已不能继续运行了
1 2 3 4 5 | logging.debug( 'debug message' ) logging.info( 'info message' ) logging.warning( 'warning message' ) logging.error( 'error message' ) logging.critical( 'critical message' ) |
配置
1 2 | # 通过下面的方式进行简单配置输出方式与日志级别 logging.basicConfig(filename = 'logger.log' , level = logging.INFO) |
几个重要的概念
- Logger,记录器,暴露了应用程序代码能直接使用的接口。
- Handler,处理器,将(记录器产生的)日志记录发送至合适的目的地。
- Filter,过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
- Formatter,格式化器,指明了最终输出中日志记录的布局。
Logger 记录器
- Logger 是一个树形层级结构
- 在使用接口 debug,info,warning,error,critical 之前必须创建 Logger 实例
- 即创建一个记录器
- 如果没有显式的进行创建,则默认创建一个 root logger
- 并应用默认的日志级别(WARNING)
- 处理器 Handler(StreamHandler,即将日志信息打印输出在标准输出上)
- 格式化器 Formatter(默认的格式即为第一个简单使用程序中输出的格式)
1 2 3 4 5 6 7 | logger = logging.getLogger(logger_name) # 设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出 logger.setLevel(logging.ERROR) # 为Logger实例增加一个处理器 logger.addHandler(handler_name) # 为Logger实例删除一个处理器 logger.removeHandler(handler_name) |
Handler 处理器
Handler 处理器类型有很多种,比较常用的有三个
StreamHandler
FileHandler
NullHandler
1 2 3 4 5 | sh = logging.StreamHandler(stream = None ) fh = logging.FileHandler(filename, mode = 'a' , encoding = None , delay = False ) # NullHandler类位于核心logging包,不做任何的格式化或者输出 # 本质上它是个“什么都不做”的handler,由库开发者使用 nf = logging.NullHandler() |
创建 StreamHandler 之后
- 可以通过使用以下方法设置日志级别
- 设置格式化器 Formatter
- 增加或删除过滤器 Filter
1 2 3 4 5 6 7 8 | # 指定日志级别,低于 WARNING 级别的日志将被忽略 handler.setLevel(logging.WARNING) # 设置一个格式化器 formatter handler.setFormatter(formatter_name) # 增加一个过滤器,可以增加多个 handler.addFilter(filter_name) # 删除一个过滤器 handler.removeFilter(filter_name) |
Formatter 格式化器
- 使用 Formatter 对象设置日志信息最后的规则、结构和内容
- 默认的时间格式为
%Y-%m-%d %H:%M:%S
1 2 3 | # fmt是消息的格式化字符串,如果不指明fmt,将使用'%(message)s' # datefmt是日期字符串,如果不指明datefmt,将使用ISO8601日期格式。 formatter = logging.Formatter(fmt = None , datefmt = None ) |
Filter 过滤器
- Handlers 和 Loggers 可以使用 Filters 来完成比级别更复杂的过滤
- Filter 基类只允许特定 Logger 层次以下的事件
1 | filter = logging. Filter (name = '') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import logging # create logger logger_name = "example" logger = logging.getLogger(logger_name) logger.setLevel(logging.DEBUG) # create file handler log_path = "demo03.log" fh = logging.FileHandler(log_path) fh.setLevel(logging.WARNING) # create formatter fmt = "%(asctime)-15s %(levelname)s %(filename)s %(lineno)d %(process)d %(message)s" datefmt = "%a %d %b %Y %H:%M:%S" formatter = logging.Formatter(fmt, datefmt) # add handler and formatter to logger fh.setFormatter(formatter) logger.addHandler(fh) # print log info logger.debug( 'debug message' ) logger.info( 'info message' ) logger.warning( 'warning message' ) logger.error( 'error message' ) logger.critical( 'critical message' ) |
配置方式
- 显式创建记录器 Logger、处理器 Handler 和格式化器 Formatter,并进行相关设置
- 通过简单方式进行配置,使用
basicConfig()
函数直接进行配置 - 通过配置文件进行配置,使用
fileConfig()
函数读取配置文件 - 通过配置字典进行配置,使用
dictConfig()
函数读取配置信息 - 通过网络进行配置,使用
listen()
函数进行网络配置
basicConfig 关键字参数
filename
- 创建一个 FileHandler,使用指定的文件名,而不是使用 StreamHandler
filemode
- 如果指明了文件名,指明打开文件的模式(如果没有指明 filemode,默认为
a
)
- 如果指明了文件名,指明打开文件的模式(如果没有指明 filemode,默认为
format
- handler 使用指明的格式化字符串
datefmt
- 使用指明的日期/时间格式
level
- 指明根 logger 的级别
stream
- 使用指明的流来初始化 StreamHandler,该参数与
filename
不兼容, - 如果两个都有,
stream
被忽略
- 使用指明的流来初始化 StreamHandler,该参数与
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
,打印日志信息
datefmt 格式
%a
,本地的缩写工作日名称%A
,本地的完整工作日名称%b
,本地的缩写月份名称%B
,本地的全月名称%c
,本地的适当日期和时间表示%d
,每月的一天作为小数 [01,31]%H
,小时(24 小时时钟)作为小数 [00,23]%I
,小时(12 小时时钟)作为小数目 [01,12]%j
,一年中的一天作为小数 [001,366]%m
,月作为小数 [01,12]%M
,分钟作为小数 [00,59]%p
,本地相当于上午或下午%S
,第二为小数 [00,61]%U
,年度周数(星期日为一周的第一天)为小数 [00,53]- 第一个星期天前的新年中的所有日子都被认为是在第 0 周
%w
,平日作为小数 [0 (星期日), 6]%W
,年度周数(星期一为一周的第一天)为小数 [00,53]- 第一个星期一之前的新年的所有日子都被认为是在第 0 周
%x
,本地的适当日期表示%X
,本地的适当时间表示%y
,没有世纪的年份作为小数 [00,99]%Y
,以世纪为小数的年份%Z
,时区名称(如果没有时区,则不存在字符)%%
,字面意思%
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | [loggers] keys = root,example01 [logger_root] level = DEBUG handlers = hand01,hand02 [logger_example01] handlers = hand01,hand02 qualname = example01 propagate = 0 [handlers] keys = hand01,hand02 [handler_hand01] class = StreamHandler level = INFO formatter = form01 args = (sys.stderr,) [handler_hand02] class = FileHandler level = DEBUG formatter = form02 args = ( 'demo04.log' , 'a' ) [formatters] keys = form01,form02 [formatter_form01] format = % (asctime)s % (filename)s[line: % (lineno)d] % (levelname)s % (message)s [formatter_form02] format = % (asctime)s % (filename)s[line: % (lineno)d] % (levelname)s % (message)s |
log.py文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import logging import logging.config logging.config.fileConfig( "logging.conf" ) # create logger logger_name = 'example01' logger = logging.getLogger(logger_name) logger.debug( 'debug message' ) logger.info( 'info message' ) logger.warning( 'warning message' ) logger.error( 'error message' ) logger.critical( 'critical message' ) |
本文作者:香菜哥哥
本文链接:https://www.cnblogs.com/yizhipanghu/p/15566983.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步