Python FileHandler未将输出发送到我想要的任何位置
第一次使用日志模块。我有两个问题: 我在创建FileHandler时发现的所有示例都只使用了一个伪文件名,但我希望日志文件具有特定的标题格式Python FileHandler未将输出发送到我想要的任何位置,python,logging,Python,Logging,第一次使用日志模块。我有两个问题: 我在创建FileHandler时发现的所有示例都只使用了一个伪文件名,但我希望日志文件具有特定的标题格式 log = time.strftime('./logs/'+'%H:%M:%S %d %b %Y', time.localtime())+'.log' logger = logging.getLogger('myproject') formatter = logging.Formatter('%(asctime)s %(message)s', '%H:%M
log = time.strftime('./logs/'+'%H:%M:%S %d %b %Y', time.localtime())+'.log'
logger = logging.getLogger('myproject')
formatter = logging.Formatter('%(asctime)s %(message)s', '%H:%M:%S %d %b %Y')
handler = logging.FileHandler(log)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
这在一开始似乎是可行的,因为日志文件是创建的,但是当我终止脚本并检查它时,它里面什么都没有。在建议使用带有open(log)的作为f:
之前,请使用f
代替handler=logging中的log
。FileHandler(log)
会给我关于文件未创建的错误信息。我没有写入日志文件有什么错?是不是因为我对文件名太过聪明了
第二个问题可能以某种方式包含了第一个问题。我真正想要的是一种同时写入控制台和日志文件的方法,因为这个脚本需要很长时间,我想衡量进度。我已经看到了关于如何做到这一点的答案,例如,但所有这些似乎都假设我希望为两个不同的输出使用不同级别的日志记录;我不。顺便说一句,我确实意识到,如果我的脚本没有动态生成日志文件的名称,我可以执行类似于python myscript.py | tee log.file
的操作,以避免生成不同的处理程序
我觉得我很难回答我的第二个问题,因为第一个问题涉及的变量,但我现在有雾,因为疾病和随后的睡眠不足。如果有人能像一个五岁的孩子一样向我解释如何以相同的输出同时写入控制台和日志文件,我将不胜感激
非常感谢。您的代码正在配置名为“myproject”的记录器:
logger = logging.getLogger('myproject')
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
如果在该记录器上使用方法,则一切都将正常工作:
logger.info('foo bar')
logging.getLogger('myproject').info('foo bar')
但如果只使用模块级功能,则不会:
logging.info('foo bar')
为什么??因为模块级函数使用默认的根记录器,而不是您配置的根记录器。有关如何工作的详细信息,请参见
通常,处理此问题的方法是为每个模块创建模块级logger
对象,如下所示:
logger = logging.getLogger(__name__)
self.logger = logging.getLogger('{}.{}'.format(__name__, cls.__name__))
…或类或实例属性记录器
,如下所示:
logger = logging.getLogger(__name__)
self.logger = logging.getLogger('{}.{}'.format(__name__, cls.__name__))
然后通过logger
或self.logger
对象执行所有操作,而不是通过模块级功能
那么,为什么模块级功能甚至存在呢?主要是为了方便简单的程序。如果这听起来适合你,并且你想使用它们,你可以;您只需配置根记录器,而不是另一个。将第一行更改为:
logger = logging.getLogger()
现在,当您配置
logger
时,您也在配置模块级功能。uhhm。我想我是一名荣誉Windows开发人员?我的脚本位于
中,我打算在日志中创建日志文件,该日志文件位于同一位置。就像我说的,如果没有其他东西的话,文件确实会被创建;现在从CLI运行脚本,看着它做一些事情,或者什么都不做。好的,很好,我们已经完成了所有这些;现在让我看看我是否能找出真正的问题另一个可能愚蠢的问题:您是否使用logger.log
或logging.log
(或使用debug
,等等;问题是您是否在返回的记录器上使用方法,还是使用顶级模块函数)。这不是一个愚蠢的问题。我自己也不知道。你在问题主体中看到的一切都是我如何拼凑的。我只想到我需要超越文档中显示的基本日志记录。天哪。现在我可以tail-f myfile
查看输出。非常感谢你!