Python 日志记录重复

Sri*_*mar 3 python logging

我有四个文件,

  • 主要.py
  • py
  • py
  • 日志系统

我正在使用 main 来使用 A.py 和 B.py 的函数,所以现在我必须在调用它们时记录所有信息。

所以我编写了一个名为 log_system 的脚本来为每个脚本文件(例如 A.py、B.py)创建日志处理程序

import logging

def fetchLogger(name="None") :
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)

    if (name == "None"):
        #create File for Log
        handler = logging.FileHandler('./engine_log/Generic.log')
        handler.setLevel(logging.DEBUG)
        #log format 
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)

        #adding the handler to Logging System
        logger.addHandler(handler)
    else: 
        #create File for Log
        handler = logging.FileHandler('./engine_log/'+str(name))
        handler.setLevel(logging.DEBUG)
        #log format 
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        #adding the handler to Logging System
        logger.addHandler(handler)
    return logger
Run Code Online (Sandbox Code Playgroud)

因此,如果我想在脚本文件 A.py 中使用日志记录,我会编写以下行:

import log_system 
"""Log System Building """
file_name =  'A.py'
logger = log_system.fetchLogger(file_name)

def hello():
    try:
        logger.info("excuting Hello")
    except: 
        logger.debug("something went wrong in hello")
Run Code Online (Sandbox Code Playgroud)

但我的日志文件

2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello
2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello
2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello
2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello
2017-10-18 14:59:28,695 - log_system - INFO - A.py-excuting Hello
Run Code Online (Sandbox Code Playgroud)

它重复日志很多次......那么我应该做什么?

解决方案

logger = logging.getLogger(name)

if logger.hasHandlers(): 
    logger.handlers = []

logger.setLevel(logging.DEBUG)

#create File for Log
handler = logging.FileHandler('./engine_log/'+str(name))
handler.setLevel(logging.DEBUG)
#log format 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
#adding the handler to Logging System
logger.addHandler(handler)

return logger
Run Code Online (Sandbox Code Playgroud)

这就是我更改 log_system 代码的方式,因此如果我已经创建了日志处理程序,我只是清空处理程序列表,这样它就不会创建重复的记录。

sna*_*erb 12

每次fetch_logger调用时都会FileHandler向记录器添加一个新内容。每个FileHandler写入日志文件,导致文件中重复输出。

一种解决方案是调用记录器的hasHandlers方法。如果记录器上配置了任何处理程序,这将返回 True,然后您可以删除它们。

def fetchLogger(name="None") :
    logger = logging.getLogger(__name__)
    if logger.hasHandlers():
        # Logger is already configured, remove all handlers
        logger.handlers = []
    # Configure the logger as before.
    ...
Run Code Online (Sandbox Code Playgroud)