python停止打印日志/重复打印日志

问题描述:

用类实现了一个需求,每次实例化时,会根据传入的参数,在不同的日志文件中写入日志,即要求类的每个实例根据传参写入不同的日志文件。
运行后发现 ,运行到根据c2配置的实例 时,c2实例的日志出现在了c1的日志文件中,控制台日志也是重复的,即使把实例 del 删除也还是会打印重复日志。

主要代码如下:

class KKK
	def __init__(self, log_name, base_path)
	    self.log_name= log_name
	    self.base_path = base_path
	    
	def start():
	    ....
	    pass
	    
    def getLogger(self):
        # logger = logging.getLogger('%s_%d' % (self.log_name, int(time.time())))
        logger = logging.getLogger()
        logger.setLevel(logging.DEBUG)

        formatter = logging.Formatter("%(asctime)s|%(lineno)04d|%(levelname)-8s|%(message)s")

        # 控制台日志
        StreamHandler = logging.StreamHandler()
        StreamHandler.setFormatter(formatter)
        StreamHandler.setLevel(logging.INFO)

        # 较详细的日志
        FileHandler = logging.FileHandler(filename=os.path.join(self.base_path, '%s.log' % self.log_name), mode='a', encoding='utf8')
        FileHandler.setFormatter(formatter)
        FileHandler.setLevel(logging.DEBUG)
        
        logger.addHandler(StreamHandler)
        logger.addHandler(FileHandler)

        return logger


if __name__ == '__main__':
    c1 = {...}
    c2 = {...}
    for cc in [c1, c2]:
        kkk = KKK(**cc)
        kkk.start()

问题原因

logging.getLogger( ), 并未传递参数, 所以得到的self.logger是RootLogger。RootLogger是一个python程序内全局唯一的,所有Logger对象的父类,对RootLogger的设定,均会影响到后续的日志。

解决办法

方法1

getLogger设置参数

logger = logging.getLogger('%s_%d' % (self.course_name, int(time.time())))
方法2

类实例销毁前清空log.handlers

    def __del__(self):
        self.stopLogger()
        pass

    def stopLogger(self):
        # for fh in self.logger.handlers:
        #     print(fh.get_name, '+++++')
        #     if isinstance(fh, logging.FileHandler):
        #         print('close handler')
        #         fh.close()
        
        self.logger.warning('关闭日志, %s , %s' % (self.course_name, self.logger.name))
        self.logger.handlers.clear()
        pass

参考

https://blog.csdn.net/weixin_42503009/article/details/116171149
https://blog.csdn.net/weixin_43997319/article/details/123990742

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中,打印日志可以使用标准库中的`logging`模块。`logging`模块提供了一个灵活的方式来记录程序运行时产生的信息,可以控制日志的级别、输出位置以及格式等。 以下是一个简单的打印日志的示例: ```python import logging # 配置日志输出的格式 logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.INFO) # 输出日志信息 logging.debug('This is a debug message.') logging.info('This is an info message.') logging.warning('This is a warning message.') logging.error('This is an error message.') logging.critical('This is a critical message.') ``` 输出的日志格式为`时间 日志级别: 日志信息`,如下所示: ``` 2021-10-08 17:26:46,229 INFO: This is an info message. 2021-10-08 17:26:46,229 WARNING: This is a warning message. 2021-10-08 17:26:46,229 ERROR: This is an error message. 2021-10-08 17:26:46,229 CRITICAL: This is a critical message. ``` 可以看出,日志信息按照级别进行输出,级别从低到高依次是`DEBUG`、`INFO`、`WARNING`、`ERROR`和`CRITICAL`,默认的级别是`WARNING`,可以通过`basicConfig()`函数的`level`参数来设置输出的最低级别。 除了上面的方式外,还可以使用`Logger`类来记录日志,可以更加灵活地控制日志的输出。例如,可以创建一个名为`mylogger`的日志记录器,并设置其输出级别为`DEBUG`: ```python import logging # 创建一个名为'mylogger'的Logger对象 logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 配置日志输出的格式 formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s') # 创建一个输出到控制台的Handler对象 console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(formatter) # 将Handler对象添加到Logger对象中 logger.addHandler(console_handler) # 输出日志信息 logger.debug('This is a debug message.') logger.info('This is an info message.') logger.warning('This is a warning message.') logger.error('This is an error message.') logger.critical('This is a critical message.') ``` 输出结果与前面的示例相同,但是使用的是`mylogger`这个记录器,并且可以更加灵活地控制日志的输出方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值