logging模块高级应用(编码方式)

前言:

在一个项目中,日志是很重要的一部分,可以帮助我们记录程序发生了什么,有助于帮助分析程序以及定位程序发生的问题,其作用不言而喻。

 

一、logging的组成

记录器:logger,提供应用程序代码能直接使用的接口。

处理器:handler,将记录器产生的日志发送到目的地(如控制台,文件,邮件等等)。

过滤器:filter,提供更好的粒度控制,决定哪些日志会被输出。

格式器:formatter,设置日志内容的组成结构和消息字段。

 

二、记录器

通过logging模块可以获得记录器:logger = logging.getLogger()

getLogger()的参数:

name:默认为None。

import logging

# 记录器
logger = logging.getLogger()
# 记录器的日志级别
logger.setLevel("INFO")

获得了记录器后,可以为记录器设置基本:logger.setLevel()

setLevel()的参数:

level:用例基本

 

三、处理器

在获得记录器后,就可以设置处理器,用于设置日志输出目的地。

常见的输出目的地有2中:控制台与日志。

控制台处理器:ch = logging.StreamHandler(),参数:stream,默认为None

文件处理器:fh = logging.FileHandler(),filename:文件路径。mode:文件访问方式,默认”a“。encoding:编码方式,默认None。delay:延迟,默认False。

ch = logging.StreamHandler()
fh = logging.FileHandler(filename="abc.log", mode="a", encoding="utf-8")

 

四、过滤器

过滤器用来过滤日志

#定义一个过滤器
flt1 = logging.Filter("logger1") #名字就是logger记录器的名字

#关联过滤器
#1.logger关联过滤器
logger.addFilter(flt1)

#2.处理器关联过滤器
sh1.addFilter(flt1)
#fh1.addFilter(flt1)

#过滤器定义在记录器上的时候,不管你设置了任何关于这个过滤器的任何设置,都不起作用。
#过滤器定义在哪个处理器上,哪个处理器就不起作用,也就可以控制日志的输出,想要还是不想要。
#特别是在项目调试的时候,不想让日志记录到文件里去,直接在屏幕显示,就过滤到fh
#代码上线后,日志记录到文件,不用在屏幕显示,就过滤掉sh

 

五、格式器

logging.Formatter()

参数:fmt:输出信息格式。datefmt:日期格式。style:风格,默认'%'。validate:未知

formatter = logging.Formatter(fmt="%(asctime) s%(message)s | %(filename)s: %(lineno)s",
                              datefmt="%Y-%m-%d %H:%M:%S")

常用的格式:

 

 

六、logging的封装

整体思路如下:

将处理器添加至记录器,将格式器添加至处理器。

import logging
import os

log_path = os.path.dirname(os.path.abspath(__file__))

print(log_path)


class Logger:
    def __init__(self, logger_name):
        self.logger_name = logger_name
        self.logger = logging.getLogger(logger_name)
        self.logger.setLevel("DEBUG")

        self.log_path = log_path + "\\aaa.log"

        self.ch = logging.StreamHandler()
        self.fh = logging.FileHandler(filename=self.log_path)

        self.formatter = logging.Formatter(fmt="%(asctime)s | %(filename)s:%(lineno)d %(levelname)s %(message)s",
                                           datefmt="%Y-%m-%d %H:%M:%S")

        self.ch.setFormatter(self.formatter)
        self.fh.setFormatter(self.formatter)

        self.logger.addHandler(self.fh)
        self.logger.addHandler(self.ch)

    def get_logger(self):
        return self.logger

 

posted @ 2022-03-07 17:09  Target_L  阅读(419)  评论(0)    收藏  举报