Get Output From the logging Module in IPython Notebook

前端 未结 9 1573
悲哀的现实
悲哀的现实 2020-11-30 19:19

When I running the following inside IPython Notebook I don\'t see any output:

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


        
相关标签:
9条回答
  • 2020-11-30 19:44

    You can configure logging by running %config Application.log_level="INFO"

    For more information, see IPython kernel options

    0 讨论(0)
  • 2020-11-30 19:45

    What worked for me now (Jupyter, notebook server is: 5.4.1, IPython 7.0.1)

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

    Now I can use logger to print info, otherwise I would see only message from the default level (logging.WARNING) or above.

    0 讨论(0)
  • 2020-11-30 19:47

    I setup a logger for both file and I wanted it to show up on the notebook. Turns out adding a filehandler clears out the default stream handlder.

    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")
    
    0 讨论(0)
  • 2020-11-30 19:50

    My understanding is that the IPython session starts up logging so basicConfig doesn't work. Here is the setup that works for me (I wish this was not so gross looking since I want to use it for almost all my notebooks):

    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)
    

    Now when I run:

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

    I get a "mylog.log" file in the same directory as my notebook that contains:

    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.
    

    Note that if you rerun this without restarting the IPython session it will write duplicate entries to the file since there would now be two file handlers defined

    0 讨论(0)
  • 2020-11-30 19:52

    If you still want to use basicConfig, reload the logging module like this

    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')
    
    0 讨论(0)
  • 2020-11-30 19:52

    I wanted a simple and straightforward answer to this, with nicely styled output so here's my recommendation

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

    Then you can use log.info() or any of the other logging levels anywhere in your notebook with output that looks like this

    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
    
    0 讨论(0)
提交回复
热议问题