Logging setLevel is being ignored

前端 未结 6 1167
我寻月下人不归
我寻月下人不归 2020-12-03 00:15

The below code is copied from the documentation. I am supposed to be able to see all the info logs. But I don\'t. I am only able to see the warn and above even though I\'ve

相关标签:
6条回答
  • 2020-12-03 00:52

    This is technically also an "answer", because it can "solve" the problem. BUT I definitely DO NOT like it. It is not intuitive, and I lost 2+ hours over it.

    Before:

    import logging
    logger = logging.getLogger('foo')
    logger.setLevel(logging.INFO)
    logger.info('You can not see me')
    # Or you can just use the following one-liner in command line.
    # $ python -c "import logging; logger = logging.getLogger('foo'); logger.setLevel(logging.INFO); logger.info('You can not see me')"
    

    After:

    import logging
    
    logging.debug('invisible magic')  # <-- magic
    
    logger = logging.getLogger('foo')
    logger.setLevel(logging.INFO)
    logger.info('But now you can see me')
    # Or you can just use the following one-liner in command line.
    $ python -c "import logging; logging.debug('invisible magic'); logger = logging.getLogger('foo'); logger.setLevel(logging.INFO); logger.info('But now you see me')"
    

    PS: Comparing it to the current chosen answer, and @Vinay-Sajip's explanation, I can kind of understand why. But still, I wish it was not working that way.

    0 讨论(0)
  • 2020-12-03 00:59

    You have to set the basicConfig of the root logger to DEBUG, then you can set the level of your individual loggers to more restrictive levels.

    This is not what I expected. Here is what I had to do:

    #!/usr/bin/env python3
    
    import logging
    # by default this is WARNING.  Leaving it as WARNING here overrides 
    # whatever setLevel-ing you do later so it seems they are ignored.
    logging.basicConfig(level=logging.DEBUG)
    
    l = logging.getLogger(__name__)
    l.setLevel(level=logging.INFO)
    # if I hadn't called basicConfig with DEBUG level earlier, 
    # info messages would STILL not be shown despite calling 
    # setLevel above.  However now debug messages will not be shown 
    # for l because setLevel set it to INFO
    
    l.warning('A warning message will be displayed')
    l.info('A friendly info message will be displayed')
    l.debug('A friendly debug message will not be displayed')
    
    0 讨论(0)
  • 2020-12-03 01:04

    Try running logging.basicConfig() in there. Of note, I see you mention INFO, but use DEBUG. As written, it should show all five messages. Swap out DEBUG with INFO, and you should see four messages.

    import logging
    
    logging.basicConfig()
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    

    edit: Do you have logging set up elsewhere in your code already? Can't reproduce the exact behavior you note with the specific code provided.

    0 讨论(0)
  • 2020-12-03 01:06

    Replace the line

    logger.setLevel(logging.DEBUG)
    

    with

    logging.basicConfig(level=logging.DEBUG, format='%(message)s')
    

    and it should work as expected. If you don't configure logging with any handlers (as in your post - you only configure a level for your logger, but no handlers anywhere), you'll get an internal handler "of last resort" which is set to output just the message (with no other formatting) at the WARNING level.

    0 讨论(0)
  • 2020-12-03 01:15

    As pointed by some users, using:

    logging.basicConfig(level=logging.DEBUG, format='%(message)s')
    

    like written in the accepted answare is not a goot option because it sets the loglevel globally, so it will log debug message from every logger.

    In my case the best solution to set log level just for my logger was:

    import logging
    
    logger = logging.getLogger('MyLogger')
    handler = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.setLevel(logging.DEBUG)
    

    Not really intuitive solution, but is necessary if you want to set loglevel only for 'MyLogger' and not globally.

    0 讨论(0)
  • 2020-12-03 01:17

    The accepted answer does not work for me on Win10, Python 3.7.2.

    My solution:

    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    

    It's order sensitive.

    0 讨论(0)
提交回复
热议问题