W skrypcie Pythona, który piszę, próbuję rejestrować zdarzenia za pomocą modułu logowania. Mam następujący kod do skonfigurowania mojego loggera:
ERROR_FORMAT = "%(levelname)s at %(asctime)s in %(funcName)s in %(filename) at line %(lineno)d: %(message)s"
DEBUG_FORMAT = "%(lineno)d in %(filename)s at %(asctime)s: %(message)s"
LOG_CONFIG = {'version':1,
'formatters':{'error':{'format':ERROR_FORMAT},
'debug':{'format':DEBUG_FORMAT}},
'handlers':{'console':{'class':'logging.StreamHandler',
'formatter':'debug',
'level':logging.DEBUG},
'file':{'class':'logging.FileHandler',
'filename':'/usr/local/logs/DatabaseUpdate.log',
'formatter':'error',
'level':logging.ERROR}},
'root':{'handlers':('console', 'file')}}
logging.config.dictConfig(LOG_CONFIG)
Kiedy próbuję uruchomić logging.debug("Some string")
, nie dostaję żadnych danych wyjściowych do konsoli, mimo że na tej stronie w dokumentacji jest napisane, że logging.debug
główny rejestrator powinien wypisać komunikat. Dlaczego mój program nic nie wyświetla i jak mogę to naprawić?
level != NOTSET
lub root (jeśli nie znaleziono). Katalog główny maWARNING
domyślnie poziom. Jest to napisane w sekcji, z którą utworzyłeś link (Logger.setLevel
).logging
musisz zadzwonićlogging.basicConfig()
co najmniej raz. W przeciwnym razie możesz być bardzo zdziwiony, że programy logujące potomne nic nie wydrukują. Funkcje rejestrujące w głównym programie rejestrującym wywołują to leniwie.Wiele lat później wydaje się, że nadal występuje problem z użytecznością programu rejestrującego Python. Oto kilka wyjaśnień wraz z przykładami:
import logging # This sets the root logger to write to stdout (your console). # Your script/app needs to call this somewhere at least once. logging.basicConfig() # By default the root logger is set to WARNING and all loggers you define # inherit that value. Here we set the root logger to NOTSET. This logging # level is automatically inherited by all existing and new sub-loggers # that do not set a less verbose level. logging.root.setLevel(logging.NOTSET) # The following line sets the root logger level as well. # It's equivalent to both previous statements combined: logging.basicConfig(level=logging.NOTSET) # You can either share the `logger` object between all your files or the # name handle (here `my-app`) and call `logging.getLogger` with it. # The result is the same. handle = "my-app" logger1 = logging.getLogger(handle) logger2 = logging.getLogger(handle) # logger1 and logger2 point to the same object: # (logger1 is logger2) == True # Convenient methods in order of verbosity from highest to lowest logger.debug("this will get printed") logger.info("this will get printed") logger.warning("this will get printed") logger.error("this will get printed") logger.critical("this will get printed") # In large applications where you would like more control over the logging, # create sub-loggers from your main application logger. component_logger = logger.getChild("component-a") component_logger.info("this will get printed with the prefix `my-app.component-a`") # If you wish to control the logging levels, you can set the level anywhere # in the hierarchy: # # - root # - my-app # - component-a # # Example for development: logger.setLevel(logging.DEBUG) # If that prints too much, enable debug printing only for your component: component_logger.setLevel(logging.DEBUG) # For production you rather want: logger.setLevel(logging.WARNING)
Częstym źródłem nieporozumień jest źle zainicjowany program rejestrujący root. Rozważ to:
import logging log = logging.getLogger("myapp") log.warning("woot") logging.basicConfig() log.warning("woot")
Wynik:
W zależności od środowiska wykonawczego i poziomów rejestrowania, pierwszy wiersz dziennika (przed podstawową konfiguracją) może nie pojawić się nigdzie .
źródło
logging.basicConfig( filename='logging.txt', level=logging.DEBUG) logger = logging.getLogger() logger.info('Test B') logging.info('Test A')
logger = logging.getLogger()
poziom jest ustawiony na OSTRZEŻENIE, mimo że określiłem poziom jakoDEBUG
. Czy wiesz, co robię źle?Dla każdego, kto szuka super prostej odpowiedzi: po prostu ustaw żądany poziom wyświetlania. Na górze wszystkich moich skryptów po prostu umieściłem:
import logging logging.basicConfig(level = logging.INFO)
Następnie, aby wyświetlić cokolwiek na tym poziomie lub powyżej:
logging.info("Hi you just set your fleeb to level plumbus")
Jest to hierarchiczny zestaw pięciu poziomów, dzięki czemu dzienniki będą wyświetlane na ustawionym lub wyższym poziomie . Więc jeśli chcesz wyświetlić błąd, możesz użyć
logging.error("The plumbus is broken")
.Poziomy te w rosnącej kolejności nasilenia, są
DEBUG
,INFO
,WARNING
,ERROR
iCRITICAL
. Ustawienie domyślne toWARNING
.To jest dobry artykuł zawierający te informacje wyrażone lepiej niż moja odpowiedź:
https://www.digitalocean.com/community/tutorials/how-to-use-logging-in-python-3
źródło
Może spróbuj tego? Wygląda na to, że problem został rozwiązany po usunięciu wszystkich modułów obsługi w moim przypadku.
for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) logging.basicConfig(filename='output.log', level=logging.INFO)
źródło
SyntaxError: invalid syntax