I am working on implementing logging within my Python project and have hit a bit of a snag. I am trying to set up my logging such that the Handlers, and Formatters are all organized into a configuration file. What I am trying to do at the moment is to set up my fileHandler
such that it will create a log file that looks something like this: YYYY_MM_DD.log
obviously with the Y's representing the year, M's representing the month, and D's representing the day.
This is what I have attempted with my config file:
[loggers]
keys=root,MainLogger
[handlers]
keys=fileHandler, consoleHandler
[formatters]
keys=logFormatter, consoleFormatter
[logger_root]
level=DEBUG
handlers=fileHandler
[logger_MainLogger]
level=DEBUG
handlers=fileHandler, consoleHandler
qualname=MainLogger
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=logFormatter
args=(datetime.now().strftime('%Y_%m_%d.log'), 'a')
[formatter_logFormatter]
format=%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s
[formatter_consoleFormatter]
format=%(asctime)s | %(levelname)-8s | %(fillname)s-%(funcName)s-%(lineno)04d | %message)s
The file I am using to test the configuration is pretty simple:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('MainLogger')
logger.debug("TEST")
The specific error I am getting at the moment is:
configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: "%Y_%m_%d.log'), 'a')"
I've tried changing the %Y
, %m
, and %d
as the error says, but that doesn't fix the problem. How do I go about setting up the config file so that my log files look the way I want them to?
I should note when I change the filename to test.log
everything worked fine, so this is the only error I seem to be having with this.
This uses content from your config file, but does not access the file directly. You create your own filehandler and then add it to the logger.
Note that
a
(append) is the defaultmode
parameter for a FileHandler.Using double '%'-characters in the format string in combination with the approach suggested by Abhishek led to a working solution in my case (Python 3.5):
The filehandler in the config file should then look similar to this one:
This worked for me.
Update This: args=(datetime.now().strftime('%Y_%m_%d.log'), 'a')
To
args=(__import__("datetime").datetime.now().strftime('%Y_%m_%d.log'), 'a')
Reference (Example no 3): http://python-reference.readthedocs.io/en/latest/docs/functions/eval.html
Maybe try changing the name after you've loaded the config file:
This also works
Logfile name:04_30_2018_10_03_01.log
You can't use
datetime
in a config file, as it doesn't know what it means. You can however add theFilehandler
in the python file itself:This way you can set the date as the file name in the handler.
This is the config file, note that you had a typo in the last formatter, you put
fillname
instead offilename
and you forgot(
inmessage
.This Should work just fine.