Dobre przykłady z użyciem java.util.logging [zamknięte]

273

Chcę używać dzienników w moim programie. Słyszałem o logowaniu java.util.log , ale nie wiem jak zacząć.

Czy są jakieś przykłady tego, co mogę zrobić z logowaniem? Jak korzystać z logowania w swoim własnym programie?

Renato Dinhani
źródło
7
Możesz zacząć tutaj: slf4j.org/manual.html
Jeremy
1
Zgadzam się ze Stevenem Vascellaro. Mam dość patrzenia, jak niszczone są przydatne przedmioty z powodu działań policyjnych bez żadnego praktycznego końca. Ponadto z szacunkiem nie zgadzam się z Jeremy'm, gdy OP zapytał o rejestrowanie java.util.logging. Interesuje mnie również natywne logowanie (dzięki za odpowiedź, grwww!)
NOP
Aby zalogować dane w jednym wierszu: log.log (Level.INFO, „My message {0}”, nowy Object [] {myDataId});
Mitja Gustin

Odpowiedzi:

335

java.util.logging powstrzymuje Cię od konieczności dodawania jeszcze jednego pliku jar do Twojej aplikacji i działa dobrze z dobrym Formatter.

Ogólnie rzecz biorąc, na szczycie każdej klasy powinieneś mieć:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

Następnie możesz po prostu korzystać z różnych udogodnień klasy Logger .


Użyj Level.FINEdo wszystkiego, co debuguje na najwyższym poziomie przepływu wykonania:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

Użyj Level.FINER/ Level.FINESTwewnątrz pętli i w miejscach, w których nie zawsze trzeba widzieć tyle szczegółów podczas debugowania podstawowych problemów z przepływem:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

Skorzystaj ze sparametryzowanych wersji funkcji rejestrowania, aby nie generować ton śmieci konkatenacji ciągów, które GC będzie musiał nadążać. Object[]jak wyżej jest tanie, zwykle przydział stosu.


W przypadku obsługi wyjątków zawsze rejestruj pełne szczegóły wyjątku:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

Zawsze ex.toString()przekazuję tutaj tę wiadomość, ponieważ wtedy, gdy „ grep -n” za „ Exception” w plikach dziennika, również widzę wiadomość. W przeciwnym razie znajdzie się on w następnym wierszu danych wyjściowych wygenerowanych przez zrzut stosu i musisz mieć bardziej zaawansowany RegEx, aby dopasować również ten wiersz, co często zapewnia większą wydajność, niż trzeba przeglądać.

grwww
źródło
3
Czy to pisze do jakiegoś pliku. Nie mogłem go jeszcze uruchomić w moim programie. Mam początkową linię, którą macie, ale do tej pory nic nie zostało opracowane.
Doug Hauf
5
Jak przeglądasz dzienniki? Biblioteka, której używam, inicjuje obiekty Loggera i korzysta z .fine()metody rejestrowania, ale nie mogę sprawić, by komunikaty były wyświetlane ...
Anubian Noob
7
Programuję w Javie od 1998 roku. Zawsze uważałem, że logowanie w Javie jest znacznie bardziej kłopotliwe niż potrzeba. To zdecydowanie najprostsze wyjaśnienie, jak zalogować się w Javie, które przeczytałem. Zwięzłe też.
Steve McLeod
30
Ciekawe, że nikt nie wspomniał, gdzie można znaleźć pliki dziennika.
Ahmedov
4
Jeśli zastanawiasz się, dokąd trafiają dzienniki, upewnij się, że skonfigurowałeś moduł obsługi rejestratora. Aby po prostu wyprowadzać dzienniki do konsoli, użyj nowego ConsoleHandler i dodaj to do swojego loggera za pomocą metody addHandler. Upewnij się, że wywołujesz setLevel zarówno w rejestratorze, jak i module obsługi.
Craig Brown
67

Powinien zadeklarować rejestrator w następujący sposób:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

więc jeśli zmienisz nazwę swojej klasy, pojawi się ona.

Napisałem artykuł o java loggerze z przykładami tutaj .

hanoo
źródło
53

Istnieje wiele przykładów, a także różnego rodzaju rejestrowania. Spójrz na pakiet java.util.logging .

Przykładowy kod:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

Bez sztywnego kodowania nazwy klasy :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}
Ankit
źródło
15
Dlaczego nie ustawić nazwy dziennika jako Main.class.getSimpleName()? W ten sposób narzędzie refaktoryzacyjne zmieni je odpowiednio, jeśli zajdzie taka potrzeba, a jednak nie jest tak niezgrabne jak twoje drugie rozwiązanie.
Pijusn
3
Wykonywanie stacktrace dla nazwy loggera to hack, slow i niekonwencjonalny. To również złamie i da ci dziwne nazwy dla serwerów proxy AOP lub innych nadzwyczajnych kodowań bajtów.
Adam Gent
9
-1 dla biznesu stacktrace. Jest powolny i potencjalnie zapobiega optymalizacji kompilatora.
phooji
4
Dlaczego „powolność” miałaby w ogóle mieć znaczenie podczas inicjowania rejestratora? Wzmianki o spowolnieniu są tym, co większość ludzi nazwałaby przedwczesną optymalizacją (tak, kod wygląda nieco hackersko).
mikkom
3
@AndrewMcKinlay W jakiej sytuacji coś to psuje? Jeśli tag logger ma być taki sam jak nazwa klasy, wydaje się to całkiem w porządku. Narzędzia do refaktoryzacji zmienią jego nazwę automatycznie, podczas gdy, jeśli był to ciąg zakodowany na stałe, narzędzie do refaktoryzacji może albo go pominąć, albo powiedzieć „Czy też chcesz to zmienić?”.
Pijusn
23

SLF4J jest lepszą fasadą logowania niż rejestrowanie Apache Commons (ACL). Ma pomosty z innymi strukturami rejestrowania, dzięki czemu bezpośrednie połączenia z ACL, Log4J lub Java Util Logging przechodzą przez SLF4J, dzięki czemu można kierować wszystkie dane wyjściowe do jednego pliku dziennika, jeśli chcesz, za pomocą tylko jednego pliku konfiguracji dziennika. Dlaczego Twoja aplikacja korzysta z wielu ram rejestrowania? Ponieważ prawdopodobnie używane są biblioteki innych firm, zwłaszcza starsze.

SLF4J obsługuje różne implementacje rejestrowania. Może wysyłać wszystko do standardowego wyjścia, używać Log4J lub Logback (zalecane w porównaniu z Log4J).

http://www.slf4j.org/

http://logback.qos.ch/

bcody
źródło
9

Osobiście użyłbym minloga . Jest to niezwykle proste, ponieważ klasa rejestrująca zawiera kilkaset wierszy kodu.

Chris Dennett
źródło
3
Aby zminimalizować powierzchnię, jest to biblioteka do wyboru.
h3xStream
0

Sugerowałbym, abyś używał wspólnego narzędzia do rejestrowania Apache. Jest wysoce skalowalny i obsługuje osobne pliki dziennika dla różnych programów rejestrujących. Zobacz tutaj .

nIKUNJ
źródło
11
Dobry pomysł! niemniej staraj się odpowiadać na pytania, w przeciwnym razie zostaw komentarz;)
Ordiel