169

当我在 IPython Notebook 中运行以下命令时,我看不到任何输出:

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")

任何人都知道如何制作它,以便我可以在笔记本中看到“测试”消息?

4

9 回答 9

169

尝试以下操作:

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

根据logging.basicConfig

通过使用默认格式化程序创建 StreamHandler 并将其添加到根记录器来为日志记录系统进行基本配置。如果没有为根记录器定义处理程序,函数 debug()、info()、warning()、error() 和 critical() 将自动调用 basicConfig()。

如果根记录器已经为其配置了处理程序,则此函数不执行任何操作。

似乎 ipython 笔记本在某处调用了 basicConfig(或设置处理程序)。

于 2013-09-15T04:55:39.240 回答
80

如果您仍想使用basicConfig,请像这样重新加载日志记录模块

from importlib import reload  # Not needed in Python 2
import logging
reload(logging)
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG, datefmt='%I:%M:%S')
于 2014-01-31T08:17:30.947 回答
37

我的理解是 IPython 会话会启动日志记录,因此 basicConfig 不起作用。这是适合我的设置(我希望这看起来不那么粗糙,因为我想将它用于几乎所有的笔记本电脑):

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)

现在当我运行时:

logging.error('hello!')
logging.debug('This is a debug message')
logging.info('this is an info message')
logging.warning('tbllalfhldfhd, warning.')

我在与我的笔记本相同的目录中获得了一个“mylog.log”文件,其中包含:

2015-01-28 09:49:25,026 - root - ERROR - hello!
2015-01-28 09:49:25,028 - root - DEBUG - This is a debug message
2015-01-28 09:49:25,029 - root - INFO - this is an info message
2015-01-28 09:49:25,032 - root - WARNING - tbllalfhldfhd, warning.

请注意,如果您在不重新启动 IPython 会话的情况下重新运行它,它会将重复的条目写入文件,因为现在将定义两个文件处理程序

于 2015-01-28T14:56:38.240 回答
25

请记住,stderr 是logging模块的默认流,因此在 IPython 和 Jupyter 笔记本中,除非您将流配置为 stdout,否则您可能看不到任何内容:

import logging
import sys

logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
                     level=logging.INFO, stream=sys.stdout)

logging.info('Hello world!')
于 2016-12-09T12:10:41.890 回答
17

现在对我有用(Jupyter,笔记本服务器是:5.4.1,IPython 7.0.1)

import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)

现在我可以使用 logger 来打印信息,否则我只会看到来自默认级别 ( logging.WARNING) 或更高级别的消息。

于 2018-10-21T14:43:16.060 回答
12

您可以通过运行配置日志记录%config Application.log_level="INFO"

有关更多信息,请参阅IPython 内核选项

于 2017-09-25T08:16:12.893 回答
4

我为这两个文件设置了一个记录器,我希望它显示在笔记本上。原来添加文件处理程序会清除默认流处理程序。

logger = logging.getLogger()

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# Setup file handler
fhandler  = logging.FileHandler('my.log')
fhandler.setLevel(logging.DEBUG)
fhandler.setFormatter(formatter)

# Configure stream handler for the cells
chandler = logging.StreamHandler()
chandler.setLevel(logging.DEBUG)
chandler.setFormatter(formatter)

# Add both handlers
logger.addHandler(fhandler)
logger.addHandler(chandler)
logger.setLevel(logging.DEBUG)

# Show the handlers
logger.handlers

# Log Something
logger.info("Test info")
logger.debug("Test debug")
logger.error("Test error")
于 2019-02-14T01:17:27.453 回答
3

我想要一个简单直接的答案,输出风格很好,所以这是我的建议

import sys
import logging

logging.basicConfig(
    format='%(asctime)s [%(levelname)s] %(name)s - %(message)s',
    level=logging.INFO,
    datefmt='%Y-%m-%d %H:%M:%S',
    stream=sys.stdout,
)
log = logging.getLogger('notebook')

然后,您可以在笔记本中的任何位置使用log.info()或任何其他日志记录级别,输出如下所示

2020-10-28 17:07:08 [INFO] notebook - Hello world
2020-10-28 17:12:22 [INFO] notebook - More info here
2020-10-28 17:12:22 [INFO] notebook - And some more
于 2020-10-28T22:36:25.137 回答
0

设置

import logging

# make a handler
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

# add it to the root logger
logging.getLogger().addHandler(handler)

从您自己的记录器记录

# make a logger for this notebook, set verbosity
logger = logging.getLogger(__name__)
logger.setLevel('DEBUG')

# send messages
logger.debug("debug message")
logger.info("so much info")
logger.warning("you've veen warned!")
logger.error("bad news")
logger.critical("really bad news")
2021-09-02 18:18:27,397 - __main__ - DEBUG - debug message
2021-09-02 18:18:27,397 - __main__ - INFO - so much info
2021-09-02 18:18:27,398 - __main__ - WARNING - you've veen warned!
2021-09-02 18:18:27,398 - __main__ - ERROR - bad news
2021-09-02 18:18:27,399 - __main__ - CRITICAL - really bad news

从其他库捕获日志记录

logging.getLogger('google').setLevel('DEBUG')

from google.cloud import storage

client = storage.Client()
2021-09-02 18:18:27,415 - google.auth._default - DEBUG - Checking None for explicit credentials as part of auth process...
2021-09-02 18:18:27,416 - google.auth._default - DEBUG - Checking Cloud SDK credentials as part of auth process...
2021-09-02 18:18:27,416 - google.auth._default - DEBUG - Cloud SDK credentials not found on disk; not using them
...
于 2021-09-02T18:32:48.870 回答