【问题标题】:Get Output From the logging Module in IPython Notebook从 IPython Notebook 中的日志记录模块获取输出
【发布时间】:2013-09-18 04:14:19
【问题描述】:

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

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

有人知道怎么做,这样我就可以在笔记本中看到“测试”消息了吗?

【问题讨论】:

  • 您使用的是什么版本的 IPython,因为它适用于 1.0?
  • @ViktorKerkez ipython3 notebook --version 返回1.0.0
  • imgur.com/1b7nGZz 当我尝试你的代码时,我得到了这个。
  • @ViktorKerkez:是的,我不明白,我想我应该提出问题......

标签: python logging jupyter-notebook jupyter


【解决方案1】:

尝试以下操作:

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

根据logging.basicConfig

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

如果根记录器已经有处理程序,这个函数什么也不做 为其配置。

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

【讨论】:

  • 在普通的 IPython 控制台中也会发生同样的情况:它不会打印任何内容,除非创建了根 logger
  • 此解决方案在ipykernel 4.5 中再次有效(可能早于4.4)github.com/jupyter/notebook/issues/1397
  • 这不再起作用了。不适用于 Jupyter Notebook 5.3.0
  • 适用于以下 jupyter 安装:``` $ jupyter --version jupyter core:4.6.3 jupyter-notebook:未安装 qtconsole:未安装 ipython:7.18.1 ipykernel:5.3。 4 jupyter 客户端:6.1.7 jupyter lab:未安装 nbconvert:未安装 ipywidgets:未安装 nbformat:未安装 traitlets:5.0.5 ```
  • 请注意,logging.basicConfig 中的更改似乎需要重启笔记本内核才能生效。
【解决方案2】:

如果你还想使用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')

【讨论】:

【解决方案3】:

我的理解是 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 会话的情况下重新运行它,它会将重复的条目写入文件,因为现在将定义两个文件处理程序

【讨论】:

  • 为了不那么“粗看”,将代码放在 python 路径上的模块中,然后导入它。未来更漂亮,更容易升级。
  • 或者使用 logging.config.fileConfig('logging.conf') 并将所有设置都放在那里。
【解决方案4】:

请记住,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!')

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

    • 是的,这行得通。一个必须运行basicConfig() tp 使其工作。
    【解决方案6】:

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

    欲了解更多信息,请参阅IPython kernel options

    【讨论】:

    • 欢迎来到 StackOverflow 并感谢您的帮助。您可能希望通过添加一些解释来使您的答案变得更好。
    • 这对我来说实际上是最有用的答案!
    • 您可以添加几行示例吗?调用以打印日志消息的记录器句柄是什么?
    • 至少 ipython 7.9.0(或 jupyter 6.0.2)会忽略建议的代码,因为它不支持运行控制台中的此类。运行%config 查看支持的分类,Application 不是其中之一。 ipython 7.9.0 在这里。
    【解决方案7】:

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

    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")
    

    【讨论】:

    【解决方案8】:

    我想要一个简单而直接的答案,并带有漂亮的输出,所以这是我的建议

    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() 或任何其他logging levels,输出如下所示

    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
    

    【讨论】:

      【解决方案9】:

      设置

      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
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        相关资源
        最近更新 更多