2014-07-13 38 views
5

在IPython的笔记本电池我写道:在运行IPython笔记本时,python日志默认存储在哪里?

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) 

请注意,我提供一个文件名,而不是路径。

我在哪里可以找到该日志? (运行'查找'并找不到它...)

回答

7

有多种方法可以设置IPython工作目录。如果你没有在你的IPython profile/config,environment或notebook中设置这些,日志应该在你的工作目录中。也试试$ 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内核的情况下重复调用这段代码将导致在每次运行时为记录器创建并附加另一个处理程序,并且随着每次日志调用记录到文件的消息数量将增加。

+0

谢谢,我有搜索目录,它不存在... – user2808117

+0

@ user2808117 Humm,它应该在那里或在当前的工作目录,然后,你从哪里启动笔记本。你使用IPython profile/config并设置'c.NotebookManager.notebook_dir','c.FileNotebookManager.notebook_dir'或'c.NotebookApp.notebook_dir'? – famousgarkin

+0

我有一个配置文件,但该属性未配置。难道是由于某些原因,日志文件不是在这种情况下创建的? (我用sudo运行'find',在根目录下,找不到文件) – user2808117

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à。