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:
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:
Comment configurer la journalisation pour qu'elle ne génère que les fichiers my_log.log
, Et non le gros fichier example.log
?
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!')
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:
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)
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')