Python-Protokollierungsstandardbibliothek für die Dateiausgabe nach Protokollebene

Hintergrund

Lösen wir das Problem, während wir unsere Hände bewegen und organisieren.

Rezension

import logging

logging.basicConfig(format='%(asctime)s   %(message)s', datefmt='%m/%d/%Y', filename = './basic.log')
logging.warning('basic.Aufgezeichnet im Protokoll mit Datum.')
logging.basicConfig(filename = './not-appeared.log')
logging.warning('basicConfig funktioniert nur beim ersten Mal nach dem Booten, also nicht-appeared.Es wird kein Protokoll erstellt.')

root_logger = logging.getLogger('')
root_logger.setLevel(logging.ERROR)
root_logger.error('Ein Root-Logger wurde eingerichtet, um ERROR-Levels und höher aufzuzeichnen. Basic.Es wird weiterhin im Protokoll angezeigt. Ich habe keinen Handler angegeben, daher kann ich nichts anderes finden.')

root_logger.addHandler(logging.StreamHandler())

root_logger.error('Dies wird auf der Konsole angezeigt. Das in basicConfig angegebene Format wird ignoriert.')
root_logger.warning('Da die Protokollstufe niedrig ist, wird sie nicht auf der Konsole angezeigt. Wenn ignoriert, einfach.Es wird nicht im Protokoll angezeigt.')

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('Es wurde ein Handler hinzugefügt, der nur KRITISCH aufzeichnet. Datums- und Ebenenname hinzugefügt.')
root_logger.error('Obwohl dies auf der Konsole angezeigt wird, ist es wichtig, da die Protokollstufe niedrig ist.Es wird nicht im Protokoll angezeigt.')

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

second_logger.warning('Fügen Sie einen Logger hinzu und legen Sie ihn auf die Konsole. Basic.Zusätzlich zum Protokoll wird es zweimal auf der Konsole mit dem Root-Logger angezeigt.')

second_logger.propagate = False

second_logger.warning('Wenn Sie die Weitergabe ablehnen, wird sie nicht stromaufwärts übertragen. Dies ist die zweite_Es ist nur ein Logger verfügbar.')

Rückblick und Prüfung

・ Es kann basierend auf dem Root-Logger in mehreren Stufen vererbt werden.

Lösung

Wenn Sie einen Filter verwenden, können Sie filtern, indem Sie einen Protokolldatensatz (eine Instanz einer Protokollnachricht) als Argument aufrufen und bei jeder Protokollierung einen booleschen Wert zurückgeben.

Ich habe auf diesen Beitrag zum Stapelüberlauf verwiesen. Wie Nr. 1 sagt, stimme ich zu, dass das Extrahieren nur eines bestimmten Levels es für Menschen nicht lesbar macht.

python logging specific level only

log_file_by_level.py


import logging

class LoggingFilter(object):
    """Filter, der nur eine bestimmte Protokollebene belässt"""
    def __init__(self, level):
        self.__level = level

    def filter(self, logRecord):
        #Entfernen Sie die Pegeleinstellung zum Handler und hier== self.__Es sollte möglich sein, es auf Level zu setzen.
        return logRecord.levelno <= self.__level

def set_handler(loglevel, filename):
    #Allgemeines Protokollformat
    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__)
#Geben Sie den Mindestpegel an, der in der App aufgezeichnet werden soll.
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.')

Referenz

Nur Python-ProtokollierungsstufeProtokollierungs-HOWTO - Python 3.6.1-Dokument

Recommended Posts

Python-Protokollierungsstandardbibliothek für die Dateiausgabe nach Protokollebene
Ausgabeprotokoll im JSON-Format mit Python-Standardprotokollierung
Hinweise zur Eingabe / Ausgabe von Python-Dateien
Protokollierungseinstellungen für die tägliche Protokollrotation mit Python
[CentOS8] So geben Sie die Standard-Python-Ausgabe in das Systemd-Protokoll aus
Ändern Sie das Standardausgabeziel in eine Datei in Python
[GCP] Ausgeben von Cloud-Funktionsprotokollen an Cloud Logging (Stackdriver Logging) (Python)
So ändern Sie die Protokollstufe von Azure SDK für Python
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Protokolldatei mit Job (Notizbuch) von Cloud Pak for Data ausgeben
[python3] Implementieren Sie die Debug-Protokollausgabefunktion einfach mit Protokollierung und Klicken
Python3-Standardeingabe für wettbewerbsfähige Programmierung
Tipps zur Eingabe / Ausgabe von Python-Dateien
Ausgabe in eine CSV-Datei mit Python
Schreiben Sie die Standardausgabe in eine Datei
Machen Sie die Standardausgabe in Python nicht blockierend
Unit Test Log Ausgabe mit Python
<Für Anfänger> Python-Bibliothek <Für maschinelles Lernen>
TRACE-Protokollebene zu Python hinzufügen ...?
[google-oauth] [python] Google APIs-Clientbibliothek für Python
Verstrichene Zeit für die Datenerfassung (für mich)
Python-Protokoll mit GAE an die Konsole ausgeben
Lesen Sie die Datei Zeile für Zeile mit Python
Lesen Sie die Datei Zeile für Zeile mit Python
UnicodeEncodeError hat Probleme mit der Standardausgabe von Python3
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Python> Ausgaben von 1 bis 100, 501 bis 600> Für CSV
Python-Standardbibliothek: zweite Hälfte (Python-Lernnotiz ⑨)
Atcoder-Standardeingabesatz für Anfänger (Python)
Download-Datei für Python Selen Chrome überschreiben
Python-Standardbibliothek: Erste Hälfte (Python-Lernnotiz ⑧)
Ein Lehrbuch für Anfänger von Python-Anfängern
Das Ausgabe-Timing ist falsch, wenn die Standardausgabe (Fehlerausgabe) in eine Datei in Python konvertiert wird