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")

 

posted @ 2020-11-25 06:13  勇敢面对difficult  阅读(140)  评论(0)    收藏  举报