我是靠谱客的博主 慈祥荷花,最近开发中收集的这篇文章主要介绍python 日志处理 logging模块 日志写入重复 问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

现象:

使用logging模块保存日志,第一条记录写一次,第二条记录写两次,第三条记录写三次,日志写入重复。

原因:

没有移除handler 解决:在日志记录完之后removeHandler

例如:

def log(msg):
    #创建logger,如果参数为空则返回root logger
    logger = logging.getLogger("nick")
    logger.setLevel(logging.DEBUG)  #设置logger日志等级
​
    #创建handler
    fh = logging.FileHandler("test.log",encoding="utf-8")
    ch = logging.StreamHandler()
​
    #设置输出日志格式
    formatter = logging.Formatter(
        fmt="%(asctime)s %(name)s %(filename)s %(message)s",
        datefmt="%Y/%m/%d %X"
        )
​
    #为handler指定输出格式
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
​
    #为logger添加的日志处理器
    logger.addHandler(fh)
    logger.addHandler(ch)
​
    # 输出不同级别的log
    logger.info(msg)
​
log("泰拳警告")
log("提示")
log("错误")

输出结果:

2018/05/10 20:06:18 nick test.py 泰拳警告
2018/05/10 20:06:18 nick test.py 提示
2018/05/10 20:06:18 nick test.py 提示
2018/05/10 20:06:18 nick test.py 错误
2018/05/10 20:06:18 nick test.py 错误
2018/05/10 20:06:18 nick test.py 错误

分析:

可以看到输出结果有重复打印,第二次调用log的时候,根据getLogger(name)里的name获取同一个logger,而这个logger里已经有了第一次你添加的handler,第二次调用又添加了一个handler,所以,这个logger里有了两个同样的handler,以此类推,调用几次就会有几个handler。

解决方案1

添加removeHandler语句

import logging
def log(msg):
    #创建logger,如果参数为空则返回root logger
    logger = logging.getLogger("nick")
    logger.setLevel(logging.DEBUG)  #设置logger日志等级
​
    #创建handler
    fh = logging.FileHandler("test.log",encoding="utf-8")
    ch = logging.StreamHandler()
​
    #设置输出日志格式
    formatter = logging.Formatter(
        fmt="%(asctime)s %(name)s %(filename)s %(message)s",
        datefmt="%Y/%m/%d %X"
        )
​
    #为handler指定输出格式
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
​
    #为logger添加的日志处理器
    logger.addHandler(fh)
    logger.addHandler(ch)
​
    # 输出不同级别的log
    logger.info(msg)
​
    #解决方案1,添加removeHandler语句,每次用完之后移除Handler
    logger.removeHandler(fh)
    logger.removeHandler(ch)
​
​
log("泰拳警告")
log("提示")
log("错误")

解决方案2 

在log方法里做判断,如果这个logger已有handler,则不再添加handler。

import logging
def log(msg):
    #创建logger,如果参数为空则返回root logger
    logger = logging.getLogger("nick")
    logger.setLevel(logging.DEBUG)  #设置logger日志等级
​
    #解决方案2:这里进行判断,如果logger.handlers列表为空,则添加,否则,直接去写日志
    if not logger.handlers:
        #创建handler
        fh = logging.FileHandler("test.log",encoding="utf-8")
        ch = logging.StreamHandler()
​
        #设置输出日志格式
        formatter = logging.Formatter(
            fmt="%(asctime)s %(name)s %(filename)s %(message)s",
            datefmt="%Y/%m/%d %X"
            )
​
        #为handler指定输出格式
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)
​
        #为logger添加的日志处理器
        logger.addHandler(fh)
        logger.addHandler(ch)
​
    # 输出不同级别的log
    logger.info(msg)
​
​
log("泰拳警告")
log("提示")
log("错误")

 

最后

以上就是慈祥荷花为你收集整理的python 日志处理 logging模块 日志写入重复 问题的全部内容,希望文章能够帮你解决python 日志处理 logging模块 日志写入重复 问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部