知道 Python 日志语句的存储位置的方法是什么?
即如果我这样做:
import logging
log = logging.getLogger(__name__)
log.info('Test')
我在哪里可以找到日志文件?另外,当我打电话时:
logging.getLogger(__name__)
这是否与记录器的行为/保存方式有关?
该logging
模块使用附加到记录器的处理程序来决定消息最终存储或显示的方式、位置或什至。您也可以logging
默认配置为写入文件。你真的应该阅读文档,但是如果你调用logging.basicConfig(filename=log_file_name)
wherelog_file_name
是你想要写入消息的文件的名称(请注意,你必须在logging
调用其他任何内容之前执行此操作),然后所有消息都记录到所有记录器(除非稍后会进行一些进一步的重新配置)将被写在那里。请注意记录器设置的级别;如果内存可用,info
则低于默认日志级别,因此您必须level=logging.INFO
在参数中包含 以使basicConfig
您的消息最终出现在文件中。
至于问题的另一部分,logging.getLogger(some_string)
返回一个Logger
对象,从根记录器插入到层次结构中的正确位置,名称为some_string
. 不带参数调用,它返回根记录器。 __name__
返回当前模块的名称,因此logging.getLogger(__name__)
返回一个Logger
名称设置为当前模块名称的对象。这是与 一起使用的常见模式logging
,因为它使记录器结构反映代码的模块结构,这通常使记录消息在调试时更加有用。
要获取简单文件记录器的日志位置,请尝试
logging.getLoggerClass().root.handlers[0].baseFilename
要查找日志文件位置,请尝试log
在您的环境中的 Python shell 中实例化您的对象并查看以下值:
log.handlers[0].stream
对此有一些很好的答案,但最佳答案对我不起作用,因为我使用的是不同类型的文件处理程序,而 handler.stream 不提供路径,而是文件句柄,从中获取路径是有点不明显。这是我的解决方案:
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)
很好的问题@zallarak。不幸的是,虽然它们很容易创建,Loggers
但很难检查。这将获取所有Handlers
a的文件名logger
:
filenames = []
for handler in logger.handlers:
try:
filenames.append(handler.fh.name)
except:
pass
该try
块处理文件名查找失败时发生的异常。