W Pythonie, po co używać rejestrowania zamiast drukowania?

91

Czy w przypadku prostego debugowania w złożonym projekcie istnieje powód, aby używać rejestratora języka Python zamiast drukowania? A co z innymi przypadkami użycia? Czy istnieje akceptowany najlepszy przypadek użycia dla każdego (zwłaszcza gdy szukasz tylko standardowego wyjścia)?

Zawsze słyszałem, że to „najlepsza praktyka”, ale nie byłem w stanie zrozumieć, dlaczego.

Sam Odio
źródło
3
W przypadku dużych projektów rejestrowanie jest zawsze „najlepszą praktyką”, ponieważ można je łatwo włączyć lub wyłączyć i uzyskać więcej lub mniej informacji. print nie oferuje żadnej z tych zalet.
Chris Eberle
3
Nie sądzę, by kiedykolwiek istniał najlepszy przypadek użycia print.
SingleNegationElimination
4
Dokumentacja rejestrowania w Pythonie mówi, że najlepszym przykładem użycia printjest wyświetlanie komunikatów pomocy dla użytkownika w aplikacji wiersza poleceń.
mokry
Czytając wszystkie te odpowiedzi, chcę zadać odwrotne pytanie: czy jest jakiś powód, aby nie używać logowania?
information_interchange

Odpowiedzi:

101

Pakiet rejestrowania ma wiele przydatnych funkcji:

  • Łatwo zobaczyć, gdzie i kiedy (nawet z jakiego numeru linii) jest wykonywane wywołanie logowania.
  • Możesz logować się do plików, gniazd, prawie wszystkiego w tym samym czasie.
  • Rejestrowanie można zróżnicować na podstawie ważności.

Druk nie ma żadnego z nich.

Ponadto, jeśli twój projekt ma być zaimportowany przez inne narzędzia Pythona, to zła praktyka, aby twój pakiet drukował rzeczy na standardowe wyjście, ponieważ użytkownik prawdopodobnie nie będzie wiedział, skąd pochodzą komunikaty drukowania. Dzięki rejestrowaniu użytkownicy Twojego pakietu mogą zdecydować, czy chcą rozpowszechniać komunikaty logowania z Twojego narzędzia, czy nie.

Ondrej Slinták
źródło
2
Bardzo dobrze powiedziane. Czasami używam print podczas debugowania skryptu jednorazowego użytku, który zamierzam uruchomić dokładnie raz, ale każdy kod, który kiedykolwiek zobaczy inne ludzkie oczy lub który ma trwać dłużej niż jeden dzień, jest rejestrowany.
TimothyAWiseman
22

Jedną z największych zalet prawidłowego rejestrowania jest to, że możesz kategoryzować wiadomości i włączać je lub wyłączać w zależności od potrzeb. Na przykład przydatne może być włączenie komunikatów poziomu debugowania dla określonej części projektu, ale stonowanie go dla innych części, aby nie zostać przejętym przez nadmiar informacji i łatwo skoncentrować się na zadaniu, którego potrzebujesz Logowanie.

Ponadto dzienniki można konfigurować. Możesz je łatwo filtrować, wysyłać do plików, formatować, dodawać znaczniki czasu i inne rzeczy, których możesz potrzebować na całym świecie. Drukowanie wyciągów nie jest łatwe.

pozbyć się
źródło
3
Zdecydowanie +1 za wysyłanie wyników do plików. Przetwarzanie pliku dziennika podczas sekcji zwłok jest znacznie lepsze niż konieczność ponownego jego zrywania w otwartym oknie konsoli w celu znalezienia błędu. Zasadniczo rejestrator jest idealny w przypadku konieczności debugowania skryptu po jego awarii, a nie w przypadku awarii. Jest to również idealne rozwiązanie za każdym razem, gdy musisz debugować złożony problem, który wymaga analizy danych wyjściowych programu. Zasadniczo za każdym razem, gdy masz do czynienia z błędami bardziej złożonymi niż błędy składniowe, program rejestrujący prawdopodobnie to uprości.
Jonathanb
11

