Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python FileHandler未将输出发送到我想要的任何位置_Python_Logging - Fatal编程技术网

Python 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

第一次使用日志模块。我有两个问题:

我在创建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:%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
查看输出。非常感谢你!