python模块之日志模块-logging
logging模块简介:日志的作用、等级和常用函数
1、日志的作用
日志的作用:
- 程序调试
- 了解程序运行是否正常
- 故障分析与问题定位
- 用户行为分析
2、logging模块简介:日志的等级
- DEBUG:最详细的日志信息,场景:问题诊断。
- INFO:通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作。
- WARNING:当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但此时应用程序还是正常的。
- ERROR:由于一个更严重的问题导致某些功能不能正常运行时记录的信息。
- CRITICAL:当发生严重错误,导致应用程序不能继续运行时记录的信息。
3、logging模块简介:日志常用函数
第一种方式是使用logging提供的模块级别的函数
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日志系统的四大组件
logger :日志器,提供应用程序代码直接使用的接口
handlers:处理器,用于将日志记录发送到指定的目的位置
filters :过滤器,提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其他的日志记录将会被忽略)
formatters :格式器,用于控制日志信息的最终输出格式
4、logging模块简介:logging
(1)logging下常用的函数
logger.setLevel() :设置日志等级
logger.addHandler()和logger.removeHandler() :添加和删除一个Handler。
logger.addFilter() :添加一个filter,起过滤作用。
logger.Handler() :Handler基于日志级别对日志进行分发。
Logger 持有日志记录器的方法,日志记录器不直接实例化,而是通过模块级函数 logging.getlogger (name) 来实例化,使用相同的名称多次调用 getLogger() 总是会返回对相同 Logger 对象的引用。
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 方法返回同一个 logger 对象。
Logger 是一个树形层级结构,在使用接口 debug,info,warn,error,critical 之前必须创建 Logger
实例:
创建方法:创建 Logger 实例后,可以使用以下方法进行日志级别设置,增加处理器 Handler
logger = logging.getLogger(logger_name)
logger.setLevel(logging.ERROR) # 设置日志级别为 ERROR,即只有日志级别大于等于 ERROR 的日志才会输出
logger.addHandler(handler_name) # 为 Logger 实例增加一个处理器
logger.removeHandler(handler_name) # 为 Logger 实例删除一个处理器
(2)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。
%(message)s :打印日志信息。
5、logging.basciConfig()函数说明
实例:
import logging
my_format = '%(asctime)s-%(filename)s-%(module)s-%(lineno)d'
logging.basicConfig(
filename='my.log',
level= logging.INFO,
format= my_format
)
logging.info('infor')
logging.debug('debug')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
执行后my.log内容如下:
2023-02-02 08:16:34,391-test.py-test-243
2023-02-02 08:16:34,392-test.py-test-245
2023-02-02 08:16:34,392-test.py-test-246
2023-02-02 08:16:34,392-test.py-test-247
6、logging四大组件详解
logger :日志器,提供应用程序代码直接使用的接口
handlers:处理器,用于将日志记录发送到指定的目的位置
filters :过滤器,提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其他的日志记录将会被忽略)
formatters :格式器,用于控制日志信息的最终输出格式
示例:
import logging
import logging.handlers
import datetime
logger =logging.getLogger('__name__')#返回的是logger对象,_ _name _ _代表当前py文件名称。
logger.setLevel(logging.DEBUG)
rf_handler =logging.handlers.TimedRotatingFileHandler('all.log',when='midnight',interval=1,backupCount=7,atTime=datetime.time(0,0,0,0))
rf_handler.setFormatter(logging.Formatter(" %(asctime)s-%(levelname)s-%(message)s"))
f_handler = logging.FileHandler('error.log')
f_handler.setLevel(logging.ERROR)
f_handler.setFormatter(logging.Formatter("%(asctime)s-%(filename)s-%(module)s-%(lineno)d"))
logger.addHandler(rf_handler)
logger.addHandler(f_handler)
logger.info('infor0123')
logger.debug('debug0123')
logger.warning('warning0123')
logger.error('error0123')
logger.critical('critical0123')
直接执行如上代码,error.log展示的结果:
2023-02-03 08:25:22,754-test.py-test-268
2023-02-03 08:25:22,754-test.py-test-269
直接执行如上代码,all.log展示的结果:
2023-02-03 08:28:24,455-INFO-infor0123
2023-02-03 08:28:24,455-DEBUG-debug0123
2023-02-03 08:28:24,455-WARNING-warning0123
2023-02-03 08:28:24,455-ERROR-error0123
2023-02-03 08:28:24,455-CRITICAL-critical0123
Handler类
Handler相关子类: