python 2.7:删除处理程序对象或记录器

bob*_*rti 3 logging python-2.7

我要删除此记录器。

backup.py

try:
        Logger = Log('PythonWork.backup') 
        Logger.info("backup task started")
        Logger.disabled=True
except Exception as e:
        errlogger = Error('PythonWork.backup')
        errlogger.error("Error: Error found back up service,failed.")
        Logger.error("backup task started")
Run Code Online (Sandbox Code Playgroud)

我试着Logger.removeHandler()Logger.propagate

我的日志功能

def Log(LOG_NAME):
    logger = logging.getLogger(LOG_NAME)
    logger.setLevel(logging.DEBUG)
    filename=python.log
    fh = logging.FileHandler(filename)
    fh.setLevel(logging.INFO)
    logger.addHandler(fh)

    return logger
Run Code Online (Sandbox Code Playgroud)

我的错误功能

 def Error(LOG_NAME):
    logger = logging.getLogger(LOG_NAME)
    logger.setLevel(logging.DEBUG)
    fileNameError=python.log
    fhError = logging.FileHandler(fileNameError)
    fhError.setLevel(logging.ERROR)
    logger.addHandler(fhError)

    return logger
Run Code Online (Sandbox Code Playgroud)

在backup.py文件中,我不想执行Logger对象,但是该对象已执行。当我运行该程序并且想要停止或禁用或删除该对象时。

mgu*_*arr 7

从您的代码看来,该Log()函数在每次调用时都在创建一个新的日志处理程序-请参阅最后几行:

fh = logging.FileHandler(filename)
fh.setLevel(logging.INFO)
logger.addHandler(fh)
^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

因此,您可能有无数的FileHandler对象,删除一个对象不会删除其他对象。我怀疑这是您的问题。

如果要删除与记录器关联的所有处理程序,则可以执行以下操作:

for handler in logger.handlers[:]:
    logger.removeHandler(handler)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • 这在 Python 中是一个糟糕的解决方案,因为您在迭代它时正在改变列表 logger.handlers。最好迭代列表的副本(例如,`logger.handlers[:]`)。简单地将 logger.handlers 设置为空列表 `[]` 可能会起作用,但是日志包在释放之前获取每个处理程序的锁,所以这并不安全。 (2认同)