rolling into example python logging

example - python logging into file



TimedRotatingFileHandler ¿Cambiar el nombre del archivo? (5)

Estoy tratando de implementar el controlador de registro de Python llamado TimedRotatingFileHandler.

Cuando se traslada a la medianoche, agrega el día actual en la forma: "AAAA-MM-DD".

LOGGING_MSG_FORMAT = ''%(name)-14s > [%(levelname)s] [%(asctime)s] : %(message)s'' LOGGING_DATE_FORMAT = ''%Y-%m-%d %H:%M:%S'' logging.basicConfig( level=logging.DEBUG, format=LOGGING_MSG_FORMAT, datefmt=LOGGING_DATE_FORMAT ) root_logger = logging.getLogger('''') logger = logging.handlers.TimedRotatingFileHandler("C://logs//Rotate_Test",''midnight'',1) root_logger.addHandler(logger) while True: daemon_logger = logging.getLogger(''TEST'') daemon_logger.info("SDFKLDSKLFFJKLSDD") time.sleep(60)

El primer archivo de registro creado se llama simplemente "Rotate_Test" y una vez que se transfiere al día siguiente, cambia el nombre del archivo a: "Rotate_Test.YYYY-MM-DD" Donde YYYY-MM-DD es el día actual.

¿Cómo puedo cambiar cómo altera el nombre del archivo? Busqué en Google y miré la API y encontré prácticamente nada.


Solo una actualización, terminé yendo por un enfoque diferente.

La forma más fácil que encontré para modificar el resultado del archivo fue simplemente usar un FileHandler, y luego, cuando es el momento de hacer un roll over.

Hago esto:

if(current_time > old_time): for each in logging.getLogger(''Debug'').handlers: each.stream = open("C://NewOutput", ''a'')

Esa es la esencia de eso. Me costó mucho hurgar y mirar alrededor, pero modificar la secuencia es la forma más fácil de hacerlo.

:)


"¿Cómo puedo cambiar cómo altera el nombre del archivo?"

Como no está documentado, elegí leer la fuente. Esto es lo que concluí al leer la fuente de logging/handlers.py

handler = logging.handlers.TimedRotatingFileHandler("C://isis_ops//logs//Rotate_Test",''midnight'',1) handler.suffix = "%Y-%m-%d" # or anything else that strftime will allow root_logger.addHandler(handler)

El sufijo es la cadena de formato.


Gracias.

Miré la fuente.

Realmente no hay una manera de cambiar su forma. Desde la manipulación del sufijo, solo se agrega al final del nombre del archivo. De esta forma, no hay manera de manipular el nombre completo del archivo, lo que esperaba es que puedas declarar una máscara de archivo, y cuando haga el "RollOver" creará un nuevo nombre de archivo basado en la máscara del archivo . Solo voy a volver a mi idea original, era simplemente matar a todo el subsistema de registro y reiniciarlo con el nuevo nombre de archivo cuando RollsOver.

Gracias Tho.


Hay otro enfoque para este problema: por ejemplo, necesito rotar registros diariamente, pero deben nombrarse con un sufijo en el formato% m% d% Y ...

¡Así que escribí una remezcla TimedRotatingFileHandler!

try: import codecs except ImportError: codecs = None import logging.handlers import time import os class MyTimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler): def __init__(self,dir_log): self.dir_log = dir_log filename = self.dir_log+time.strftime("%m%d%Y")+".txt" #dir_log here MUST be with os.sep on the end logging.handlers.TimedRotatingFileHandler.__init__(self,filename, when=''midnight'', interval=1, backupCount=0, encoding=None) def doRollover(self): """ TimedRotatingFileHandler remix - rotates logs on daily basis, and filename of current logfile is time.strftime("%m%d%Y")+".txt" always """ self.stream.close() # get the time that this sequence started at and make it a TimeTuple t = self.rolloverAt - self.interval timeTuple = time.localtime(t) self.baseFilename = self.dir_log+time.strftime("%m%d%Y")+".txt" if self.encoding: self.stream = codecs.open(self.baseFilename, ''w'', self.encoding) else: self.stream = open(self.baseFilename, ''w'') self.rolloverAt = self.rolloverAt + self.interval


Puede hacerlo cambiando el sufijo de registro como se sugiere arriba, pero también deberá cambiar la variable extMatch para que coincida con el sufijo para que encuentre los archivos girados:

handler.suffix = "%Y%m%d" handler.extMatch = re.compile(r"^/d{8}$")