当我在PyCharm中运行时,logging basicConfig没有创建日志文件?

47 人关注

当我在终端运行以下代码时,它创建了一个日志文件

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创建一个日志文件,我必须做什么?

4 个评论
也许PyCharm设置了一个不同的工作目录,这意味着文件最终出现在另一个地方。试着提供一个完整的路径。
你的第二个代码块工作得非常好,在PyCharm中为我创建了一个日志文件。
我提供了一个完整的路径,如下所示 logging.basicConfig(filename='home/ra/myapp1.txt', level=logging.INFO) logging.info('Started') 但是没有创建文件
@RamnathReddy 你有没有尝试用.log代替.txt的完整文件路径?你是否也试过用ls/pwd/dir来找出终端的位置?
python
pycharm
Ramnath Reddy
Ramnath Reddy
发布于 2015-06-16
8 个回答
Seal
Seal
发布于 2020-12-16
已采纳
0 人赞同

我遇到了同样的问题,发现以前在这里提供的答案没有一个能用。也许这个问题在很久以前就被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)`

See 日志.basicConfig参数。

力。如果这个关键字参数被指定为 "true",那么在执行其他参数所指定的配置之前,附加到根记录仪上的任何现有处理程序都会被移除并关闭。

这确实为我解决了问题。我怀疑这个问题是basicConfig()和代码中其他地方的 "适当 "日志设置之间的冲突(我在测试中使用basicConfig(),在常规代码中使用不同的设置)。谢谢!
@zwep ,它是有效的,因为根据文件规定 docs.python.org/3/library/logging.html#logging.basicConfig , "如果根记录器已经为其配置了处理程序,则此函数不做任何事情。"
noobie
noobie
发布于 2020-12-16
0 人赞同

我不记得我从哪里得到的,否则我就会提供一个链接。但前段时间在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)
    
Neur0
Neur0
发布于 2020-12-16
0 人赞同

为什么会发生这种错误的答案是 this :

basicConfig() 的呼唤应运而生 before any calls to debug() , info() etc.

如果你这样做,basicConfig就不能创建和写入一个新文件。 这里我在 logging.basicConfig() 之前调用了 logging.info()

Don't:

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() 之前得到。
stelios
stelios
发布于 2020-12-16
0 人赞同

Maximas是对的。文件路径是相对于执行环境而言的。然而,你可以试试动态路径解析的方法,而不是写下绝对路径。

filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'ram.log')
logging.basicConfig(filename=filename, level=logging.DEBUG)

这假定ram.log与包含上述代码的目录驻留在同一目录中(这就是为什么使用__file__的原因)。

替换代码0】会不会更短,更容易阅读?
@salhin 那是相对于工作目录而不是源代码目录的,所以这取决于你想实现什么。
Maximas
Maximas
发布于 2020-12-16
0 人赞同

这确实在pycharm终端内使用Py终端创建了一个日志。你需要检查终端所在的位置(在Windows上试试dir,在linux/mac上试试pwd)。不要只输入ram.log,而要使用你希望文件出现的完整文件路径。

logging.basicConfig(filename='/Users/Donkey/Test/ram.log', level=logging.DEBUG)
    
在文件名后面加上完整的路径,会有帮助!
komal ware
komal ware
发布于 2020-12-16
0 人赞同

By using force it get solve. like logging.basicConfig(filename="test.log", force=True)

这个解决方案已经提供了 this existing answer. When answering old questions, please ensure your answer provides a distinct and valuable contribution to the Q&A.
Sukalpa Sursen
Sukalpa Sursen
发布于 2020-12-16
0 人赞同

我曾经遇到过这个错误,但我通过在 basicConfig 中添加 force=True 来解决。

logging.basicConfig(level=logging.INFO,filename='C:\\Users\\sukal\\PycharmProjects\\Test\\Logs\\Automation.log',format=Log_Format,force=True)
    
Anil MK
Anil MK
发布于 2020-12-16
0 人赞同
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')