使用MemoryHandler和FileHand手动设置Python日志记录

2024-04-27 09:14:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我找不到足够的文件来让它工作。我有一些非长时间运行的进程,它们显示stderr的进度信息并使用stdout作为输出。我想要的是,当进程退出时,所有日志消息都会在最后被整理,另外它还应该记录到一个文件中。从文档中可以找到,MemoryHandler和{}是我需要的。但是当我像下面这样设置时,我没有得到任何输出,无论是在文件中还是在退出时。任何帮助都将不胜感激。在

import logging, logging.handlers, atexit, sys

filename = 'mylogfile.txt'
logLevel = logging.DEBUG

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
streamhandler = logging.StreamHandler(sys.stderr)
streamhandler.setLevel(logLevel)
streamhandler.setFormatter(formatter)
memoryhandler = logging.handlers.MemoryHandler(1024*100, logLevel, streamhandler)

filehandler = logging.FileHandler(filename)
filehandler.setLevel(logLevel)
filehandler.setFormatter(formatter)

logger = logging.getLogger()
logger.addHandler(memoryhandler)
logger.addHandler(filehandler)
def flush():
    memoryhandler.flush()
atexit.register(flush)
logger.debug("Logger has Initialized")

Tags: 文件进程formatterlogginghandlersstderrsyslogger
2条回答

您需要在记录器和处理程序上指定一个级别。只有在检查记录器级别之后,才会查询处理程序的级别。在

有关详细信息,请参见here。在

Vinay Sajip在这里提供了最重要的缺失线索:记录器确实有自己的级别,我忘了设置它,因此调试记录永远不会发出。然而,还有一个问题导致MemoryHandler在接收到一个记录后立即刷新:它自己的级别需要设置得更高才能正常工作,因为它是不是我假设的一个较低的截止级别,但是处理程序或其上的级别会立即将其记录刷新为target。另请参考docs。下面的代码修复了这些问题,并以一种更自我文档化的方式编写,以便了解这一微妙之处。在

import logging, logging.handlers, atexit, sys

filename = 'mylogfile.txt'
logLevel = logging.DEBUG

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
streamhandler = logging.StreamHandler(sys.stderr)
streamhandler.setLevel(logLevel)
streamhandler.setFormatter(formatter)
memoryhandler = logging.handlers.MemoryHandler(
    capacity=1024*100,
    flushLevel=logging.ERROR,
    target=streamhandler
)

filehandler = logging.FileHandler(filename)
filehandler.setLevel(logLevel)
filehandler.setFormatter(formatter)
logger = logging.getLogger()
logger.setLevel(logLevel)
logger.addHandler(memoryhandler)
logger.addHandler(filehandler)
def flush():
    memoryhandler.flush()
atexit.register(flush)
logging.debug("Logger has Initialized")
sys.stderr.write("I'd like this printed on the console first\n")

标准输出:

^{pr2}$

在mylogfile.txt公司名称:

2015-12-07 10:42:45,707 - DEBUG - Logger has Initialized

相关问题 更多 >