Instrukcje drukowania są w pewnym sensie najgorsze z obu światów , łącząc negatywne aspekty debugera online z instrumentami diagnostycznymi. Musisz zmodyfikować program, ale nie otrzymasz z niego więcej przydatnego kodu .

Debugger online umożliwia sprawdzenie stanu uruchomionego programu; Ale fajną rzeczą w prawdziwym debugerze jest to, że nie musisz modyfikować źródła; ani przed, ani po sesji debugowania; Wystarczy załadować program do debugera, powiedzieć debugerowi, gdzie chcesz szukać i gotowe.

Oprzyrządowanie aplikacji może zająć trochę pracy z góry, modyfikując w jakiś sposób kod źródłowy, ale wynikowy wynik diagnostyczny może mieć ogromną ilość szczegółów i może być włączany lub wyłączany w bardzo określonym stopniu. Moduł rejestrowania w Pythonie może pokazywać nie tylko zarejestrowany komunikat, ale także plik i funkcję, która go wywołała, dane śledzenia, jeśli takie istniały, rzeczywisty czas wyemitowania wiadomości i tak dalej. Więcej niż to; nigdy nie trzeba usuwać oprzyrządowania diagnostycznego ; Jest tak samo ważny i przydatny, gdy program jest ukończony i jest w produkcji, jak w dniu jego dodania; ale może to spowodować, że jego dane wyjściowe utkną w pliku dziennika, gdzie prawdopodobnie nie będzie nikogo denerwować, lub poziom dziennika można obniżyć, aby ukryć wszystkie oprócz najpilniejszych wiadomości.

Przewidywanie potrzeby lub użycia debuggera nie jest tak naprawdę trudniejsze niż używanie ipythona podczas testowania i zapoznanie się z poleceniami używanymi do kontrolowania wbudowanego debuggera pdb.

Kiedy zorientujesz się, że instrukcja print może być łatwiejsza niż użycie pdb (jak to często bywa), zauważysz, że użycie loggera wciąga twój program w znacznie łatwiejszy sposób do pracy nad stanem, niż gdybyś używał i później usuwał instrukcje print .

Mój edytor został skonfigurowany tak, aby podświetlał instrukcje drukowania jako błędy składniowe i rejestrował instrukcje jako komentarze, ponieważ tak je traktuję.

SingleNegationElimination
źródło
4

Jeśli używasz rejestrowania, osoba odpowiedzialna za wdrożenie może skonfigurować program rejestrujący, aby wysyłał go do niestandardowej lokalizacji z niestandardowymi informacjami. Jeśli tylko drukujesz, to wszystko, co otrzymują.

Ignacio Vazquez-Abrams
źródło
1

Rejestrowanie zasadniczo tworzy przeszukiwalną bazę danych w postaci zwykłego tekstu zawierającą wyniki drukowania z innymi metadanymi (znacznik czasu, poziom logle, numer linii, proces itp.).

To jest czyste złoto, mogę uruchomić egrep na pliku dziennika po uruchomieniu skryptu Pythona. Mogę dostroić wyszukiwanie wzorca egrep, aby wybrać dokładnie to, co mnie interesuje, i zignorować resztę. To zmniejszenie obciążenia poznawczego i swoboda wyboru schematu egrep później metodą prób i błędów jest dla mnie kluczową korzyścią.

tail -f mylogfile.log | egrep "key_word1|key_word2"

Teraz dorzućcie inne fajne rzeczy, których print nie może zrobić (wysyłanie do gniazda, ustawianie poziomów debugowania, logrotate, dodawanie metadanych itp.), Masz wszelkie powody, aby preferować logowanie zamiast zwykłych instrukcji print.

Zwykle używam instrukcji print, ponieważ jest to leniwe i łatwe, dodawanie logowania wymaga trochę kodu źródłowego, hej, mamy yasnippety (emacs) i ultisnips (vim) i inne narzędzia do tworzenia szablonów, więc po co rezygnować z logowania do zwykłych instrukcji drukowanych !?

TIK Tak
źródło