Registro de Python – Establecer fecha como nombre de archivo

Estoy trabajando en la implementación del registro dentro de mi proyecto de Python y he tenido un pequeño obstáculo. Estoy tratando de configurar mi registro de manera que los Manejadores y Formateadores estén organizados en un archivo de configuración. Lo que estoy tratando de hacer en este momento es configurar mi fileHandler manera que cree un archivo de registro que se parezca a esto: YYYY_MM_DD.log obviamente con las Y representando el año, M representando el mes y D representando el día .

Esto es lo que he intentado con mi archivo de configuración:

 [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 

El archivo que estoy usando para probar la configuración es bastante simple:

 import logging import logging.config logging.config.fileConfig('logging.conf') logger = logging.getLogger('MainLogger') logger.debug("TEST") 

El error específico que estoy recibiendo en este momento es:

 configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: "%Y_%m_%d.log'), 'a')" 

He intentado cambiar %Y , %m , y %d como dice el error, pero eso no soluciona el problema. ¿Cómo hago para configurar el archivo de configuración para que mis archivos de registro tengan el aspecto que deseo?

Debo tener en cuenta que cuando cambio el nombre del archivo a test.log todo funcionó bien, por lo que este es el único error que parece estar teniendo con esto.

No puede usar datetime en un archivo de configuración, ya que no sabe lo que significa. Sin embargo, puede agregar el Filehandler de Filehandler en el propio archivo python:

 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") 

De esta manera puede establecer la fecha como el nombre de archivo en el controlador.

Este es el archivo de configuración, tenga en cuenta que tuvo un error tipográfico en el último formateador, puso el nombre de fillname lugar del filename de filename y lo olvidó ( en el 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 

Esto debería funcionar bien.

Esto funcionó para mí.

Actualice esto: args = (datetime.now (). Strftime (‘% Y_% m_% d.log’), ‘a’)

A

args = (__ importar __ (“datetime”). datetime.now (). strftime (‘% Y_% m_% d.log’), ‘a’)

Referencia (Ejemplo no 3): http://python-reference.readthedocs.io/en/latest/docs/functions/eval.html

Tal vez puedas usar el TimedRotatingFileHandler de Python en TimedRotatingFileHandler lugar. Puede configurar el intervalo para crear un nuevo archivo de registro todos los días con la fecha como sufijo.

Documentación–

Tenga en cuenta que el archivo de registro del día actual no tendrá una fecha. Este controlador de archivos solo agrega el sufijo de fecha cuando comienza un nuevo día.

Además, el sufijo que utiliza es “% Y-% m-% d”, que es un poco diferente de lo que quieres. Pero hay una pregunta de SO aquí acerca de cómo puedes alterar eso.

Tal vez intente cambiar el nombre después de haber cargado el archivo de configuración:

 from datetime inport datetime logging.config.fileConfig('logging.conf') logging.basicConfig(filename = datetime.now().strftime('%Y_%m_%d.log')) 

Esto utiliza el contenido de su archivo de configuración, pero no accede directamente al archivo. Usted crea su propio manejador de archivos y luego lo agrega al registrador.

 import logging from datetime import datetime # Create logger. logger = logging.getLogger('MainLogger') logger.setLevel(logging.DEBUG) # Create filehandler with desired filename. fh = logging.FileHandler('{}.log'.format(datetime.now().strftime('%Y_%m_%d'))) fh.setLevel(logging.DEBUG) log_formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s') fh.setFormatter(log_formatter) # Add filehandler to logger. logger.addHandler(fh) 

Tenga en cuenta que a (anexar) es el parámetro de mode predeterminado para un FileHandler.

Esto tambien funciona

 from dateime import datetime log_file = str(datetime.utcnow().strftime('%m_%d_%Y_%I_%M_%S')) + '.log' logging.basicConfig(filename=log_file, format='%(levelname)s | %(asctime)s | %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.DEBUG) 

Nombre de archivo de registro: 04_30_2018_10_03_01.log

El uso de doble ‘%’ – caracteres en la cadena de formato en combinación con el enfoque sugerido por Abhishek condujo a una solución de trabajo en mi caso (Python 3.5):

El manejador de archivos en el archivo de configuración debería verse similar a este:

 [handler_fileHandler] class=FileHandler level=DEBUG formatter=defaultFormatter args=(__import__("datetime").datetime.now().strftime('/your_path/your_file_name_%%Y-%%m-%%d_%%H-%%M-%%S.log'), 'a')