Wsparcie #3137

Logowanie

Added by Bartosz Broda over 11 years ago. Updated over 11 years ago.

Status:OdpowiedźStart date:08 Dec 2011
Priority:NormalnyDue 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

Also available in: Atom PDF