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