日志记录函数以它们用来跟踪的事件的级别或严重性命名。下面描述了标准级别及其适用性(从高到低的顺序)
日志等级(level) 描述
DEBUG 最详细的日志信息,典型应用场景是 问题诊断
INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息
日志级别等级排序:critical > error > warning > info > debug
import logging # 打印日志级别 def test_logging(): logging.debug('Python debug') logging.info('Python info') logging.warning('Python warning') logging.error('Python Error') logging.critical('Python critical') test_logging() #输出结果 WARNING:root:Python warning ERROR:root:Python Error CRITICAL:root:Python critical
设置日志显示级别
通过 logging.basicConfig() 可以设置 root 的日志级别,和日志输出格式
logging.basicConfig() 关键字参数
关键字 描述
filename 创建一个 FileHandler,使用指定的文件名,而不是使用 StreamHandler。
filemode 如果指明了文件名,指明打开文件的模式(如果没有指明 filemode,默认为 'a')。
format handler 使用指明的格式化字符串。
datefmt handler 使用指明的格式化字符串。
level 指明根 logger 的级别。
stream 使用指明的流来初始化 StreamHandler。该参数与 'filename' 不兼容,如果两个都有,'stream' 被忽略。
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 打印日志信息
注意:Logging.basicConfig() 需要在开头就设置,在中间设置并无作用
import logging # 更改显示消息的格式 logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
#logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
#logging.basicConfig(filename='myapp.log',level=logging.DEBUG) logging.debug('Python message format Debug') logging.info('Python message format Info') logging.warning('Python message format Warning')
logging 模块四大组件
组件名称 对应类名 功能描述
日志器 Logger 暴露函数给应用程序,基于日志记录器和过滤器级别决定哪些日志有效
处理器 Handler 将 logger 创建的日志记录发送到合适的目的输出
过滤器 Filter 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器 Formatter 决定日志记录的最终输出格式
日志器- Logger
Logger 持有日志记录器的方法,日志记录器不直接实例化,而是通过模块级函数 logger.getlogger (name) 来实例化,使用相同的名称多次调用 getLogger() 总是会返回对相同 Logger 对象的引用。
-
应用程序代码能直接调用日志接口。
-
Logger最常用的操作有两类:配置和发送日志消息。
-
初始化 logger = logging.getLogger("endlesscode"),获取 logger 对象,getLogger() 方法后面最好加上所要日志记录的模块名字,配置文件和打印日志格式中的 %(name)s 对应的是这里的模块名字,如果不指定name则返回root对象。
-
logger.setLevel(logging.DEBUG),Logging 中有 NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志
-
多次使用相同的name调用 getLogger 方法返回同一个 looger 对象;
Logger是一个树形层级结构,在使用接口 debug,info,warn,error,critical 之前必须创建 Logger 实例:
创建方法: logger = logging.getLogger(logger_name)
创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器 Handler:
-
logger.setLevel(logging.ERROR) # 设置日志级别为 ERROR,即只有日志级别大于等于 ERROR 的日志才会输出
-
logger.addHandler(handler_name) # 为 Logger 实例增加一个处理器
-
logger.removeHandler(handler_name) # 为 Logger 实例删除一个处理器
处理器- Handler
Handler 处理器类型有很多种,比较常用的有三个,StreamHandler,FileHandler,NullHandler
StreamHandler
创建方法:sh = logging.StreamHandler(stream=None)
创建 StreamHandler 之后,可以通过使用以下方法设置日志级别,设置格式化器 Formatter,增加或删除过滤器 Filter:
ch.setLevel(logging.WARN) # 指定日志级别,低于WARN级别的日志将被忽略 ch.setFormatter(formatter_name) # 设置一个格式化器formatter ch.addFilter(filter_name) # 增加一个过滤器,可以增加多个 ch.removeFilter(filter_name) # 删除一个过滤器
过滤器- Filter
Handlers 和 Loggers 可以使用 Filters 来完成比级别更复杂的过滤。Filter 基类只允许特定 Logger 层次以下的事件。例如用 ‘A.B’ 初始化的 Filter 允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ 等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。如果用空字符串来初始化,所有的事件都接受。
创建方法: filter = logging.Filter(name='')
格式器- Formatter
使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S
创建方法: formatter = logging.Formatter(fmt=None, datefmt=None)
其中,fmt 是消息的格式化字符串,datefmt 是日期字符串。如果不指明 fmt,将使用 '%(message)s' 。如果不指明 datefmt,将使用 ISO8601 日期格式。
组件之间的关联关系
-
日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,不同的处理器(handler)可以将日志输出到不同的位置;
-
日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置;
-
每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志;
-
每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。
简明了说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。
-
Logger 可以包含一个或多个 Handler 和 Filter
-
Logger 与 Handler 或 Fitler 是一对多的关系
-
一个 Logger 实例可以新增多 个 Handler,一个 Handler 可以新增多个格式化器或多个过滤器,而且日志级别将会继承。
标签:logger,logging,name,详解,模块,Logger,级别,日志 From: https://www.cnblogs.com/boye169/p/17055525.html