首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MemoryHandler和FileHandler手动设置Python

使用MemoryHandler和FileHandler手动设置Python
EN

Stack Overflow用户
提问于 2015-12-04 05:40:12
回答 2查看 4.8K关注 0票数 2

我找不到足够的文件让这个工作。我有非长时间进程,它显示stderr上的进度信息,并将stdout用于输出。我想要的是,当进程退出时,日志消息都会出现在末尾,另外它也应该记录到一个文件中。根据我在文档中可以找到的内容,MemoryHandlerFileHandler是我所需要的。但是,当我像下面这样设置它时,我不会得到任何输出,无论是在文件中还是在退出时。任何帮助都将不胜感激。

代码语言:javascript
复制
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")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-07 01:50:20

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

代码语言:javascript
复制
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")

stderr输出:

代码语言:javascript
复制
I'd like this printed on the console first
2015-12-07 10:42:45,707 - DEBUG - Logger has Initialized

mylogfile.txt:

代码语言:javascript
复制
2015-12-07 10:42:45,707 - DEBUG - Logger has Initialized
票数 5
EN

Stack Overflow用户

发布于 2015-12-05 16:28:25

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

有关详细信息,请参阅这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34081632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档