在 PyCharm 中运行时记录 basicConfig 不创建日志文件?
Posted
技术标签:
【中文标题】在 PyCharm 中运行时记录 basicConfig 不创建日志文件?【英文标题】:Logging basicConfig not creating log file when I run in PyCharm? 【发布时间】:2015-08-31 21:56:20 【问题描述】:当我在终端运行下面的代码时,它会创建一个日志文件
import logging
logging.basicConfig(filename='ramexample.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
但是当我在 PyCharm 中运行相同的代码(使用不同的 filename='ram.log'
)时,它不会创建任何日志文件。为什么?
import logging
logging.basicConfig(filename='ram.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
如何使用 PyCharm 创建日志文件?
【问题讨论】:
也许 PyCharm 设置了一个不同的工作目录,这意味着文件在另一个地方结束。尝试提供完整路径。 您的第二段代码运行良好,并在 PyCharm 中为我创建了一个日志文件。 我提供了一个完整的路径,如下所示 logging.basicConfig(filename='home/ra/myapp1.txt', level=logging.INFO) logging.info('Started') 但是没有创建文件 @RamnathReddy 您是否尝试过 .log 而不是 .txt 的完整文件路径?您是否也尝试过 ls/pwd/dir 来找出终端的位置? 【参考方案1】:我遇到了同样的问题,发现之前在这里提供的答案都不起作用。也许这个问题很久以前就被 Ramnath Reddy 解决了,但是我在网上的任何地方都找不到正确的答案。
幸运的是,我通过在logging.basicConfig()
之前添加以下行,从同事的代码中找到了解决方案。
# Remove all handlers associated with the root logger object.
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
试试看它是否对遇到同样问题的人有帮助。
Python 3.8:新选项force
可用于在调用basicConfig()
时自动删除根处理程序。
例如:
logging.basicConfig(filename='ramexample.log', level=logging.DEBUG, force=True)`
见logging.basicConfig参数:
force:如果将此关键字参数指定为 true,则在执行其他参数指定的配置之前,将删除并关闭任何附加到根记录器的现有处理程序。
【讨论】:
这确实为我解决了问题。我怀疑这个问题是 basicConfig() 和代码中其他地方的“正确”日志记录设置之间的冲突(我在测试中使用 basicConfig() 而在常规代码中使用不同的设置)。谢谢! @zwep ,它之所以有效,是因为根据文档 docs.python.org/3/library/logging.html#logging.basicConfig ,“如果根记录器已经为它配置了处理程序,则此函数不会执行任何操作。”【参考方案2】:我不记得我从哪里得到的,否则我会提供一个链接。但是前段时间在 jupyter 笔记本中使用时遇到了同样的问题,这解决了它:
import logging
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='mylog.log', mode='a')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.DEBUG)
【讨论】:
【参考方案3】:Maximas 是对的。文件路径是相对于执行环境的。但是,您可以尝试动态路径解析方法,而不是写下绝对路径:
filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'ram.log')
logging.basicConfig(filename=filename, level=logging.DEBUG)
这假定ram.log
与包含上述代码的目录位于同一目录中(这就是使用__file__
的原因)。
【讨论】:
filename = ''.join([os.getcwd(),'ram.log'])
会更短更容易阅读吗?
@salhin 那是相对于工作目录而不是源代码目录的,所以这取决于你想要实现的目标。【参考方案4】:
出现这个错误的答案是this:
对
basicConfig()
的调用应在对debug()
、info()
等的任何调用之前进行。
如果这样做,basicConfig 将无法创建和写入新文件。
在这里,我在logging.basicConfig()
之前调用了logging.info()
。
不要:
import logging
logging.info("root") # call to info too early
logging.basicConfig(filename="rec/test.log", level=logging.DEBUG) # no file created
【讨论】:
对于它的价值,当我的代码具有创建不同记录器的***导入时,我遇到了同样的问题。因此,即使您的主模块以logging.basicConfig
开头,您也很可能在项目的其他地方有 logging.info/debug 语句,这些语句首先通过导入运行。
是的,它解决了我的问题......也许一个常见的情况是,一个人改变了代码的顺序,所以一些 logging.info()
比 logging.basicConfig()
更早。【参考方案5】:
这确实使用其中的 Py 终端在 pycharm 终端中创建了一个日志。您需要检查终端的位置(在 Windows 上尝试 dir 或在 linux/mac 上尝试 pwd)。不要只放入 ram.log,而是使用您希望文件出现的位置的完整文件路径。 例如。
logging.basicConfig(filename='/Users/Donkey/Test/ram.log', level=logging.DEBUG)
【讨论】:
在文件名后添加完整路径有帮助!【参考方案6】:我曾经遇到过这个错误,但我通过在basicConfig
中添加force=True
解决了:
logging.basicConfig(level=logging.INFO,filename='C:\\Users\\sukal\\PycharmProjects\\Test\\Logs\\Automation.log',format=Log_Format,force=True)
【讨论】:
【参考方案7】:import logging
class LogGen:
@staticmethod
def loggen():
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='.\\logs\\automation.log', mode='a')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.INFO)
return logger
【讨论】:
欢迎来到 SO!请阅读游览tour 和How to Answer 一个问题。这个问题是 5 年前提出的。以上是关于在 PyCharm 中运行时记录 basicConfig 不创建日志文件?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的代码在线程 6:NSOperationQueue 中运行时会崩溃?