Logging in einzelne Dateien auslagern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Blackbenji
User
Beiträge: 5
Registriert: Mittwoch 1. Juni 2016, 09:06

Hallo zusammen,

ich möchte gerne mein Logging in separate Dateien aufteilen.
Warum? Weil ich mich bei einer großen Anwendung nicht erst durch ein einziges Logfiles greppen will.

Folgende Idee habe ich bereits angefangen:

Code: Alles auswählen

import logging
import os.path


def initialize_logger(output_dir):
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

    # create error file handler and set level to error
    handler = logging.FileHandler(os.path.join(output_dir, "error.log"), "a+", encoding=None, delay="true")
    handler.setLevel(logging.ERROR)
    formatter = logging.Formatter("%(levelname)s - %(message)s")
    handler.setFormatter(formatter)
    logger.addHandler(handler)

    # create info file handler and set level to info
    handler = logging.FileHandler(os.path.join(output_dir, "info.log"), "a+")
    handler.setLevel(logging.INFO)
    formatter = logging.Formatter("%(levelname)s - %(message)s")
    handler.setFormatter(formatter)
    logger.addHandler(handler)


initialize_logger("logs")

logging.error("Hallo Error")
logging.info("Hallo Info")
Erwartet habe ich:
logging.info loggt in die info.log
logging.error loggt in die error.log

Resultat ist aber:

Code: Alles auswählen

==> error.log <==
ERROR - Hallo Error

==> info.log <==
ERROR - Hallo Error
INFO - Hallo Info
Wie kann ich verhindern dass ERORR in die info.log schreibt?
Ich hatte gehofft durch "handler.setLevel(logging.INFO)" würde das ausreichen?
Zuletzt geändert von Anonymous am Dienstag 27. Juni 2017, 15:41, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

So geht das AFAIK nicht. Ein Handler wird immer sein eigenes loglevel darstellen, als auch alle, die darueber sind.

Stattdessen solltest du

- einen anderen Logger fuer den anderen Teil der Applikation nehmen. Also auf Ebene von Funktion und nicht Loglevel teilen.
- dem anderen Logger einen eigenen Handler geben, und die Logger.propagate-Eigenschaft auf False setzten (https://docs.python.org/3/library/loggi ... .propagate)
BlackJack

@Blackbenji: Das könnte man mit einem Filter lösen, den man an den Handler hängt.
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

Kann man das nicht einfach mit

Code: Alles auswählen

logging.Logger.propagate = False
lösen?

https://docs.python.org/2/library/loggi ... er-objects
Antworten