在 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 不创建日志文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 postgres 中运行时查询计划更改

为啥我的代码在线程 6:NSOperationQueue 中运行时会崩溃?

服务在android中运行时弹出窗口

当程序在 IntelliJ 中运行时,为啥我会收到 SSLHandshakeException 作为 JAR?

程序在tkinter中运行时如何制作新标签?

为啥实体框架在不同的 AppDomain 中运行时会明显变慢?