A może tutaj!
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'formatter': 'standard',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout', # Default is stderr
},
},
'loggers': {
'': { # root logger
'handlers': ['default'],
'level': 'WARNING',
'propagate': False
},
'my.packg': {
'handlers': ['default'],
'level': 'INFO',
'propagate': False
},
'__main__': { # if __name__ == '__main__'
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
}
}
Stosowanie:
# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)
# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")
Jeśli widzisz zbyt wiele dzienników z pakietów innych firm, pamiętaj, aby uruchomić tę konfigurację przy użyciu logging.config.dictConfig(LOGGING_CONFIG)
przed zaimportowaniem pakietów innych firm.
Źródła: https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema
root
loggera: na najwyższym poziomie słownika. Jest to opisane w dokumentach , ma pierwszeństwo przed sytuacją ,['loggers']['']
gdy oba są obecne, ale moim zdaniem['loggers']['']
jest bardziej logiczne. Zobacz także dyskusję tutaj'disable_existing_loggers': False
ponieważ wtedy być może nie konfigurujesz go w całości, ale może ponownie używasz czegoś, co już tam jestTrue
.format
odformatters
?Przyjęta odpowiedź jest miła! Ale co by było, gdyby można było zacząć od czegoś mniej złożonego? Moduł logowania to bardzo potężna rzecz, a dokumentacja jest nieco przytłaczająca, szczególnie dla początkujących. Ale na początku nie musisz konfigurować elementów formatujących i programów obsługi. Możesz go dodać, kiedy dowiesz się, czego chcesz.
Na przykład:
źródło
logging.info('Hello, log')
który sprawił, że wszystko się u mnie zaskoczyło. Zamieszanie w dokumentacji polega na tym, że dzięki dictConfig nie musimy już wykonywaćgetLogger
ani żadnej z tych czynności.'': { 'level': 'INFO'...
i dlaczego nie działa bez niego (np. przy zmianie pustej wartości na prawidłową wartość, na przykładstandard
getLogger()
jeśli chcesz mieć wiele rejestratorów o różnych nazwach. Każdy z tych programów rejestrujących dziedziczy konfigurację z głównego programu rejestrującego.getLogger
jest zawsze opcjonalne. Używając tejlogging.info()
metody bezpośrednio, używany jest główny rejestrator, podczas gdygetLogger()
możesz mieć różne rejestratory, z różnymi nazwami i poziomami.Przykład z obsługą strumienia, programem obsługi plików, obrotowym programem obsługi plików i programem obsługi SMTP
źródło
Znalazłem domyślną konfigurację Django v1.11.15 poniżej, mam nadzieję, że to pomoże
źródło
źródło