Skip to content Skip to sidebar Skip to footer

How To Share A File Between Modules For Logging In Python

I wanted to log messages from different module in python to a file. Also I need to print some messages to console for debugging purpose. I used logger module for this purpose . But

Solution 1:

Here is a script that creates two loggers, use the one you wish to log to a file or stdout. The question is : on which criteria do you choose to log to stdout or file, knowing that (from your question) you don't want the criteria to be the log level (debug, error, critical...)

#!/usr/bin/python

import logging

logger_stdout = logging.getLogger('logger_stdout')
logger_stdout.setLevel(logging.DEBUG)
sh = logging.StreamHandler()
sh.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger_stdout.addHandler(sh)
logger_stdout.debug('stdout debug message')

logger_file = logging.getLogger('logger_file')
logger_file.setLevel(logging.DEBUG)
fh = logging.FileHandler("foo.log")
fh.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger_file.addHandler(fh)
logger_file.debug('file debug message')

And when I run this script:

D:\jrx\jrxpython                                                          
λ python essai.py                                                         
2015-02-0311:12:07,210 - logger_stdout - DEBUG - stdoutdebug message    

D:\jrx\jrxpython                                                          
λ cat foo.log2015-02-0311:12:07,224 - logger_file - DEBUG - file debug message        

D:\jrx\jrxpython                                                          
λ   

Solution 2:

CRITICAL is higher than ERROR:

You can also verify yourself:

>>>import logging>>>print logging.CRITICAL
50
>>>print logging.ERROR
40
>>>

There are two cases in logging:

Logging the same process - you should have several handlers with different logging levels based on how verbose the logs should be. A higher level means less output. That's why DEBUG is the lowest predefined log level - it writes everything for debug purposes.

Logging different processes - you should have several loggers set up, they can be accessed from anywhere in your code using logging.getLogger(name). This gives the same logger every time, so that logger set-up persists through the code and only needs to be executed once.

The first case demonsrates that you can't have an "error but not critical" log, since this is the opposite of how logs should work. You can have a "critical but not error" log, that is less verbose. This is what you probably want.

Post a Comment for "How To Share A File Between Modules For Logging In Python"