web-dev-qa-db-fra.com

Python journalisation et rotation des fichiers

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.

30
fredsnertz

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 .

21
Andrew Walker

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!')
20
proski

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.

7
Alastair Irvine
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

6
avasal