Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Logging - Set Date as Filename

Tags:

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.

like image 569
Skitzafreak Avatar asked Aug 01 '17 19:08

Skitzafreak


People also ask

How do you create a filename with a date and time in python?

For this, we will use the DateTime module. First, import the module and then get the current time with datetime. now() object. Now convert it into a string and then create a file with the file object like a regular file is created using file handling concepts in python.

How do you log time in python?

Date/Time in Log Messages To display the date and time of the occurrence of an event, you can use %(asctime)s in your format string in basicConfig() function. For example: import logging logging. basicConfig(format='%(asctime)s %(message)s') logging.


1 Answers

You can't use datetime in a config file, as it doesn't know what it means. You can however add the Filehandler in the python file itself:

import logging.config from datetime import datetime  logging.config.fileConfig('aaa.conf') logger = logging.getLogger('MainLogger')  fh = logging.FileHandler('{:%Y-%m-%d}.log'.format(datetime.now())) formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') fh.setFormatter(formatter)  logger.addHandler(fh) logger.debug("TEST") 

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 of filename and you forgot ( in message.

[loggers] keys=root,MainLogger  [handlers] keys=consoleHandler  [formatters] keys=consoleFormatter  [logger_root] level=DEBUG handlers=consoleHandler  [logger_MainLogger] level=DEBUG handlers=consoleHandler qualname=MainLogger propagate=0  [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=consoleFormatter args=(sys.stdout,)  [formatter_consoleFormatter] format=%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%(lineno)04d | %(message)s 

This Should work just fine.

like image 143
Dror Av. Avatar answered Oct 21 '22 12:10

Dror Av.