通过IPython笔记本运行时,python日志默认存储在哪里?

时间:2014-07-13 11:38:03

标签: python-2.7 ipython-notebook

在我写的一个IPython笔记本单元格中:

import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
handler = logging.FileHandler('model.log')
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

请注意,我提供的是文件名,但不提供路径。

我在哪里可以找到该日志? (跑了'找'并找不到它......)

2 个答案:

答案 0 :(得分:7)

有多种方法可以设置IPython工作目录。如果您未在IPython配置文件/配置,环境或笔记本中设置任何内容,则日志应位于您的工作目录中。还可以尝试$ ipython locate打印默认的IPython目录路径,日志可能就在那里。

如何给它一个绝对的文件路径来查看它是否有效?

除此之外,对logging.basicConfig的调用似乎没有在IPython笔记本中做任何事情:

# In:
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger()
logger.debug('root debug test')

没有输出。

根据文档,如果根记录器已经为其配置了处理程序,则logging.basicConfig不会执行任何操作。这似乎是这种情况,IPython显然已经设置了根记录器。我们可以确认一下:

# In:
import logging
logger = logging.getLogger()
logger.handlers

# Out:
[<logging.StreamHandler at 0x106fa19d0>]

因此我们可以尝试手动设置根记录器级别:

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.debug('root debug test')

在笔记本中产生格式化输出:

enter image description here

现在设置文件记录器:

# In:
import logging

# set root logger level
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)

# setup custom logger
logger = logging.getLogger(__name__)
handler = logging.FileHandler('model.log')
handler.setLevel(logging.INFO)
logger.addHandler(handler)

# log
logger.info('test info my')

导致将输出写入笔记本和 model.log 文件,这对我来说位于我启动IPython和笔记本的目录中。

请注意,在不重新启动IPython内核的情况下重复调用此代码将导致在每次运行时创建并将另一个处理程序附加到记录器,并且每次日志调用时记录到文件的消息数将会增加。 / p>

答案 1 :(得分:2)

在basicConfig中声明日志文件的路径,如下所示:

log_file_path = "/your/path/"
logging.basicConfig(level   =   logging.DEBUG,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    filename    =   log_file_path,
                    filemode    =   'w')

然后,您可以开始记录,如果需要,为什么不在控制台添加不同的日志格式:

# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger().addHandler(console)
logger = logging.getLogger()

etvoilà。