我找不到足够的文档来让它工作。我有非longrunning进程,显示stderr的进度信息并使用stdout输出。我想要的是当进程退出时,所有日志消息都会在结尾处显示,并且它也应该记录到文件中。根据我在文档中可以找到的内容,我需要MemoryHandler
和FileHandler
。但是当我像下面这样设置它时,我既没有得到任何输出,也没有在文件中或退出时。任何帮助,将不胜感激。
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")
答案 0 :(得分:2)
Vinay Sajip在这里提供了最重要的缺失线索:记录器确实有自己的级别,我忘了设置,因此绝不会发出DEBUG记录。然而还有一个问题,它导致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")
stderr输出:
I'd like this printed on the console first
2015-12-07 10:42:45,707 - DEBUG - Logger has Initialized
mylogfile.txt:
2015-12-07 10:42:45,707 - DEBUG - Logger has Initialized
答案 1 :(得分:1)
您需要在记录器和处理程序上指定级别。只有在检查记录器级别后才会查询处理程序的级别。
有关详细信息,请参阅here。