2

I would like to save in superwrapper.log all logging lines but only show in console the INFO. If I remove the # of filename line , the file is okey but I don't see anything in the console.

if __name__ == '__main__': logging.basicConfig( #filename='superwrapper.log', level=logging.DEBUG, format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) 2020-04-28 11:41:09.698 INFO common - handle_elasticsearch: Elastic connection detected 2020-04-28 11:41:09.699 INFO superwrapper - <module>: Cookies Loaded: |TRUE| 2020-04-28 11:41:09.715 DEBUG connectionpool - _new_conn: Starting new HTTPS connection (1): m.facebook.com:443 

3 Answers 3

5

You can use multiple handlers. logging.basicConfig can accept handlers as an argument starting in Python 3.3. One is required for logging to the log file and one to the console. You can also set the handlers to have different logging levels. The simplest way I can think of is to do this:

import logging import sys file_handler = logging.FileHandler('superwrapper.log') console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) logging.basicConfig( level=logging.DEBUG, format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', handlers=[ file_handler, console_handler ] ) 

One thing to note is the StreamHandler writes to strerr. Usually you will want to override this with sys.stdout

Sign up to request clarification or add additional context in comments.

Comments

1

You can set up multiple loggers. This will get rid of the DEBUG messages, but note that messages of a higher severity will still be broadcast (e.g. 'WARNING' and 'ERROR').

This exact scenario is in the logging cookbook of the Python docs:

import logging # set up logging to file - see previous section for more details logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M', filename='/temp/myapp.log', filemode='w') # define a Handler which writes INFO messages or higher to the sys.stderr console = logging.StreamHandler() console.setLevel(logging.INFO) # set a format which is simpler for console use formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') # tell the handler to use this format console.setFormatter(formatter) # add the handler to the root logger logging.getLogger('').addHandler(console) # Now, we can log to the root logger, or any other logger. First the root... logging.info('Jackdaws love my big sphinx of quartz.') # Now, define a couple of other loggers which might represent areas in your # application: logger1 = logging.getLogger('myapp.area1') logger2 = logging.getLogger('myapp.area2') logger1.debug('Quick zephyrs blow, vexing daft Jim.') logger1.info('How quickly daft jumping zebras vex.') logger2.warning('Jail zesty vixen who grabbed pay from quack.') logger2.error('The five boxing wizards jump quickly.') 

In the example given by the cookbook, you should see in the console all the 'INFO', 'WARNING' and 'ERROR' messages, but only the log file will hold the 'DEBUG' message.

Comments

0

@Alan's answer was great, but it also wrote the message from the root logger, which was too much for me, because I was afraid that the size of log file would get out of control. So I modified it like below to only log what I specified and nothing extra from the imported modules.

import logging # set up logging to file - see previous section for more details logging.basicConfig(format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M', filename='/temp/myapp.log', filemode='w') logger = logging.getLogger('myapp') logger.setLevel(logging.DEBUG) # define a Handler which writes INFO messages or higher to the sys.stderr console = logging.StreamHandler() console.setLevel(logging.INFO) # set a format which is simpler for console use formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') # tell the handler to use this format console.setFormatter(formatter) # add the handler to your logger logger.addHandler(console) 

Then in my app, I logged like below just using logger (without any numbers).

logger.debug('Quick zephyrs blow, vexing daft Jim.') logger.info('How quickly daft jumping zebras vex.') logger.warning('Jail zesty vixen who grabbed pay from quack.') logger.error('The five boxing wizards jump quickly.') 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.