Jak wyświetlić timestampy w logach Mavena
Czyli sposób na analizowanie czasu budowy projektu i znajdowanie problemów wydajnościowych

Wstęp
Czym jest tytułowy Maven? Maven to popularne narzędzie do zarządzania projektami. Pozwala zarządzać budowaniem, raportami i dokumentacją projektu. Jest produktem organizacji non-profit działającej pod nazwą Apache Software Foundation. Organizacja ta zrzesza programistów pracujących nad otwartym oprogramowaniem (ang. Open Source).
Maven rozwiązuje problem długiego procesu wytwarzania oprogramowania i braku standardów przeprowadzania tego procesu. Maven pozwala programistom:
- Uprościć proces budowania projektu
- Ujednolicić sposób budowania projektu poprzez używanie tzw. Project Object Model (w skrócie POM) oraz pluginów
- Dostarczać przydatne informacje o projekcie
- Promować najlepsze praktyki wytwarzania oprogramowania
Maven to narzędzie napisane w Javie. Oznacza to, że do jego poprawnego działania wymagana jest wcześniejsza instalacja Javy.
Podstawy budowania projektu
Gdy w terminalu wpiszemy polecenie mvn --help
zostanie wyświetlony sposób w jaki używa się komendę mvn
:
mvn [options] [<goal(s)>] [<phase(s)>]
Na potrzeby tego artykułu wraz z komendą mvn
użyjemy dwie fazy (ang. phases), które w dużym uproszczeniu czyszczą projekt (faza clean
), budują i instalują go w naszym lokalnym repozytorium Mavena (faza install
). Lokalne repozytorium Mavena można znaleźć pod ścieżką /home/javowiec/.m2/repository
i znajdują się tam artefakty, których można używać w różnych projektach.
Wszystkie kolejne polecenia będę uruchamiać dla tego projektu:
Przyszedł zatem czas, aby zademonstrować budowanie projektu. Wykonajmy polecenie mvn clean install
:

Z początku logi Mavena mogą wydawać się przytłaczające i mało zrozumiałe, jednak zmienia się to po bliższym zapoznaniu z tym narzędziem.
Na zielono widać cele (ang. goals, poprzedzone znakami ---
) jakie Maven uruchamia pokolei by faza została wykonana. Na końcu mamy informację BUILD SUCCESS, która informuje o pomyślnym zbudowaniu projektu. Niepomyślna budowa projektu sygnalizowana jest czerwonym napisem BUILD FAILURE.

installl
zamiast install
Na końcu logów Maven podaje nam również czas wykonania budowy projektu: Total time
i kiedy została zakończona: Finished at
. Jednakże nie posiadamy bardziej szczegółowych informacji typu: jak długo trwa wykonanie poszczególnych celów?
Gdy nasz projekt składa się z wielu modułów (np. ponad 80), logi Mavena potrafią być bardzo długie. Znalezienie zbyt długiego czasu wykonania jakiegoś celu ułatwia w takim przypadku włączenie wyświetlania timestampów. Timestamp to znacznik czasu, który pozwala ustalić kiedy jakieś zdarzenie miało miejsce. Mając włączone timestampy możemy na spokojnie przeanalizować logi i znaleźć problem powodujący zbyt długi czas budowania projektu.
Włączanie timestampów w logach
Timestampy możemy włączyć tymczasowo (czyli na czas wykonania pojedynczej budowy projektu) i na stałe. Potrzebne są nam do tego dwie właściwości systemowe:
org.slf4j.simpleLogger.showDateTime
- przyjmuje wartościtrue
lubfalse
i wskazuje czy timestampy będą wyświetlane lub nieorg.slf4j.simpleLogger.dateTimeFormat
- wskazuje w jakim formacie wg wzorca SimpleDateFormat będą wyświetlane timestampy np.HH:mm:ss,SSS
.
Timestampy po włączeniu będą wyświetlane po lewej stronie terminala, przed wiadomościami [INFO]
, [WARNING]
czy [ERROR]
.
Więcej informacji na temat ustawień logów Mavena znajdziesz w dokumentacji.
Tymczasowo
Timestampy można włączyć tymczasowo poprzez dodanie do polecenia następujących parametrów: -Dorg.slf4j.simpleLogger.showDateTime=true
i -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss,SSS
:
mvn clean install -Dorg.slf4j.simpleLogger.showDateTime=true -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss,SSS

Na stałe
W pliku $MAVEN_HOME/conf/logging/simplelogger.properties
ustaw parametry org.slf4j.simpleLogger.showDateTime=true
i org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss,SSS
, a następnie zrestartuj terminal. Aby wyświetlić wartość zmiennej środowiskowej $MAVEN_HOME
wystarczy uruchomić polecenie echo $MAVEN_HOME
w terminalu.

simplelogger.properties
Po tej zmianie nie będziemy musieli już podawać parametrów włączających timestampy w wierszu poleceń. Będą one włączone do czasu aż tego nie zmienimy w pliku simplelogger.properties
.

simplelogger.properties
Zapis logów do pliku
Logi Mavena mogą zostać zapisane do pliku poprzez dodanie opcji --log-file
lub krótszej wersji -l
i podanie nazwy pliku w poleceniu:
mvn clean install --log-file nazwa-pliku.txt
mvn clean install -l nazwa-pliku.txt
Jednak ten sposób nie wyświetla logów w terminalu. Aby zapisywać logi do pliku i jednocześnie widzieć je w terminalu użyj polecenia:
mvn clean install 2>&1 | tee nazwa-pliku.txt
Podsumowanie
Znajomość sposobu włączania timestampów w logach Mavena pozoliła mi na znalezienie poważnego problemu wydajnościowego w procesie budowania projektu w mojej pracy. Oczywiście następnie go naprawiłem 😉
Do włączania timestampów służą dwa parametry: org.slf4j.simpleLogger.showDateTime
ustawiony na true
i org.slf4j.simpleLogger.dateTimeFormat
, w którym podajemy format timestampa (np. HH:mm:ss,SSS
).
Timestampy możemy włączyć tymczasowo przy pomocy wiersza poleceń lub na stałe przy pomocy pliku konfiguracyjnego $MAVEN_HOME/conf/logging/simplelogger.properties
.
Logi możemy zapisać do pliku poprzez dodanie na końcu polecenia Mavena opcji --log-file
lub jej skróconej formy -l
i podanie nazwy pliku.
Aby równocześnie widzieć logi w terminalu i zapisywać je do pliku dodaj na końcu polecenia Mavena: 2>&1 | tee nazwa-pliku.txt
.
Liczba komentarzy:
Zaloguj się lub dołącz do społeczności Javowców, aby móc uczestniczyć w dyskusji 🙂