Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python日志记录重复_Python_Logging - Fatal编程技术网

Python日志记录重复

Python日志记录重复,python,logging,Python,Logging,我有四份档案 Main.py A.py B.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.DE

我有四份档案

  • Main.py
  • A.py
  • B.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
因此,如果我想在脚本文件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")
但是我的日志文件

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
它多次重复日志。。。。 那我该怎么办呢

解决方案

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

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

每次调用
fetch\u logger
时,它都会向日志程序添加一个新的
FileHandler
。每个
FileHandler
都会写入日志文件,从而在文件中重复输出

一种解决方案是调用记录器的方法。如果在记录器上配置了任何处理程序,则返回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.
    ...

当使用
\uuuu name\uuuu
变量作为记录器名称时,可能还有另一个重复的原因。
记录器假定名称中的点表示父子关系。如果已经从树中较高的模块创建了记录器,则也会调用它来处理日志记录

因此,如果您首先
logger=logger.get\u logger(\uuuu name\uuuu)
在模块'foo'中并向其添加处理程序,
然后
other\u logger=logger.get\u logger(\uuu name\uuu)
在模块'foo.bar'中添加处理程序,
您已经创建了一个父级和一个子级

在foo.bar模块中使用另一个_logger.info('Some text')将导致首先执行'foo.bar'处理程序的处理程序,然后由'foo'处理程序执行相同的消息