web-dev-qa-db-fra.com

Comment utiliser RotatingFileHandler de Python

J'essaie de faire un test de logging du module RotatingFileHandler du module comme suit:

import logging
from logging.handlers import RotatingFileHandler

# logging.basicConfig(filename="example.log", level=logging.DEBUG)

logger = logging.getLogger('my_logger')
handler = RotatingFileHandler("my_log.log", maxBytes=2000, backupCount=10)
logger.addHandler(handler)

for _ in range(10000):
    logger.debug("Hello, world!")

Cependant, avec la ligne logging.basicConfig Mise en commentaire, le fichier my_log.log Résultant ne contient aucune donnée:

enter image description here

Si je commente dans la ligne avec logging.basicConfig(filename="example.log", level=logging.DEBUG), j'obtiens les fichiers my_log.log Attendus avec des suffixes numérotés. Cependant, il y a aussi le example.log Qui est un fichier (relativement) volumineux:

enter image description here

Comment configurer la journalisation pour qu'elle ne génère que les fichiers my_log.log, Et non le gros fichier example.log?

20
Kurt Peek

Python fournit 5 niveaux de journalisation prêts à l'emploi (par ordre croissant de gravité): DEBUG, INFO, WARNING, ERROR et CRITICAL. Celui par défaut est WARNING . Les docs disent que

Les messages de journalisation moins sévères que lvl seront ignorés.

Donc, si vous utilisez .debug avec les paramètres par défaut, vous ne verrez rien dans vos journaux.

La solution la plus simple serait d'utiliser logger.warning fonctionne plutôt que logger.debug:

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('my_logger')
handler = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10)
logger.addHandler(handler)

for _ in range(10000):
    logger.warning('Hello, world!')

Et si vous voulez changer le niveau de l'enregistreur, vous pouvez utiliser .setLevel méthode:

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
handler = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10)
logger.addHandler(handler)

for _ in range(10000):
    logger.debug('Hello, world!')
21
skovorodkin

J'ai trouvé que pour obtenir le comportement souhaité, il fallait utiliser le même nom dans les initialisations basicConfig et RotatingFileHandler:

import logging
from logging.handlers import RotatingFileHandler

logging.basicConfig(filename="my_log.log", level=logging.DEBUG)

logger = logging.getLogger('my_logger')
handler = RotatingFileHandler("my_log.log", maxBytes=2000, backupCount=10)
logger.addHandler(handler)

for _ in range(10000):
    logger.debug("Hello, world!")

Ici, j'ai choisi le même nom my_log.log. Il en résulte que seuls les journaux "à taille limitée" sont créés:

enter image description here

3
Kurt Peek

Toutes les réponses précédentes sont correctes, voici une autre façon de faire la même chose, sauf que nous utilisons plutôt le fichier de configuration de journalisation.

logging_config.ini

Voici le fichier de configuration:

[loggers]
keys=root

[handlers]
keys=logfile

[formatters]
keys=logfileformatter

[logger_root]
level=DEBUG
handlers=logfile

[formatter_logfileformatter]
format=%(asctime)s %(name)-12s: %(levelname)s %(message)s

[handler_logfile]
class=handlers.RotatingFileHandler
level=DEBUG
args=('testing.log','a',10,100)
formatter=logfileformatter

myScrypt.py

voici un script de journalisation simple qui utilise le fichier de configuration ci-dessus

import logging
from logging.config import fileConfig

fileConfig('logging_config.ini')
logger = logging.getLogger()
logger.debug('the best scripting language is python in the world')

[~ # ~] résultat [~ # ~]

voici le résultat, notez que maxBytes est réglé sur 10 mais dans la vraie vie, c'est clairement trop petit. (args = ('testing.log', 'a', 10,100)

enter image description here

3
grepit

En partant de la réponse de Kurt Peek, vous pouvez également placer le gestionnaire de fichiers rotatif dans le logging.basicConfig directement

import logging
from logging.handlers import RotatingFileHandler
logging.basicConfig(
        handlers=[RotatingFileHandler('./my_log.log', maxBytes=100000, backupCount=10)],
        level=logging.DEBUG,
        format="[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s",
        datefmt='%Y-%m-%dT%H:%M:%S')
1
Thomas Burke