重新开始记录日志到一个新文件(Python)

23

我正在使用以下代码初始化我的应用程序中的日志记录:

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# log to a file
directory = '/reserved/DYPE/logfiles'
now = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = os.path.join(directory, 'dype_%s.log' % now)
file_handler = logging.FileHandler(filename)
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s %(filename)s, %(lineno)d, %(funcName)s: %(message)s")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

# log to the console
console_handler = logging.StreamHandler()
level = logging.INFO
console_handler.setLevel(level)
logger.addHandler(console_handler)

logging.debug('logging initialized')

如何关闭当前的日志文件并开始记录到新的文件中?

注意:我不想使用RotatingFileHandler,因为我想对所有文件名有完全控制。

2个回答

36

如果需要的话,您可以使用removeHandleraddHandler手动重新分配处理程序,或者可以访问logger.handlers[index_of_handler_here].stream并手动替换流,但我建议前者而不是后者。

logger.handlers[0].stream.close()
logger.removeHandler(logger.handlers[0])

file_handler = logging.FileHandler(filename)
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s %(filename)s, %(lineno)d, %(funcName)s: %(message)s")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

1
我可以使用这个吗?:logger.removeHandler(logger.handlers[0]) - compie
1
@Compie,是的,那样做就可以了。你可能需要先执行logger.handlers[0].stream.close() - Mahmoud Abdelkader
如果你有一个StreamHandler(),请不要关闭stdout或stderr。 - SoloPilot

2

这是我的工作内容:

def initLogging(filename):
    global logger
    if logger == None:
        logger = logging.getLogger()
    else:  # wish there was a logger.close()
        for handler in logger.handlers[:]:  # make a copy of the list
            logger.removeHandler(handler)

    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter(fmt='%(asctime)s: %(message)s', datefmt='%I:%M:%S')

    fh = logging.FileHandler(filename)
    fh.setFormatter(formatter)
    logger.addHandler(fh)

    sh = logging.StreamHandler(sys.stdout)
    sh.setFormatter(formatter)
    logger.addHandler(sh)

1
if语句和全局变量是必要的吗?logging.getLogger()总是返回相同的实例(有效地为您获取全局变量的值)。 - MD004

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接