Wsparcie #3137
Logowanie
Status: | Odpowiedź | Start date: | 08 Dec 2011 | |
---|---|---|---|---|
Priority: | Normalny | Due date: | ||
Assignee: | - | % Done: | 0% | |
Category: | - | |||
Target version: | 1.0 |
Description
Warto przemyśleć sprawę wypisywania różnych rzeczy na ekran. Można by wykorzystać narzędzia pythonowe do logowania. Czy rozszerzamy interface FeatureGenI
o konieczność przyjęcia loggera? Możliwe, że inne fragmenty kodu też czasami próbują coś powiedzieć użytkownikowi. Cały system by zyskał na ujednoliceniu logowania.
History
#1 Updated by Bartosz Broda over 11 years ago
- Target version set to 1.0
#2 Updated by Adam Wardyński over 11 years ago
Na pewno pomysł mi się podoba, dałem opcję verbose z wypisywaniem na ekran aby było jakoś wiadomo co się w danym momencie dzieje, ale to się choćby miesza z wypisywaniem cech na ekran jeśli mamy wybrane stdout no i jakoś wygodne w użyciu też nie jest. Nie wiem co te narzędzia pythonowe do logowania robią, ale jakieś dedykowane rozwiązanie na pewno brzmi lepiej niż printy tu i ówdzie.
Nie mam pojęcia jak to działa pod linuksem/pythonem, pod Win w C++/C# można sobie było robić debugowe output albo trace'y dla release builda też, i potem takie rzeczy można sobie było pod debuggerem widzieć albo specjalnie skonfigurować system/program, aby te wiadomości się gdzieś zapisywały do pliku (ustawiając odpowiednie flagi, na jakim poziomie chcemy logować itp)
#3 Updated by Bartosz Broda over 11 years ago
W LexCSD uzywamy logowania w roznych miejscach. Niestety nie jestem pewny czy juz wszedzie jest uzywane czy jeszcze nie ma jakis pozostalosci po printach. Generalnie loggery działają bardzo standardowo i przewidywalnie. Po stworzeniu loggera wywoluje sie metodę odpowiednią, której podaje się wiadomość i jej priorytet. I w zależności od konfiguracji loggera część wiadomości może być niewypisywna. Z tego co pamiętam, to nie ma problemu, żeby mieć logger plikowy czy stdoutowy. Można też dodać własne "custom" loggery (np. uzywające pokolorowanego wyjścia, np. z błedami wypisanymi na czerwono).
#4 Updated by Bartosz Broda over 11 years ago
Przyjrzałem się modułowi do logowania w Pythonie i jak to rozwiązane jest w LexCSD. Okazuje się, że logowanie na poziomie LexCSD wymaga refactoringu. W każdym razie nie trzeba zmieniać nigdzie interfejsów. Każdy fragment kodu, który chce logować musi stworzyć sobie obiekt loggera:
import logging ... logger = logging.getLogger(__name__) # proponuję nazywać loggery po __name__ (zgodnie z sugestią w dokumentacji)
Można wiele razy tworzyć sobie obiekt loggera o tej samej nazwie (obiekt tworzony jest raz, następne wywołania zwracają tą samą instancję). Po stworzeniu loggera używa się go w następujący sposób:
logger.info("jakaś informacja np. o postępie") logger.warning("Oj, coś się dzieje niedobrego") logger.error("Aaaaa!") logger.debug("Wartość zmiennej x = %d" % x)
itd.
Sposób loggowania (poziom, gdzie logować, formatowanie) powinien być ustawiony w aplikacji uruchamianej przez użytkownika. Najprościej:
logging.basicConfig(level = logging.INFO)
Teraz wszystkie informacje (poza DEBUG) będą wypisane na konsole. Więcej informacji na temat logowania jest tutaj