Logowanie w Pythonie
Rejestrowanie to sposób śledzenia zdarzeń zachodzących podczas działania niektórych programów. Rejestrowanie jest ważne dla tworzenia, debugowania i uruchamiania oprogramowania. Jeśli nie masz żadnych zapisów logowania i program ulegnie awarii, istnieje bardzo małe prawdopodobieństwo, że wykryjesz przyczynę problemu. A jeśli wykryjesz przyczynę, zajmie to dużo czasu. Dzięki logowaniu możesz pozostawić ślad okruchów, abyśmy mogli określić przyczynę problemu, jeśli coś pójdzie nie tak.
Istnieje wiele sytuacji, na przykład jeśli spodziewasz się liczby całkowitej, otrzymałeś liczbę zmiennoprzecinkową i możesz chmurę API , usługa jest wyłączona z powodu prac konserwacyjnych i nie tylko. Takie problemy wymknęły się spod kontroli i trudno je określić.
Dlaczego instrukcja print nie jest Pythoniczna
Niektórzy programiści wykorzystują koncepcję drukowania instrukcji w celu sprawdzenia, czy instrukcje są wykonywane poprawnie lub czy wystąpił jakiś błąd. Ale drukowanie nie jest dobrym pomysłem. Może rozwiązać Twoje problemy w przypadku prostych skryptów, ale w przypadku złożonych skryptów podejście do drukowania zakończy się niepowodzeniem.
Python ma wbudowany moduł Logowanie który umożliwia zapisywanie komunikatów o stanie do pliku lub innych strumieni wyjściowych. Plik może zawierać informację, która część kodu została wykonana i jakie pojawiły się problemy.
Poziomy rejestrowania w Pythonie
Istnieje pięć wbudowanych poziomów komunikatu dziennika.
- Odpluskwić: Służą one do podawania szczegółowych informacji, zwykle przydatnych tylko podczas diagnozowania problemów.
- Informacje: Służą one do potwierdzenia, że wszystko działa zgodnie z oczekiwaniami
- Ostrzeżenie: Są one używane jako wskazówka, że wydarzyło się coś nieoczekiwanego lub wskazuje na jakiś problem w najbliższej przyszłości
- Błąd: Oznacza to, że z powodu poważniejszego problemu oprogramowanie nie było w stanie wykonać jakiejś funkcji
- Krytyczny: Informuje to o poważnym błędzie, wskazując, że sam program może nie być w stanie kontynuować działania
W razie potrzeby programiści mają możliwość stworzenia większej liczby poziomów, ale są one wystarczające, aby poradzić sobie w każdej możliwej sytuacji. Każdemu wbudowanemu poziomowi przypisano jego wartość liczbową.
Moduł rejestrowania jest wyposażony w kilka funkcji. Ma kilka stałych, klas i metod. Elementy pisane wielkimi literami są stałe, elementy pisane wielką literą to klasy, a elementy rozpoczynające się od małych liter to metody.
Istnieje kilka obiektów rejestrujących oferowanych przez sam podstawowy moduł obsługi.
- Logger.info(msg): Spowoduje to zarejestrowanie wiadomości z poziomem INFO w tym rejestratorze.
- Logger.warning(msg): Spowoduje to zarejestrowanie w tym rejestratorze komunikatu o poziomie WARNING.
- Błąd rejestratora(msg): Spowoduje to zarejestrowanie komunikatu z poziomem ERROR w tym rejestratorze.
- Rejestrator.krytyczny(msg): Spowoduje to zarejestrowanie komunikatu o poziomie KRYTYCZNYM w tym rejestratorze.
- Logger.log(lvl,msg): Spowoduje to zarejestrowanie w tym rejestratorze wiadomości o poziomie liczb całkowitych lvl.
- Rejestrator.wyjątek(msg): Spowoduje to zarejestrowanie komunikatu z poziomem ERROR w tym rejestratorze.
- Logger.setLevel(lvl): Ta funkcja ustawia próg tego rejestratora na lvl. Oznacza to, że wszystkie wiadomości poniżej tego poziomu będą ignorowane.
- Logger.addFilter(filt): Spowoduje to dodanie określonego filtra do tego rejestratora.
- Logger.removeFilter(filt): Spowoduje to usunięcie specyficznego dopasowania filtra do tego rejestratora.
- Logger.filter(rekord): Ta metoda stosuje filtr rejestratora do dostarczonego rekordu i zwraca True, jeśli rekord ma zostać przetworzony. W przeciwnym razie zwróci False.
- Logger.addHandler(hdlr): Spowoduje to dodanie specyficznej procedury obsługi hdlr do tego rejestratora.
- Logger.removeHandler(hdlr): Spowoduje to usunięcie określonej procedury obsługi hdlr z tego rejestratora.
- Logger.hasHandlers(): Sprawdza to, czy program rejestrujący ma skonfigurowany moduł obsługi, czy nie.
Przydatne handlery
Oprócz podstawowej klasy Handler dostępnych jest wiele przydatnych podklas.
| Treser | Opis |
|---|---|
| Obsługa strumienia | Wysyła wiadomości do strumieni (obiektów plikopodobnych). |
| Obsługa plików | Wysyła wiadomości do plików dyskowych. |
| BaseRotatingHandler | Klasa bazowa dla procedur obsługi, które obracają pliki dziennika w określonym momencie. Używać Obrotowy moduł obsługi plików Lub TimedRotatingFileHandler Zamiast. |
| Obrotowy moduł obsługi plików | Wysyła wiadomości do plików dyskowych, obsługując maksymalne rozmiary plików dziennika i rotację plików dziennika. |
| TimedRotatingFileHandler | Wysyła wiadomości do plików dyskowych, obracając plik dziennika w określonych odstępach czasu. |
| Obsługa gniazd | Wysyła wiadomości do gniazd TCP/IP. Obsługuje także gniazda domeny Unix od wersji Python 3.4. |
| Obsługa datagramów | Wysyła wiadomości do gniazd UDP. Obsługuje także gniazda domeny Unix od wersji Python 3.4. |
| SMTPHandler | Wysyła wiadomości na wyznaczony adres e-mail. |
| SysLogHandler | Wysyła wiadomości do demona syslogu Unix, prawdopodobnie na maszynie zdalnej. |
| NTEventLogHandler | Wysyła komunikaty do dziennika zdarzeń systemu Windows NT/2000/XP. |
| Obsługa pamięci | Wysyła komunikaty do bufora w pamięci, który jest opróżniany po spełnieniu określonych kryteriów. |
| Obsługa protokołu HTTP | Wysyła wiadomości do serwera HTTP przy użyciu semantyki GET lub POST. |
| Obejrzałem FileHandler | Obserwuje plik, do którego się loguje. Jeżeli plik ulegnie zmianie, zostanie on zamknięty i ponownie otwarty przy użyciu nazwy pliku. |
| Obsługa kolejek | Wysyła komunikaty do kolejki, na przykład te zaimplementowane w modułach kolejki lub wieloprocesorowych. |
| NullHandler | Nie robi nic z komunikatami o błędach. Używane przez twórców bibliotek w celu uniknięcia komunikatu „Nie znaleziono programów obsługi dla rejestratora”. |
Podstawy rejestrowania w Pythonie
Podstawy wykorzystania modułu logującego do rejestrowania zdarzeń w pliku są bardzo proste. W tym celu wystarczy zaimportować moduł z biblioteki.
- Utwórz i skonfiguruj rejestrator. Może mieć kilka parametrów. Ale co ważne, podaj nazwę pliku, w którym chcesz nagrywać zdarzenia.
- Tutaj można również ustawić format rejestratora. Domyślnie plik działa w formacie dodać mode, ale w razie potrzeby możemy go zmienić na tryb zapisu.
- Można także ustawić poziom rejestratora, który pełni rolę progu śledzenia na podstawie wartości numerycznych przypisanych do każdego poziomu.
Istnieje kilka atrybutów, które można przekazać jako parametry. - Lista wszystkich tych parametrów jest podana w Biblioteka Pythona . Użytkownik może wybrać wymagany atrybut zgodnie z wymaganiami.
Następnie utwórz obiekt i użyj różnych metod, jak pokazano w przykładzie.
Rejestrowanie zmiennej
Ten kod demonstruje, jak zarejestrować komunikat o błędzie. Funkcja logowanie.error() służy do rejestrowania komunikatu o błędzie ze znakiem zastępczym %s w nazwie zmiennej.
Python3
import> logging> name> => 'GFG'> logging.error(> '%s raised an error'> , name)> |
Wyjście :
ERROR:root:GFG raised an error
Rejestrowanie wszystkich poziomów
Ten kod demonstruje wszystkie poziomy rejestrowania.
Pyton
# importing module> import> logging> # Create and configure logger> logging.basicConfig(filename> => 'newfile.log'> ,> > format> => '%(asctime)s %(message)s'> ,> > filemode> => 'w'> )> # Creating an object> logger> => logging.getLogger()> # Setting the threshold of logger to DEBUG> logger.setLevel(logging.DEBUG)> # Test messages> logger.debug(> 'Harmless debug Message'> )> logger.info(> 'Just an information'> )> logger.warning(> 'Its a Warning'> )> logger.error(> 'Did you try to divide by zero'> )> logger.critical(> 'Internet is down'> )> |
Powyższy kod wygeneruje plik o podanej nazwie i jeżeli otworzymy plik, będzie on zawierał następujące dane.
Konfigurowanie rejestrowania
Logowanie do pliku: temp.konf
[loggers] keys=root,simpleExample [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler]
Przykład:
Kod konfiguruje system rejestrowania przy użyciu konfiguracji z pliku temp.konf plik. Otrzymuje rejestrator o nazwie prosty przykład i rejestruje wiadomości na różnych poziomach rejestrowania.
Python3
import> logging> import> logging.config> logging.config.fileConfig(> 'temp.conf'> )> # create logger> logger> => logging.getLogger(> 'simpleExample'> )> # 'application' code> logger.debug(> 'debug message'> )> logger.info(> 'info message'> )> logger.warning(> 'warn message'> )> logger.error(> 'error message'> )> logger.critical(> 'critical message'> )> |
Wyjście :
2023-06-15 18:16:21 - simpleExample - DEBUG - debug message 2023-06-15 18:16:21 - simpleExample - INFO - info message 2023-06-15 18:16:21 - simpleExample - WARNING - warn message 2023-06-15 18:16:21 - simpleExample - ERROR - error message 2023-06-15 18:16:21 - simpleExample - CRITICAL - critical message
Wyjątek rejestrowania w Pythonie
Zgłaszanie wyjątków podczas rejestrowania może być przydatne w niektórych scenariuszach, aby wskazać wyjątkowe warunki lub błędy w aplikacji. Zgłaszając wyjątek, możesz zatrzymać normalny przebieg wykonywania i powiadomić osobę wywołującą lub system rejestrujący o napotkanym problemie.
W tym kodzie zgłaszamy wyjątek przechwytywany przez rejestrowanie. wyjątek.
Python3
import> logging> logging.basicConfig(level> => logging.DEBUG,> > format> => '%(asctime)s - %(levelname)s - %(message)s'> )> def> perform_operation(value):> > if> value <> 0> :> > raise> ValueError(> 'Invalid value: Value cannot be negative.'> )> > else> :> > # Continue with normal execution> > logging.info(> 'Operation performed successfully.'> )> try> :> > input_value> => int> (> input> (> 'Enter a value: '> ))> > perform_operation(input_value)> except> ValueError as ve:> > logging.exception(> 'Exception occurred: %s'> ,> str> (ve))> |
Wyjście :
Enter a value: -1 2023-06-15 18:25:18,064 - ERROR - Exception occurred: Invalid value: Value cannot be negative. ValueError: Invalid value: Value cannot be negative.