Jak czytac i analizowac logi serwera Minecraft
Serwer padl w nocy. Gracze pisza, ze "wszystko lagowalo, potem wyrzucilo". Wchodzisz rano, serwer dziala - zrestartowal go watchdog. Co sie stalo? Bez logow nigdy sie nie dowiesz.
Logi to jedyne wiarygodne zrodlo informacji o tym, co dzieje sie na serwerze. Nie "wydaje mi sie", nie "pewnie plugin bugowal", a konkretne wpisy z dokladnym czasem, poziomem krytycznosci i opisem problemu. Jesli administrujesz serwer Minecraft i nie umiesz czytac logow - dzialasz na slepo.
W tym artykule omawiam wszystko: gdzie leza logi, jak zbudowany jest format wpisow, co oznaczaja poziomy, jak znajdowac typowe problemy i jak zautomatyzowac analize.
Gdzie sa przechowywane logi
latest.log
Glowny plik to logs/latest.log w katalogu serwera. Zapisuje sie tu wszystko od ostatniego startu. Przy kazdym restarcie serwera poprzedni latest.log jest archiwizowany.
server/
|-- logs/
| |-- latest.log <-- biezaca sesja
| |-- 2026-03-25-1.log.gz <-- wczorajszy log (skompresowany)
| |-- 2026-03-24-1.log.gz
| |-- 2026-03-24-2.log.gz <-- jesli serwer restartowal sie dwa razy
| `-- ...
|-- crash-reports/
| `-- crash-2026-03-25-server.txt
`-- ...
Archiwa trzymane sa w formacie gzip. Zeby odczytac stary log:
# Podglad skompresowanego loga
zcat logs/2026-03-25-1.log.gz | less
# Szukanie w skompresowanym logu
zgrep "ERROR" logs/2026-03-25-1.log.gz
crash-reports/
Gdy serwer pada z fatalnym bledem, tworzy plik w folderze crash-reports/. To nie to samo co zwykly log - crash raport zawiera szczegolowy snapshot stanu serwera w momencie padu: stack trace, zaladowane pluginy, info o systemie, stan pamieci.
Nazwa pliku zawiera date i czas: crash-2026-03-25-151432-server.txt.
debug/
Na serwerach Paper jest folder debug/ - trafiaja tu thread dumpy i inne info diagnostyczne. O nich szerzej ponizej.
Format wpisu loga
Kazda linijka w logu ma standardowy format:
[15:42:01] [Server thread/INFO]: Player_Steve joined the game
[15:42:15] [Server thread/WARN]: Can't keep up! Is the server overloaded?
[15:43:02] [Server thread/ERROR]: Could not pass event PlayerMoveEvent
Rozbijmy na czesci:
[15:42:01]- czas zdarzenia (HH:MM:SS)[Server thread/INFO]- watek (thread) i poziom logowania- Tekst po
:- sama wiadomosc
Watek jest wazny. Server thread to glowny watek tickow, na ktorym dziala cala logika gry. Jesli blad dzieje sie w Async Chat Thread albo Netty Epoll Server IO - to inna historia i inne przyczyny.
Poziomy logowania
INFO
Zwykle wiadomosci informacyjne. Polaczenia graczy, ladowanie pluginow, zapisywanie swiata. To 95% twojego loga.
[15:42:01] [Server thread/INFO]: Starting minecraft server version 1.20.4
[15:42:03] [Server thread/INFO]: Loading properties
[15:42:05] [Server thread/INFO]: Done (4.832s)! For help, type "help"
Wiadomosci INFO mozna zwykle ignorowac przy szukaniu problemow. Ale czasem przydatne info kryje sie wlasnie tu - np. czas ladowania pluginow moze pokazac, ktory z nich spowalnia start.
WARN
Ostrzezenia. Serwer napotkal cos niepozadanego, ale dziala dalej.
[15:42:15] [Server thread/WARN]: Can't keep up! Is the server overloaded?
Running 5023ms or 100 ticks behind
To najslynniejsze ostrzezenie Minecrafta. Oznacza, ze serwer nie nadaza obslugiwac tickow na czas. Jesli pojawia sie sporadycznie - nic groznego. Jesli co kilka sekund - masz powazne problemy z wydajnoscia.
Inne czeste WARN:
[WARN]: Ambiguity between arguments [...] -- niejednoznacznosc komend, nieszkodliwe
[WARN]: UUID of player X is ... -- problemy z UUID, czesto przy offline-mode
[WARN]: Connection throttled: 192.168.1.50 -- za czeste polaczenia z jednego IP
ERROR
Bledy. Cos sie zepsulo. Plugin padl, nie udalo sie zaladowac swiata, blad w konfiguracji.
[15:43:02] [Server thread/ERROR]: Could not pass event PlayerMoveEvent to ExamplePlugin v1.0
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310)
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70)
...
Caused by: java.lang.NullPointerException
at com.example.plugin.MoveListener.onPlayerMove(MoveListener.java:45)
To juz jest wazne. ERROR zawsze wymaga uwagi. Po ERROR zwykle idzie stack trace - lancuch wywolan, ktory doprowadzil do bledu. Jak go czytac - ponizej.
FATAL
Krytyczny blad, po ktorym serwer zwykle sie zatrzymuje. Rzadki, ale jesli widzisz FATAL - to powaznie.
[15:45:01] [Server thread/FATAL]: Encountered an unexpected exception
java.lang.OutOfMemoryError: Java heap space
Brak pamieci, uszkodzenie danych swiata, bug w rdzeniu serwera - wszystko to moze wywolac FATAL.
Jak czytac stack trace
Stack trace to lancuch wywolan metod, ktory doprowadzil do bledu. Czytac go trzeba z gory do dolu, ale szukac przyczyny - z dolu do gory.
[ERROR]: Could not pass event PlayerInteractEvent to ShopPlugin v2.1
org.bukkit.event.EventException: null
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310)
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70)
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:545)
at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:540)
at net.minecraft.server.level.ServerPlayerGameMode.useItemOn(ServerPlayerGameMode.java:532)
Caused by: java.lang.NullPointerException: Cannot invoke "org.bukkit.inventory.ItemStack.getType()" because "item" is null
at com.example.shop.ShopListener.onInteract(ShopListener.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Algorytm czytania:
-
Pierwsza linijka - co sie stalo: "Could not pass event PlayerInteractEvent to ShopPlugin". Od razu jasne - problem w ShopPlugin przy obsludze klikniecia gracza.
-
"Caused by" - realna przyczyna.
NullPointerException: Cannot invoke "getType()" because "item" is null. Plugin probuje pobrac typ przedmiotu, ale przedmiot jest null. -
Linijka z twoim pluginem -
ShopListener.java:78. To linijka 78 w pliku ShopListener.java. Jesli plugin jest twoj - idziesz naprawic te linijke. Jesli nie twoj - robisz issue na GitHubie albo szukasz aktualizacji.
Linie z org.bukkit, net.minecraft, java.lang i sun.reflect to wnetrznosci serwera i Javy. Zwykle nie sa przyczyna problemu, tylko pokazuja sciezke wykonania.
Typowe bledy i co z nimi robic
"Can't keep up! Is the server overloaded?"
Juz wspomnialem wyzej. Serwer zostaje w tyle za normalnymi 20 tickami na sekunde. Przyczyny:
- Za duzo encji
- Ciezki plugin w glownym watku
- Za malo RAM i czeste pauzy GC
- Wolny dysk (SSD obowiazkowy dla serwerow)
Szczegolowo o diagnostyce lagow czytaj w naszym poradniku o przyczynach lagow.
"Connection throttled"
[WARN]: Connection throttled: 185.220.101.34
Ktos laczy sie za czesto. Moze to byc bot, moze atak DDoS na poziomie aplikacji. Jesli widzisz jedno IP z setkami throttli - blokuj przez firewall.
"Disconnect: Outdated client/server"
[INFO]: Disconnect: com.mojang.authlib.GameProfile@... (Outdated client! Please use 1.20.4)
Gracz probuje wejsc na zlej wersji. Jesli takich wpisow jest duzo z jednego IP - to moze byc skaner przeczesujacy wersje protokolu.
OutOfMemoryError
[FATAL]: java.lang.OutOfMemoryError: Java heap space
Skonczyla sie pamiec. Sprawdz flagi startowe - ile pamieci przydzielono serwerowi przez -Xmx. Uzyj poprawnych flag JVM. Moze tez byc wyciek pamieci w pluginie - plugin tworzy obiekty i nie zwalnia ich.
"IOException: Connection reset by peer"
[WARN]: IOException: Connection reset by peer
Klient zerwal polaczenie. Zwykle nieszkodliwe - gracz wylecial albo zamknal gre. Ale jesli masowo - moze byc atak. Sprawdz, z jakich IP przychodza te zerwania.
"Moved too quickly!"
[WARN]: Player_Steve moved too quickly! (23.45, 0.0, 18.76)
Gracz przemiescil sie za szybko. Albo lag, albo cheater uzywa speed-hack. Pojedyncze przypadki - normalne (lagi). Jesli jeden gracz stale dostaje takie ostrzezenia - warto sprawdzic.
Crash reporty
Crash raporty sa bardziej informacyjne niz zwykle logi. Otworz plik z crash-reports/ - jest strukturyzowany na sekcje:
---- Minecraft Crash Report ----
Time: 2026-03-25 15:14:32
Description: Exception in server tick loop
java.lang.OutOfMemoryError: Java heap space
at net.minecraft.nbt.CompoundTag.copy(CompoundTag.java:265)
...
-- System Details --
Minecraft Version: 1.20.4
Operating System: Linux (amd64) version 5.15.0
Java Version: 17.0.9
Memory: 234217728 bytes / 8589934592 bytes
Plugins:
EssentialsX v2.20.1
WorldGuard v7.0.9
ShopPlugin v2.1
...
-- World Details --
Loaded chunks: 4521
Entities: 18432
Na co zwracac uwage:
- Description - krotki opis przyczyny padu
- Stack trace - gdzie dokladnie wystapil blad
- Memory - ile pamieci uzyto vs dostepne. Jesli uzyto blisko maksimum - OOM
- Entities - jesli liczba jest ogromna (10000+), mozliwe, ze to przyczyna
- Plugins - lista zaladowanych pluginow. Jesli w stack trace wspomniany jest jeden z nich - to glowny podejrzany
Thread dumpy
Thread dump to snapshot wszystkich watkow serwera w konkretnym momencie. Przydatne, gdy serwer "zawisl" - nie pada, ale nie odpowiada.
Na serwerach Paper:
/paper dump threads
Albo przez sygnal kill:
kill -3 $(cat server.pid)
# lub
jstack $(cat server.pid) > thread_dump.txt
W thread dumpie szukaj watkow w stanie BLOCKED lub WAITING. Jesli Server thread jest zablokowany - serwer wisi. Patrz, na jakim wywolaniu zawisnal:
"Server thread" #1 prio=5 os_prio=0 tid=0x00007f... nid=0x1a23 waiting for monitor entry
java.lang.Thread.State: BLOCKED (on object monitor)
at com.example.plugin.Database.query(Database.java:156)
- waiting to lock <0x000000076ab8c120>
at com.example.plugin.Handler.onEvent(Handler.java:42)
Widac, ze glowny watek jest zablokowany na zapytaniu do DB w jakims pluginie. Plugin robi synchroniczne zapytanie do bazy danych w glownym watku - klasyczny blad, ktory wiesza caly serwer.
Szukanie sladow wlamania w logach
Logi to twoj system bezpieczenstwa. Jesli ktos probuje wlamac sie na serwer, slady zostaja. Oto co szukac:
Podejrzane komendy
grep -i "issued server command" logs/latest.log | grep -i "op\|deop\|ban\|perm\|gamemode\|give"
Szukamy, kto wykonywal komendy administracyjne. Jesli gracz, ktory nie powinien byc operatorem, nagle wykonuje /op albo /gamemode - to wlamanie.
Proby eksploitow
# Szukanie podejrzanie dlugich wiadomosci (mozliwy book exploit)
grep "AsyncChat" logs/latest.log | awk '{if(length($0) > 500) print}'
# Szukanie prob uzycia komend serwerowych przez czat
grep -i "selector\|@a\|@e\|@r\|@p" logs/latest.log
Masowe polaczenia
# Kto laczyl sie najczesciej
grep "logged in with entity" logs/latest.log | awk -F'[/:]' '{print $2}' | sort | uniq -c | sort -rn | head 20
Jesli jeden nick albo IP wchodzi setki razy - to bot albo atak. Warto skonfigurowac ochrone przed botami.
Niezwykla aktywnosc noca
# Co dzialo sie miedzy 3:00 a 5:00
grep "^\[0[3-4]:" logs/latest.log | grep -v "INFO.*save\|INFO.*Saving"
Jesli noca, gdy nikt nie gra, dzieje sie cos dziwnego - warto sprawdzic.
Wiecej o bezpieczenstwie: checklista bezpieczenstwa serwera Minecraft i monitoring atakow.
Przydatne komendy grep
Grep to twoj najlepszy przyjaciel przy analizie logow. Zestaw komend, ktorych uzywam stale:
# Wszystkie bledy z ostatniej sesji
grep "ERROR\|FATAL" logs/latest.log
# Bledy konkretnego plugina
grep "PluginName" logs/latest.log | grep -i "error\|exception\|warn"
# Ile razy kazdy poziom wystepuje
grep -c "INFO\]" logs/latest.log
grep -c "WARN\]" logs/latest.log
grep -c "ERROR\]" logs/latest.log
# Kto wchodzil na serwer
grep "joined the game\|left the game" logs/latest.log
# Wszystkie komendy wykonane przez graczy
grep "issued server command" logs/latest.log
# Bledy w archiwalnych logach
zgrep "ERROR" logs/2026-03-*.log.gz
# Ostatnie 50 bledow z kontekstem (3 linie przed i po)
grep -n "ERROR" logs/latest.log | tail -50
grep -B3 -A3 "ERROR" logs/latest.log | tail -100
# Szukanie w kilku plikach naraz
zgrep -l "OutOfMemoryError" logs/*.log.gz
Monitoring w czasie rzeczywistym
# Sledzenie loga na zywo
tail -f logs/latest.log
# Tylko bledy w czasie rzeczywistym
tail -f logs/latest.log | grep --line-buffered "ERROR\|WARN\|FATAL"
# Z podswietleniem (jesli masz ccze)
tail -f logs/latest.log | ccze -A
Timings i raporty spark
Do analizy wydajnosci same logi nie wystarcza. Timings (przestarzaly) i spark (nowoczesny) daja szczegolowy obraz tego, co serwer robi kazdy tick.
Raport spark pokazuje:
- Ktore pluginy ile czasu zajmuja
- Gdzie dokladnie idzie czas CPU
- Stan pamieci i pauzy GC
- Konkretne metody spowalniajace
/spark profiler start
# poczekaj 3-5 minut
/spark profiler stop
spark stworzy link do raportu www. Otworz i szukaj najciezszych galezi. Wiecej o profilowaniu w artykule o diagnostyce lagow.
Rotacja i przechowywanie logow
Domyslnie Minecraft trzyma archiwalne logi wiecznie. Na dlugo zyjacym serwerze to gigabajty. Skonfiguruj rotacje:
# Skrypt usuwania starych logow (starszych niz 30 dni)
find /path/to/server/logs -name "*.log.gz" -mtime +30 -delete
Dodaj do crona:
0 4 * * 0 find /path/to/server/logs -name "*.log.gz" -mtime +30 -delete
Ale nie kasuj logow za wczesnie - moga sie przydac do dochodzenia w sprawie incydentow. 30 dni to rozsadne minimum. Jesli miejsce pozwala - trzymaj 90 dni.
Automatyzacja analizy
Zamiast recznie parsowac co dzien mozna napisac prosty skrypt:
#!/bin/bash
LOG="logs/latest.log"
echo "=== Server Log Summary ==="
echo "Errors: $(grep -c 'ERROR\]' $LOG)"
echo "Warnings: $(grep -c 'WARN\]' $LOG)"
echo "Fatals: $(grep -c 'FATAL\]' $LOG)"
echo ""
echo "=== Top Errors ==="
grep 'ERROR\]' $LOG | sed 's/\[.*ERROR\]: //' | sort | uniq -c | sort -rn | head -10
echo ""
echo "=== Player Activity ==="
echo "Joins: $(grep -c 'joined the game' $LOG)"
echo "Leaves: $(grep -c 'left the game' $LOG)"
echo ""
echo "=== Overload Warnings ==="
grep -c "Can't keep up" $LOG
Odpalaj rano - w minute zobaczysz obraz z nocy.
Do powazniejszego monitoringu uzywaj specjalizowanych narzedzi. O tym, jak skonfigurowac pelnoprawny monitoring, czytaj w naszym artykule o monitoringu serwera Minecraft.
Podsumowanie
Logi to nie tylko pliki tekstowe zjadajace miejsce na dysku. To twoja czarna skrzynka, twoj detektyw, twoje zrodlo prawdy.
Minimum, ktore powinien robic kazdy administrator:
- Sprawdzac logi po kazdym restarcie - zobacz, czy nie ma bledow
- Monitorowac ERROR i FATAL - zawsze wymaga uwagi
- Analizowac crash raporty - zawieraja cale info do diagnostyki
- Okresowo sprawdzac logi pod katem bezpieczenstwa - szukac podejrzanych komend i masowych polaczen
- Skonfigurowac rotacje - zeby dysk sie nie przepelnil
- Nauczyc sie podstawowych komend grep - to zaoszczedzi godziny czasu
Nie czekaj, az gracze przyjda z zazaleniami. Czytaj logi proaktywnie - wiekszosc problemow zostawia slady na dlugo przed tym, jak staja sie krytyczne.
Chroń swój serwer przed atakami DDoS
Darmowa ochrona z konfiguracją w 5 minut. 1 TB ruchu w zestawie.
Wypróbuj za darmoPowiązane artykuły
Checklista bezpieczeństwa serwera Minecraft: 15 punktów na 2026 rok
Pełna checklista bezpieczeństwa serwera Minecraft: od aktualizacji oprogramowania i konfiguracji firewalla po ochronę DDoS i plan reagowania na incydenty. 15 konkretnych kroków z przykładami configów.
LiteBans vs AdvancedBan: który plugin moderacji wybrać (2026)
LiteBans jest płatny z dołączonym web UI w PHP, AdvancedBan darmowy i open source. Oba pokrywają /ban, /tempban, /mute, /warn, /kick i per-network bany przez MySQL. Rozkładamy komendy, API, migrację, wydajność i kiedy co pasuje.
Velocity vs BungeeCord: czemu pora przejść
Szczegółowe porównanie dwóch proxy dla Minecrafta: wydajność, bezpieczeństwo i ekosystem pluginów. Omawiamy, dlaczego Velocity wygrywa na wszystkich frontach i jak zmigrować z BungeeCord bez bólu.