2017-01-03 95 views
2

我想删除此记录器。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") 

我试图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 

我的错误功能

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 

在backup.py文件我不想excecute Logger对象,但它被执行。当我运行这个程序时,我想停止或禁用或删除该对象。

+0

对不起,错误函数行6中有一个错误fhError.setLevel(logging.INFO)。这是fhError.setLevel(logging.ERROR) –

回答

3

从你的代码,它似乎Log()功能在每次调用创建一个新的日志处理程序 - 看到最后一行:

fh = logging.FileHandler(filename) 
fh.setLevel(logging.INFO) 
logger.addHandler(fh) 
^^^^^^^^^^^^^^^^^^^^^ 

所以,你可能有FileHandler对象万千,消除1韩元不要删除其他人。我怀疑这是你的问题。

如果要删除相关的日志中记录的所有处理程序,你可以做到以下几点:

for handler in logger.handlers[:]: 
    logger.removeHandler(handler) 

希望这有助于。

+0

这在Python中是一个糟糕的解决方案,因为您在迭代它时突变了列表logger.handlers。最好遍历列表的副本(例如'logger.handlers [:]')。它可能只是简单地将logger.handlers设置为空列表[[]'),但是日志包在释放前会在每个处理程序上获取锁,因此这不是安全的。 – johnthacker

+0

@johnthacker我根据你的评论编辑了答案 – mguijarr