Bibliothèque standard de journalisation Python pour la sortie de fichier par niveau de journal

Contexte

-Il était question de vouloir séparer les fichiers journaux pour chaque niveau de journal en Python. ・ En premier lieu, j'ai utilisé la bibliothèque de journalisation à la hâte et je ne l'ai pas bien comprise.

Résolvons le problème en bougeant nos mains et en organisant.

la revue

import logging

logging.basicConfig(format='%(asctime)s   %(message)s', datefmt='%m/%d/%Y', filename = './basic.log')
logging.warning('basic.Enregistré dans le journal avec la date.')
logging.basicConfig(filename = './not-appeared.log')
logging.warning('basicConfig ne fonctionne que la première fois après le démarrage, donc pas-appeared.Aucun journal n'est généré.')

root_logger = logging.getLogger('')
root_logger.setLevel(logging.ERROR)
root_logger.error('Un enregistreur racine a été configuré pour enregistrer les niveaux d'ERREUR et plus. de base.Il continuera à apparaître dans le journal. Je n'ai pas spécifié de gestionnaire, donc je ne trouve rien d'autre.')

root_logger.addHandler(logging.StreamHandler())

root_logger.error('Cela apparaîtra sur la console. Le format spécifié dans basicConfig est ignoré.')
root_logger.warning('Le niveau de journalisation étant faible, il n'apparaît pas sur la console. Si ignoré, basique.Il n'apparaît pas dans le journal.')

critical_handler = logging.FileHandler('./critical.log')
critical_handler.setLevel(logging.CRITICAL)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
critical_handler.setFormatter(formatter)
root_logger.addHandler(critical_handler)

root_logger.critical('Ajout d'un gestionnaire qui enregistre uniquement CRITICAL. Date et nom du niveau ajoutés.')
root_logger.error('Bien que cela apparaisse sur la console, il est essentiel car le niveau de journalisation est bas.Il n'apparaît pas dans le journal.')

second_logger = logging.getLogger('second')
second_logger.setLevel(logging.WARNING)
second_logger.addHandler(logging.StreamHandler())

second_logger.warning('Ajoutez un enregistreur et placez-le sur la console. de base.En plus du journal, il apparaît deux fois sur la console avec l'enregistreur racine.')

second_logger.propagate = False

second_logger.warning('Si vous refusez la propagation, elle ne sera pas transmise en amont, c'est la seconde_Un seul enregistreur est disponible.')

Rétrospective et examen

・ Il peut être hérité en plusieurs étapes en fonction de l'enregistreur racine. -Plusieurs gestionnaires peuvent être définis pour chacun. -Les niveaux de journal peuvent être définis pour les enregistreurs et les gestionnaires respectivement. -Cependant, comme les deux sont des seuils inférieurs, il n'est pas possible de filtrer uniquement des journaux spécifiques selon les besoins.

Solution

Si vous utilisez un filtre, vous pouvez filtrer en appelant un enregistrement de journal (une instance d'un message de journal) comme argument et en renvoyant une valeur booléenne chaque fois que vous vous connectez.

J'ai fait référence à ce post de Stack Overflow. Comme le dit le n ° 1, je suis d'accord que l'extraction d'un seul niveau spécifique ne le rendra pas lisible par les humains.

python logging specific level only

log_file_by_level.py


import logging

class LoggingFilter(object):
    """Filtre qui ne laisse qu'un niveau de journal spécifique"""
    def __init__(self, level):
        self.__level = level

    def filter(self, logRecord):
        #Supprimez le paramètre de niveau du gestionnaire et ici== self.__Il devrait être possible de le mettre à niveau.
        return logRecord.levelno <= self.__level

def set_handler(loglevel, filename):
    #Format de journal commun
    log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    handler = logging.FileHandler(filename)
    handler.setLevel(loglevel)
    handler.setFormatter(log_format)
    handler.addFilter(LoggingFilter(loglevel))
    logger.addHandler(handler)

logger = logging.getLogger(__name__)
#Spécifiez le niveau minimum à enregistrer dans l'application.
logger.setLevel(logging.DEBUG)
set_handler(logging.WARN, './warning.log')
set_handler(logging.INFO, './info.log')

main.py


from log_file_by_level import logger

logger.warning('I warn you.')
logger.info('Please be informed that this is just a test.')
logger.error('Found error on your smile.')

référence

Niveau spécifique de journalisation Python uniquementLogging HOWTO - Document Python 3.6.1

Recommended Posts

Bibliothèque standard de journalisation Python pour la sortie de fichier par niveau de journal
Journal de sortie au format JSON avec journalisation standard Python
Notes pour l'entrée / sortie de fichier Python
Paramètres de journalisation pour la rotation quotidienne des journaux avec python
[CentOS8] Comment afficher la sortie Python standard dans le journal systemd
Changer la destination de sortie standard en un fichier en Python
[GCP] Comment générer des journaux Cloud Functions vers Cloud Logging (Stackdriver Logging) (Python)
Comment modifier le niveau de journalisation d'Azure SDK pour Python
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Fichier journal de sortie avec Job (Notebook) de Cloud Pak for Data
[python3] Implémentez facilement la fonction de sortie du journal de débogage avec journalisation et cliquez sur
Entrée standard Python3 pour une programmation compétitive
Conseils sur l'entrée / la sortie de fichier Python
Sortie vers un fichier csv avec Python
Écrire la sortie standard dans un fichier
Rendre la sortie standard non bloquante en Python
Sortie du journal de test unitaire avec python
<Pour les débutants> bibliothèque python <Pour l'apprentissage automatique>
Ajouter le niveau de journal TRACE à Python ...?
[google-oauth] [python] Bibliothèque cliente des API Google pour Python
Sortie du temps écoulé pour l'enregistrement des données (pour moi-même)
Sortie du journal Python vers la console avec GAE
Lisez le fichier ligne par ligne avec Python
Lisez le fichier ligne par ligne avec Python
UnicodeEncodeError lutte avec la sortie standard de python3
Pandas du débutant, par le débutant, pour le débutant [Python]
Python> Numéros de sortie de 1 à 100, 501 à 600> Pour csv
Bibliothèque standard Python: seconde moitié (mémo d'apprentissage Python ⑨)
Ensemble d'entrées standard Atcoder pour les débutants (python)
Écraser le fichier de téléchargement pour python selenium Chrome
Bibliothèque standard Python: première moitié (mémo d'apprentissage Python ⑧)
Un manuel pour les débutants réalisé par des débutants Python
La synchronisation de la sortie est incorrecte lorsque la sortie standard (erreur) est convertie en fichier en Python