Logi i raporty z crashy
Spis tre艣ci
Tw贸j serwer nie chce si臋 uruchomi膰 albo 艣wie偶o wgrany plugin lub mod nie dzia艂a? Pierwszym miejscem do kt贸rego powiniene艣 si臋 uda膰 s膮 foldery /logs/ i /crash-reports/ na Twoim serwerze:
Ka偶dy plik w folderze /logs/ zawiera pe艂ny log z danego uruchomienia Twojego serwera. Najwa偶niejszy jest plik latest.log (fml-server-latest.log na niekt贸rych wersjach Forge) - zawiera on informacji z najnowszej sesji serwera. Przy ka偶dym uruchomieniu serwera plik ten jest nadpisywany, a stary log jest pakowany do archiwum tar.gz z nazw膮 b臋d膮c膮 dat膮 uruchomienia serwera.
Raporty z crashy znajdziesz natomiast w folderze crash-reports - ich nazwy opatrzone s膮 dat膮 i godzin膮 crashu. Crash-report zawiera to skr贸con膮 wersj臋 logu oraz okoliczno艣ci w jakich serwer scrashowa艂.
PAMI臉TAJ!
Wy艣lij plik latest.log zanim zadasz jakiekolwiek pytanie o scrashowany serwer lub niedzia艂aj膮cy plugin na naszym Discordzie.
Czym s膮 logi?
Log (po polsku "dziennik") jest uporz膮dkowan膮 chronologicznie list膮 najwa偶niejszych zdarze艅 z pojedynczego uruchomienia serwera. Ka偶dy wpis do logu opatrzony jest dat膮 oraz godzin膮, tak aby 艂atwo by艂o zlokalizowa膰 interesuj膮ce nas wydarzenia. W pliku dziennika znajdziesz takie informacje jak parametry startowe serwera, 艂adowanie ka偶dego modu czy pluginu, 艣wiat贸w, a nawet ich populacj臋 mobami.
G艂贸wn膮 cech膮 log贸w jest ich czytelno艣膰 - dobrze skonstruowane maj膮 by膰 zrozumia艂em dla przeci臋tnego administratora nieb臋d膮cego programist膮, dlatego podstawowa znajomo艣膰 j臋zyka angielskiego w po艂膮czeniu z Google zazwyczaj s膮 wystarczaj膮ce.
Przyk艂ad 1. Startuj膮cy serwer Forge
Za艂贸偶my, 偶e mamy serwer Forge. Zagl膮daj膮c do pliku latest.log zauwa偶ymy, 偶e wiele z linijek jest napisanych prostym angielskim.
[17:31:30] [Server thread/INFO] [FML]: MinecraftForge v14.23.5.2847 Initialized
[17:31:30] [Server thread/INFO] [FML]: Starts to replace vanilla recipe ingredients with ore ingredients.
[17:31:31] [Server thread/INFO] [FML]: Invalid recipe found with multiple oredict ingredients in the same ingredient...
[17:31:31] [Server thread/INFO] [FML]: Replaced 1227 ore ingredients
[17:31:31] [Server thread/INFO] [FML]: Config directory created successfully
[17:31:31] [Server thread/INFO] [FML]: Searching /home/servers/684256/./mods for mods
[17:31:32] [Server thread/INFO] [FML]: Forge Mod Loader has identified 4 mods to load
[17:31:32] [Server thread/WARN] [FML]: Missing English translation for FML: assets/fml/lang/en_us.lang
[17:31:33] [Server thread/INFO] [FML]: Attempting connection with missing mods [minecraft, mcp, FML, forge] at CLIENT
[17:31:33] [Server thread/INFO] [FML]: Attempting connection with missing mods [minecraft, mcp, FML, forge] at SERVER
[17:31:33] [Server thread/INFO] [FML]: Processing ObjectHolder annotations
[17:31:33] [Server thread/INFO] [FML]: Found 1169 ObjectHolder annotations
[17:31:33] [Server thread/INFO] [FML]: Identifying ItemStackHolder annotations
[17:31:33] [Server thread/INFO] [FML]: Found 0 ItemStackHolder annotations
[17:31:33] [Server thread/INFO] [FML]: Configured a dormant chunk cache size of 0```
S艂owa kluczowe
W poszukiwaniu przyczyny naszych problem贸w przydaj膮 si臋 s艂owa kluczowe poprzedzaj膮ce ka偶dy wpis do dziennika. Jak to jest pokazane w przyk艂adzie 1. ka偶dy wpis poprzedzony jest tagami: [17:31:33] [Server thread/INFO] [FML]
.
* [17:31:33]
- to oczywi艣cie godzina, o kt贸rej dane zdarzenie mia艂o miejsce. Czasami podawana jest r贸wnie偶 data.
* [FML]
- pojawia si臋 tylko w logach serwer贸w Forge - oznacza Forge Mod Loader.
* [Server thread/INFO]
- najwa偶niejszy z tag贸w, Server thread
okre艣la proces, a INFO
to rodzaj wpisu do dziennika.
Znaj膮c typy wpis贸w 艂atwo znajdziemy pow贸d problemu!
* INFO
- to wpis informacyjny. Zazwyczaj informuje nas, 偶e dana akcja przebieg艂a pomy艣lnie. Dlatego w wi臋kszo艣ci przypadk贸w b臋dziemy pomija膰 linijki INFO przy troubleshootingu.
* WARN
- to inaczej ostrze偶enie. Najcz臋艣ciej taka linijka pojawi si臋 w momencie, gdy serwer napotka jaki艣 wyj膮tek, ale mo偶e dzia艂a膰 dalej (patrz przyk艂ad 2. - Authme - protectInventory).
* ERROR
- serwer napotka艂 b艂膮d kt贸ry uniemo偶liwi艂 jego (lub pluginu) dalsze dzia艂anie (patrz przyk艂ady 4. oraz 5.).
Je艣li nasz serwer nie dzia艂a tak jak powinien, pierwszym co powinni艣my zrobi膰, to otworzy膰 plik latest.log (bez uruchamiania serwera - ka偶de jego uruchomienie nadpisuje latest.log) i poszuka膰 (CTRL + F) wpis贸w poprzedzonych WARN
lub ERROR
Najcz臋stsze b艂臋dy i jak je rozpozna膰 w logach
Przyk艂ad 2. WARN - AuthMeReloaded i niedzia艂aj膮ce protectInventory
Za艂贸偶my, 偶e uda艂o nam si臋 zainstalowa膰 AuthMe, sam plugin poprawnie obs艂uguje rejestracj臋, ale jedna z jego funkcji - protectInventory - nie dzia艂a. W rezultacie ekwipunek postaci przed zalogowaniem nie jest chroniony. Je艣li u艣miercimy tak膮 posta膰, to straci ona sw贸j dobytek (co nie powinno mie膰 miejsca).
Szukaj膮c wyra偶e艅 zawieraj膮cych WARN
natrafiamy na:
[17:23:17] [Server thread/INFO]: [AuthMe] Enabling AuthMe v5.6.0-SNAPSHOT-b2325
[17:23:18] [Server thread/INFO]: [AuthMe] SQLite Setup finished
[17:23:18] [Server thread/INFO]: [AuthMe] No supported rmissions system found! Permissions are disabled!
[17:23:19] [Server thread/INFO]: [AuthMe] [LICENSE] This product includes GeoLite2 data created by MaxMind, available at https://www.maxmind.com
[17:23:19] [Server thread/INFO]: [AuthMe] Essentials spawn file not found: '/home/servers/683508/plugins/Essentials/spawn.yml'
[17:23:19] [Server thread/WARN]: [AuthMe] WARNING! The protectInventory feature requires ProtocolLib! Disabling it...
Jak widzimy w ostatniej linijce, tej oznaczonej tagiem WARN
, protectInventory do dzia艂ania wymaga pluginu ProtocolLib. Wystarczy go zainstalowa膰, a ekwipunek niezalogowanych postaci b臋dzie bezpieczny!
Przyk艂ad 3. WARN - AuthMe i nieuruchamiaj膮cy si臋 serwer
Wgrali艣my na nasz serwer AuthMeReloaded, lecz ten nie chce si臋 uruchomi膰. Szukaj膮c WARN
znajdujemy:
[10:52:08] [Server thread/INFO]: [AuthMe] Enabling AuthMe v5.6.0-beta1-b2226
[10:52:09] [Server thread/INFO]: [AuthMe] SQLite Setup finished
[10:52:09] [Server thread/INFO]: [AuthMe] Hooked into LuckPerms!
[10:52:09] [Server thread/INFO]: [AuthMe] Hooked successfully into Essentials
[10:52:09] [Server thread/WARN]: [AuthMe] Aborting initialization of AuthMe: [InjectorReflectionException]: Could not invoke constructor of class 'class fr.xephi.authme.command.CommandHandler'
[10:52:09] [Server thread/WARN]: [AuthMe] THE SERVER IS GOING TO SHUT DOWN AS DEFINED IN THE CONFIGURATION!
Przedostatnia z grubsza wyja艣niaj膮 nam w czym problem. AuthMe nie m贸g艂 wywo艂a膰 konstruktora (metody inicjuj膮cej) obiektu obs艂uguj膮cego komendy, przez co dalsze 艂adowanie pluginu by艂o niemo偶liwe (a raczej bezcelowe).
Ostatnia linijka m贸wi nam natomiast, 偶eby zabezpieczy膰 nasz serwer przed grieferami, AuthMe nie mog膮c obs艂ugiwa膰 rejestracji i logowania po prostu go wy艂膮czy艂o.
Jako, 偶e ca艂e zaj艣cie jest rezultatem b艂臋du programisty, w tym wypadku wystarczy zainstalowa膰 nowsz膮 wersj臋 AuthMeReloaded.
Przyk艂ad 4. ERROR - Nieskonfigurowany plugin
Wgrali艣my na nasz serwer plugin LogBlock 偶eby jeszcze lepiej zabezpieczy膰 nasz kwadratowy 艣wiat przed z艂o艣liwymi graczami. Niestety, plugin nie 艂aduje si臋 i komenda /plugins
wy艣wietla go na czerwono.
Szukaj膮c ERROR
natriafiamy na:
[22:50:03] [Server thread/INFO]: [LogBlock] Enabling LogBlock v1.14.1-SNAPSHOT (build #65)
[22:50:03] [Server thread/INFO]: [LogBlock] Connecting to username@jdbc:mysql://localhost:3306/minecraft...
[22:50:03] [Server thread/INFO]: LogBlock-Connection-Pool - Starting...
[22:50:04] [Server thread/ERROR]: LogBlock-Connection-Pool - Exception during pool initialization.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Linijka oznaczona tagiem ERROR
(ostatnia) informuje nas, 偶e nast膮pi艂 wyj膮tek podczas inicjalizacji puli po艂膮cze艅, a czytaj膮c kilka linijek wy偶ej dowiadujemy si臋, 偶e musimy poda膰 dane do bazy MySQL, poniewa偶 LogBlock pr贸bowa艂 po艂膮czy膰 si臋 z ni膮 korzystaj膮c z przyk艂adowych danych username@jdbc:mysql://localhost:3306/minecraft
.
Przyk艂ad 5. ERROR - B艂臋dy mapy
Przez jaki艣 czas grali艣my na wersji 1.14.4, ale poniewa偶 by艂y du偶e lagi, zmienili艣my wersj臋 na 1.12.2, ale teraz serwer nie chce si臋 uruchomi膰. W logach znajdujemy:
[17:31:36] [Server thread/INFO] [net.minecraft.server.MinecraftServer]: Preparing start region for level 0
[17:31:36] [Server thread/WARN] [net.minecraft.world.chunk.Chunk]: Could not set level chunk heightmap, array length is 0 instead of 256
[17:31:36] [Server thread/ERROR] [net.minecraft.server.MinecraftServer]: Encountered an unexpected exception
java.lang.IllegalArgumentException: ChunkNibbleArrays should be 2048 bytes not: 0
at net.minecraft.world.chunk.NibbleArray.<init>(SourceFile:16) ~[axs.class:?]
at net.minecraft.world.chunk.storage.AnvilChunkLoader.func_75823_a(AnvilChunkLoader.java:450) ~[aye.class:?]
at net.minecraft.world.chunk.storage.AnvilChunkLoader.checkedReadChunkFromNBT__Async(AnvilChunkLoader.java:129) ~[aye.class:?]
at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk__Async(AnvilChunkLoader.java:93) ~[aye.class:?]
at net.minecraftforge.common.chunkio.ChunkIOProvider.run(ChunkIOProvider.java:70) ~[ChunkIOProvider.class:?]
at net.minecraftforge.common.chunkio.ChunkIOExecutor.syncChunkLoad(ChunkIOExecutor.java:92) ~[ChunkIOExecutor.class:?]
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:118) ~[on.class:?]
at net.minecraft.world.gen.ChunkProviderServer.func_186028_c(ChunkProviderServer.java:89) ~[on.class:?]
at net.minecraft.world.gen.ChunkProviderServer.func_186025_d(ChunkProviderServer.java:135) ~[on.class:?]
at net.minecraft.server.MinecraftServer.func_71222_d(MinecraftServer.java:344) ~[MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.func_71247_a(MinecraftServer.java:314) ~[MinecraftServer.class:?]
at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:270) ~[nz.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486) [MinecraftServer.class:?]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_201]
Tym razem wpis zawiera fragment stacktrace'u Javy. Widzimy, 偶e powtarzaj膮 si臋 w nim wyra偶enia takie jak world.chunk
, AnvilChunkLoader
, ChunkProviderServer
etc., co pozwala nam s膮dzi膰, 偶e nasza mapa jest popsuta.
W naszym przypadku jednak, zapomnieli艣my usun膮膰 map臋 z wersji 1.14.4. Zawiera ona bloki nie istniej膮ce w 1.12.2, przez co serwer traktuje j膮 jako popsut膮. Wystarczy usun膮膰 stary 艣wiat, a serwer uruchomi si臋 bez problem贸w.
Przyk艂ad 6. ERROR - Niespe艂nione zale偶no艣ci
Wgrali艣my plugin na serwer, ale ten nie chce si臋 za艂adowa膰. W logach znajdujemy:
[19:23:19] [Server thread/ERROR]: Could not load 'plugins/Modifyworld.jar' in folder 'plugins'
org.bukkit.plugin.UnknownDependencyException: PermissionsEx
UnknownDependencyException
oznacza, 偶e nasz Modifyworld do poprawnego dzia艂ania wymaga PermissionsEx. Po zainstalowaniu, plugin 艂aduje si臋 bez b艂臋d贸w.
Zako艅czenie
Jak zobaczyli艣my w przyk艂adach, diagnostyka problem贸w z pomoc膮 log贸w nie jest trudna. Wystarczy zna膰 podstawy angielskiego, a je艣li mamy jaki艣 problem, jest niemal pewne, 偶e kto艣 ju偶 go wcze艣niej mia艂 oraz, 偶e kopiuj膮c linijk臋 b艂臋du do Google, znajdziemy rozwi膮zanie. A w razie trudno艣ci, zapraszamy z plikiem latest.log na Discord Craftserve.