知道Python日志语句存储在哪里的方法是什么?
。如果我这样做:
import logging
log = logging.getLogger(__name__)
log.info('Test')
我在哪里可以找到日志文件?另外,当我调用:
时logging.getLogger(__name__)
这是否与记录器的行为/保存方式有关?
logging
模块使用附加到日志记录器的处理程序来决定消息最终如何存储或显示、在哪里存储或显示,甚至是否存储或显示。默认情况下,您也可以将logging
配置为写入文件。您应该真正阅读文档,但是如果您调用logging.basicConfig(filename=log_file_name)
,其中log_file_name
是您希望写入消息的文件的名称(请注意,您必须在调用logging
中的任何其他内容之前执行此操作),那么记录到所有记录器的所有消息(除非稍后发生一些进一步的重新配置)将被写入那里。但是要注意记录器被设置为什么级别;如果内存可用,info
低于默认日志级别,因此您必须在basicConfig
的参数中包括level=logging.INFO
,以便您的消息在文件中结束。
至于你问题的另一部分,logging.getLogger(some_string)
返回一个Logger
对象,从根记录器插入到层次结构中的正确位置,名称为some_string
的值。当不带参数调用时,它将返回根日志记录器。__name__
返回当前模块的名称,因此logging.getLogger(__name__)
返回一个Logger
对象,其名称设置为当前模块的名称。这是logging
使用的常见模式,因为它使日志记录器结构镜像代码的模块结构,这通常使日志记录消息在调试时更有用。
要获取简单文件记录器的日志位置,请尝试
logging.getLoggerClass().root.handlers[0].baseFilename
关于这个问题有一些很好的答案,但是上面的答案不适合我,因为我使用了不同类型的文件处理程序和处理程序。流不提供路径,但提供文件句柄,并且从中获取路径有些不明显。这是我的解决方案:
import logging
from logging import FileHandler
# note, this will create a new logger if the name doesn't exist,
# which will have no handlers attached (yet)
logger = logging.getLogger('<name>')
for h in logger.handlers:
# check the handler is a file handler
# (rotating handler etc. inherit from this, so it will still work)
# stream handlers write to stderr, so their filename is not useful to us
if isinstance(h, FileHandler):
# h.stream should be an open file handle, it's name is the path
print(h.stream.name)
要找到日志文件位置,请尝试在环境中的Python shell中实例化log
对象,并查看:
log.handlers[0].stream
问得好@zallarak不幸的是,虽然它们很容易创建,但Loggers
很难检查。这将获取logger
的所有Handlers
的文件名:
filenames = []
for handler in logger.handlers:
try:
filenames.append(handler.fh.name)
except:
pass
try
块处理文件名查找失败时发生的异常。