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?
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?
Odpowiedzi:
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.FINE
do 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.FINEST
wewną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ć.
.fine()
metody rejestrowania, ale nie mogę sprawić, by komunikaty były wyświetlane ...
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 .
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");
}
}
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.
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).
Osobiście użyłbym minloga . Jest to niezwykle proste, ponieważ klasa rejestrująca zawiera kilkaset wierszy kodu.
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 .