How to use logging with python's fileConfig and configure the logfile filename

PythonFileLoggingConsole

Python Problem Overview


I have a logging configuration file for logging to console and a file with different formats and levels. In my python script I can load this configuration and basically console and file output are ok.

I set the file name in the config file as shown below.

Is it possible to set that file name in the python script itself?

python code:

# set up logging
logging.config.fileConfig(loginipath)
logger = logging.getLogger('sLogger')

# log something
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

logging config file:

[loggers]
keys=root,sLogger

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=fileFormatter,consoleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_sLogger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=sLogger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=WARNING
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=fileFormatter
args=('logfile.log',)

[formatter_fileFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

[formatter_consoleFormatter]
format=%(levelname)s - %(message)s
datefmt=

Python Solutions


Solution 1 - Python

Change your handler_fileHandler section like so:

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=fileFormatter
args=('%(logfilename)s',)

and then add a defaults argument to the fileConfig call

logging.config.fileConfig(loginipath, defaults={'logfilename': '/var/log/mylog.log'})

Solution 2 - Python

Both handlers worked for me:

(1)

logging.config.fileConfig( 'logging.ini' , disable_existing_loggers=False)

            
[handler_myhandler1]
class=FileHandler
level=DEBUG
formatter=form01
args=('python.log', 'w')

(2)

logging.config.fileConfig( 'logging.ini' , disable_existing_loggers=False, defaults={ 'logfilename' : getSomeName() } )

[handler_myhandler2]
class=FileHandler
level=DEBUG
formatter=form01
args=('%(logfilename)s','w')

after reading examples at https://docs.python.org/2/library/logging.config.html

Solution 3 - Python

Try calling logging.config.dictConfig() after fileConfig() and just setting the filename.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMichaView Question on Stackoverflow
Solution 1 - PythonNavinView Answer on Stackoverflow
Solution 2 - PythonMG2View Answer on Stackoverflow
Solution 3 - PythonJohn ZwinckView Answer on Stackoverflow