代码之家  ›  专栏  ›  技术社区  ›  Kyle Brandt

从IPython笔记本中的日志模块获取输出

  •  191
  • Kyle Brandt  · 技术社区  · 11 年前

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

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

    有人知道如何制作,这样我就可以看到笔记本里的“测试”信息吗?

    10 回复  |  直到 1 年前
        1
  •  185
  •   falsetru    11 年前

    请尝试以下操作:

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

    根据 logging.basicConfig :

    通过创建 带有默认格式化程序的StreamHandler并将其添加到根目录 记录器。函数debug()、info()、warning()、error()和 如果没有处理程序,critical()将自动调用basicConfig() 为根记录器定义。

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

    这看起来像是ipython笔记本在某个地方调用了basicConfig(或设置处理程序)。

        2
  •  91
  •   David Jones Jake Shorty    5 年前

    如果您仍然想使用 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
  •  39
  •   skulz00    9 年前

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

        4
  •  29
  •   Ataxias    8 年前

    请记住,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
  •  21
  •   mcsim    6 年前

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

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

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

        6
  •  14
  •   Cristian Ciupitu    6 年前

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

    有关详细信息,请参阅 IPython kernel options

        7
  •  6
  •   wjmatthews    2 年前

    自日志记录版本3.8 a起 force 添加了一个参数,用于删除任何现有的处理程序,从而允许 basicConfig 工作。这在IPython版本7.29.0和Jupyter实验室版本3.2.1上起到了作用。

    import logging
    logging.basicConfig(level=logging.DEBUG,
                        force = True)
    logging.debug("test")
    
        8
  •  5
  •   yanniskatsaros    4 年前

    我想要一个简单明了的答案,有风格优美的输出,所以这里是我的建议

    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
  •  4
  •   Brig    5 年前

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

    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")
    
        10
  •  0
  •   william_grisaitis    3 年前

    设置

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