logging模块
一,logging模块的日志级别
| 日志等级(level) | 描述 |
|---|---|
| DEBUG | 最详细的日志信息,典型应用场景是 问题诊断 |
| INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
| WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
| ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
| CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
注意:
1,上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;
2,当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息,nginx、php等应用程序以及这里的python的logging模块都是这样的。同样,logging模块也可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃。
二,logging模块四大组件
| 组件名称 | 对应类名 | 功能描述 |
|---|---|---|
| 日志器 | Logger | 提供了应用程序可一直使用的接口 |
| 处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
| 过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
| 格式器 | Formatter | 决定日志记录的最终输出格式 |
1,这些组件之间的关系描述
-
日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等;
-
不同的处理器(handler)可以将日志输出到不同的位置;
-
日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置;
-
每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志;
-
每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。
与logging四大组件相关的类:Logger, Handler, Filter, Formatter。
2,写日志的7步骤
import logging ''' 1,日志收集器:logger: 2,日志收集器级别:level 3,日志处理器准备:Handler 4,日志处理器级别设置 5,logger.addHandler(handler) 6,设置日志格式 format 。 logging.Formatter('%(asctime)s-%(module)s-%(filename)s-%(lineno)d-%(name)s-%(levelname)s-%(message)s') 7,添加日志处理器 ''' # 初始化 logger 收集器: logger = logging.getLogger("python25") # 2,设置级别 logger.setLevel('DEBUG') # 3,日志处理器准备handler,默认级别是warning,默认是使用控制台输出。 # 也可以放到一个file文件中。 # handler = logging.StreamHandler() # 使用控制台输出。 handler = logging.FileHandler('log.txt') # 使用文件输出 console_handler = logging.StreamHandler() console_handler.setLevel('DEBUG') handler.setLevel('WARNING') # 添加 handler logger.addHandler(handler) logger.addHandler(console_handler) # handler 设置格式 fmt = logging.Formatter('%(asctime)s-%(module)s-%(filename)s-%(lineno)d-%(name)s-%(levelname)s-%(message)s') handler.setFormatter(fmt) logger.info('hello') logger.warning('warld')
三,日志的封装
import logging class LoggerHandler(logging.Logger): def __init__(self, name='root', level = 'DEBUG', file = None, fmt = logging.Formatter('%(asctime)s-%(module)s-%(filename)s-%(lineno)d-%(name)s-%(levelname)s-%(message)s') ): # # logger = logging.getLogger(name) super().__init__(name) # 设置级别 self.setLevel(level) # 初始化处理器 if file: file_handler = logging.FileHandler(file) # 设置file_handler的级别 file_handler.setLevel(level) file_handler.setFormatter(fmt) logger.addHandler(file_handler) stream_handler = logging.StreamHandler() # 设置stream_handler的级别 stream_handler.setLevel(level) stream_handler.setFormatter(fmt) self.addHandler(stream_handler) if __name__ == '__main__': logger = LoggerHandler() logger.debug("hello world")

浙公网安备 33010602011771号