J'ai un programme python qui écrit dans un fichier journal qui est tourné par la commande logrotate de Linux. Lorsque cela se produit, je dois signaler à mon programme d'arrêter d'écrire dans l'ancien fichier et de commencer à écrire dans le nouveau. Je peux gérer le signal mais comment dire à python d'écrire dans le nouveau fichier?
J'ouvre le fichier comme ceci:
logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO)
et y écrire comme ceci:
logging.log(level,"%s" % (msg))
Les modules de journalisation semblent très puissants mais aussi écrasants. Merci.
Vous voudrez peut-être regarder WatchedFileHandler pour implémenter cela, ou comme alternative, implémenter la rotation des journaux avec RotatingFileHandler , tous deux dans le module logging.handlers .
N'utilisez pas logging.basicConfig
, utilisez WatchedFileHandler
. Voici comment l'utiliser.
import time
import logging
import logging.handlers
def log_setup():
log_handler = logging.handlers.WatchedFileHandler('my.log')
formatter = logging.Formatter(
'%(asctime)s program_name [%(process)d]: %(message)s',
'%b %d %H:%M:%S')
formatter.converter = time.gmtime # if you want UTC time
log_handler.setFormatter(formatter)
logger = logging.getLogger()
logger.addHandler(log_handler)
logger.setLevel(logging.DEBUG)
log_setup()
logging.info('Hello, World!')
import os
os.rename('my.log', 'my.log-old')
logging.info('Hello, New World!')
Comme la rotation est déjà effectuée par logrotate
, dans votre gestionnaire de signal, vous devez simplement appeler à nouveau logging.basicConfig(...)
et cela devrait rouvrir le fichier journal.
from logging import handlers
handler = handlers.TimedRotatingFileHandler(filename, when=LOG_ROTATE)
handler.setFormatter(logging.Formatter(log_format, datefmt="%d-%m-%Y %H:%M:%S"))
#LOG_ROTATE = midnight
#set your log format
Cela devrait vous aider à gérer la rotation du journal