【问题标题】:Logging basicConfig not creating log file when I run in PyCharm?在 PyCharm 中运行时记录 basicConfig 不创建日志文件?
【发布时间】: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 来找出终端的位置?

标签: python pycharm


【解决方案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!请阅读游览tourHow to Answer 一个问题。这个问题是 5 年前提出的。
      猜你喜欢
      • 2011-02-12
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2021-11-12
      • 2018-07-10
      相关资源
      最近更新 更多