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.
print
.print
jest wyświetlanie komunikatów pomocy dla użytkownika w aplikacji wiersza poleceń.Odpowiedzi:
Pakiet rejestrowania ma wiele przydatnych funkcji:
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.
źródło
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.
źródło
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ę.
źródło
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ą.
źródło
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 !?
źródło