RE:NODE

Log serveru Valheim: start, připojení hráčů a chyby

Text: Tým RE:NODE
12 min čtení


Log serveru Valheim je jediné místo, kde se server vysvětluje sám. Ve výchozím stavu jde na standardní výstup - do terminálu, konzole panelu, docker logs nebo žurnálu systemd - a -logFile /path/to/file.log ho místo toho pošle do souboru. Zdravý start se čte v pevném pořadí: inicializuje se Unity a Steam, načte se nebo vygeneruje svět, server se zaregistruje a na crossplay serveru se objeví řádek se šestimístným join kódem. Poté každý hráč, který se připojí, zanechá krátkou stopu řádků se svým ID, jménem postavy a nakonec zavřeným socketem. Většina zbytku je šum. Těch pár řádků, na kterých záleží - nesoulad verzí, špatná hesla, odmítnutá ID, selhání uložení, chybějící knihovny - je to, co tě tento článek naučí najít.

Přesné znění řádků logu se mezi verzemi hry mění. Příklady níže jsou typické pro současné buildy; hledej podle charakteristické části řádku, ne podle každého slova.

Kam log jde#

Valheim si vlastní soubor s logem nevede, dokud o něj nepožádáš. Bez -logFile jde výstup tam, odkud byl proces spuštěn:

Jak server běžíKde číst log
Linux, ručně nebo v tmux / screenV terminálové relaci
Linux, pod systemdjournalctl -u valheim (název tvé jednotky)
Dockerdocker logs <container> nebo vlastní cesta logu v image
Okno konzole ve WindowsV samotném okně, které se zavře, když proces skončí
Hosting s panelemŽivá konzole
Cokoli z toho s -logFileV souboru, který jsi pojmenoval

-logFile je argument přehrávače Unity, ne Valheimu, a píše se s velkým F:

bash
$ ./valheim_server.x86_64 -nographics -batchmode \    -name "Ravenhold" -port 2456 -world "Midgard" \    -password 'herring-barrel-42' -logFile /home/valheim/logs/valheim.log

Používej ho všude, kde by výstup jinak zmizel - především ve Windows, kde server, který umře při startu, vezme s sebou okno konzole i důvod. U systemd nebo Dockeru je obvykle lepší ho vynechat, protože žurnál a běhové prostředí kontejneru už výstup uchovávají, rotují a opatřují časovými značkami. Jeden háček: soubor zadaný v -logFile se obvykle při dalším startu přepíše. Pokud server spadl, zkopíruj soubor před restartem, jinak jediný důkaz zmizí s dalším spuštěním.

Klient má také svůj log. Ve Windows je to Player.log v %USERPROFILE%\AppData\LocalLow\IronGate\Valheim\. Když hráč říká, že se nemůže připojit, jeho log a log serveru čtené vedle sebe to obvykle vyřeší za minutu.

Normální start, popořadě#

Start, který funguje, vyprodukuje dlouhou dávku výstupu. Nepotřebuješ každý řádek; potřebuješ znát orientační body, protože místo, kde se zastaví, je místo problému. Silně zkráceně, s vynechanými stovkami řádků mezi nimi, vypadá start nějak takto:

code
Fallback handler could not load library .../libdl.soLoad world: Midgard (Midgard)Zonesystem StartDungeonDB StartGame server connectedSession "Ravenhold" with join code 483920 and IP 203.0.113.10:2456 is active with 0 player(s)

Čteno shora dolů to říká:

  1. Unity se inicializovalo. Nejdřív přijdou řádky o subsystémech a grafickém zařízení. Na serveru bez grafiky jsou zprávy o chybějícím grafickém zařízení očekávané.
  2. Načetlo se herní server API od Steamu. Bez něj server nemůže ověřovat hráče ani se nikde registrovat. V Linuxu je selhání v tomto místě téměř vždy steamclient.so, který se nenašel.
  3. Svět se načetl, nebo vytvořil. Řádek Load world: Midgard s názvem tvého světa je ten, který hledáš. Pokud log mluví o generování nového světa, když čekáš existující, název v -world neodpovídá názvu souboru - včetně velkých písmen - a server vytvořil nový svět vedle starého.
  4. Spustil se systém zón a databáze dungeonů. Ty přicházejí po načtení světa; zastavení mezi načtením světa a těmito řádky ukazuje na poškozený soubor světa.
  5. Server se připojil ke Steamu a zaregistroval. „Game server connected“ nebo něco podobného znamená, že ho backend přijal. Na crossplay serveru se kolem tohoto místa objevují také řádky PlayFab.
  6. Řádek relace. Na crossplay serveru obsahuje join kód; na jakémkoli serveru potvrzuje název, adresu a počet hráčů.

U zralého světa může být prodleva mezi „Load world“ a řádkem relace desítky vteřin. To se čte soubor světa z disku a staví se data zón a roste to s velikostí světa. Hráči, kteří se v té prodlevě pokusí připojit, dostanou „Failed to connect“, a proto server, který „běží“ podle seznamu procesů, ještě nemusí být připravený.

Join kód a řádek relace#

Na serveru spuštěném s -crossplay se join kód vypíše v řádku podobném tomuto:

code
Session "Ravenhold" with join code 483920 and IP 203.0.113.10:2456 is active with 0 player(s)

Řádek se opakuje, dokud server běží, a počet hráčů v něm se mění, jak lidé přicházejí a odcházejí, což je levný způsob, jak jedním pohledem vidět obsazenost. Kód se generuje při startu a po každém restartu se změní. Pokud ho zveřejňuješ v kanálu na Discordu, aktualizuj ho po každém restartu, nebo zvol pevný čas restartu, aby parta věděla, kdy se podívat.

Pokud crossplay server join kód nikdy nevypíše, nezaregistroval se u PlayFab. Obvyklé příčiny jsou server, který se nemůže dostat ven na internet, výpadek PlayFab nebo dřívější selhání při startu, které bylo přehlédnuto. Hráči ze Steamu se mezitím mohou připojit adresou. Stranu relay popisuje článek crossplay a hráči na Xboxu.

Na serveru jen pro Steam bez -crossplay žádný join kód není a řádek relace může chybět nebo být kratší, podle verze. Hledej místo toho řádek o registraci u Steamu.

Řádky o připojení, vstupu a odpojení#

Každý hráč, který se připojí, zanechá rozpoznatelnou sekvenci. Na serveru jen pro Steam vypadá zhruba takto:

code
Got connection SteamID 76561198012345678Got handshake from client 76561198012345678Server: New peer connected,sending global keysGot character ZDOID from Sigrid : 1234567890:1

A když odejde:

code
Closing socket 76561198012345678

Co ti jednotlivé části říkají:

  • `Got connection SteamID ...` - síťové spojení dorazilo. Je to nejstarší důkaz, že port je otevřený a hráč našel správný server. Pokud hráč říká „Failed to connect“ a tento řádek se pro něj nikdy neobjeví, problém je v adrese, portu nebo firewallu, ne v ničem uvnitř Valheimu.
  • `Got handshake from client ...` - klient promluvil herním protokolem. Kolem tohoto místa proběhnou kontroly verze, hesla a seznamů.
  • `Got character ZDOID from Name : ...` - hráč prošel všemi kontrolami a objevil se ve hře. Tento řádek ti říká, kdo skutečně vstoupil do světa, i se jménem postavy. Je to řádek, na který čekají skripty s oznámeními o připojení a boti pro Discord.
  • `Closing socket ...` - spojení skončilo, z jakéhokoli důvodu: běžné odhlášení, pád, vyhození, vypršení časového limitu.

ZDOID 0:0 v řádku o postavě je dobře známý znak toho, že hráč zemřel, ne že se připojil; nástroje, které oznamují připojení na Discord, ho odfiltrují.

Na crossplay serveru nesou řádky o připojení ID s prefixem platformy - například Steam_76561198012345678 nebo Xbox_... - a řádky socketů PlayFab, a prosté SteamID se nemusí objevit. Ať log ukazuje jakoukoli podobu, přesně tu potřebují soubory se seznamy. Je to spolehlivý způsob, jak zjistit ID hráče pro adminlist.txt nebo permittedlist.txt: nech ho jednou se připojit a zkopíruj ID z logu. Formáty vysvětluje článek soubory se seznamy.

Takto vytáhneš všechna připojení z dlouhého logu v Linuxu:

bash
$ grep "Got character ZDOID" valheim.log | grep -v ": 0:0"$ grep -E "Got connection|Closing socket" valheim.log | tail -n 40

Řádky, které vysvětlí odmítnutého hráče#

Když je hráč odmítnut, server obvykle řekne proč v jediném řádku poblíž jeho připojení. Znění se liší; charakteristická fráze ne.

Řádek obsahujeVýznamOprava
has wrong passwordHeslo nesouhlasíZjisti, co hráč napsal; viz pravidla hesla
incompatible versionBuild klienta a serveru se liší, vypsány jsou obě verzeAktualizuj tu stranu, která zaostává
is blacklisted or not in whitelistJeho ID je v bannedlist.txt, nebo existuje seznam povolených bez nějUprav soubor se seznamem
Server is full nebo podobněUž je připojeno deset hráčůPočkej, nebo vyhoď někoho nečinného

Řádek o verzi je z nich nejužitečnější, protože vypisuje obě čísla - serveru i klienta - takže víš, kterou stranu aktualizovat. Po záplatě Valheimu očekávej sérii takových řádků, dokud se server neaktualizuje, a modovaný server neaktualizuj dřív, než jsou aktualizované jeho mody. Načasování rozebírá článek aktualizace serveru a nesoulad verzí.

Hráč, který dojde k handshaku a pak je odmítnut, dokazuje, že síť je v pořádku. Hráč, který nikdy nevyvolá řádek Got connection, se k serveru vůbec nedostal. Toto jediné rozlišení vyřeší většinu vláken „nemůžu se připojit“; chyby failed to connect prochází každou zprávu na straně klienta.

Uložení a pravidelné stavové řádky#

Valheim drží svět v paměti a zapisuje ho každých -saveinterval vteřin, ve výchozím stavu 1 800. Každé uložení se zaloguje:

code
World saved ( 412.5ms )

Číslo v závorce je doba, jak dlouho uložení trvalo, a stojí za to ho sledovat během života světa. Nový svět se uloží za desítky milisekund; hodně zastavěný a hodně terénně upravený může trvat vteřinu i víc a server během toho zamrzá. Pokud hráči hlásí záseky nebo odpojení každou půlhodinu, porovnej to s řádky o uložení. Řešením je obvykle kratší interval (menší, častější ukládání stojí méně každé), méně volně ležících předmětů a méně úprav terénu, ne větší plán. Delší seznam je v článku výkon a lagy serveru Valheim.

Řádek o uložení je důležitý i při vypínání. Čisté zastavení zapíše svět před ukončením procesu a posledním smysluplným řádkem v logu by mělo být uložení. Pokud log bez něj končí - useknutý uprostřed řádku nebo končící běžným hovorem - proces byl zabit, ne zastaven, a vše od předchozího uložení je pryč.

Server také pravidelně vypisuje stavový řádek podobný tomuto:

code
Connections 3 ZDOS:184211  sent:41 recv:122

Connections je počet připojených peerů. ZDOS je počet objektů světa, které server sleduje - každý díl stavby, předmět, tvor a úprava terénu. Toto číslo jen roste, jak se svět prozkoumává a staví, a je dobrým ukazatelem toho, jak těžký svět je. Náhlý skok o desítky tisíc obvykle znamená, že někdo postavil obrovskou stavbu nebo odhodil horu předmětů.

Šum, který můžeš ignorovat#

Log Valheimu je většinou šum a něco z něj vypadá alarmující. Na fungujícím serveru je normální:

  • `Fallback handler could not load library ...` - Mono zkouší knihovny v Linuxu. Neškodné a při startu se opakuje mnohokrát.
  • Řádky `(Filename: ... Line: ...)` téměř po každé zprávě - odkazy na zdroj z debug buildu Unity. Ignoruj je; čti řádek nad nimi.
  • Varování ke shaderům, grafickému zařízení a zvuku - dedikovaný server nemá grafiku ani zvuk a Unity to zmiňuje.
  • `Destroying abandoned non persistent zdo ...` a podobný úklid ZDO - server uklízí objekty, které nikdo nevlastní.
  • Varování Steam API, po kterých následuje úspěšný řádek „connected“ - první pokus selhal, druhý se povedl.

Image Dockeru od lloesche a několik panelových nastavení část tohoto výchozně filtruje. Log je pak snáze čitelný, ale může skrýt souvislosti, když se něco opravdu pokazí, takže pokud ti problém nedává smysl, podívej se na nefiltrovaný výstup. Obecné rady, jak číst hlučné logy a nepřehlédnout jediný důležitý řádek, najdeš v článku logy herních serverů vysvětleně.

Chybové řádky, na které stojí za to reagovat#

Tyto řádky znamenají, že je něco skutečně rozbité. Většina se objeví při startu.

Řádek nebo vzorCo to znamenáCo zkontrolovat nejdřív
steamclient.so: cannot open shared object fileLinuxový server nemůže najít knihovnu SteamuLD_LIBRARY_PATH, nebo knihovna chybí v instalaci
Stížnost na heslo, pak ukončeníHeslo kratší než 5 znaků nebo uvnitř názvuHodnota -password
Log se zastaví po Load worldSoubor světa je poškozený nebo nečitelnýObnov předchozí .db ze zálohy
Chyba socketu nebo bind s názvem portuJiný proces drží herní portDruhý server nebo zbylý proces
Chyby BepInEx preloaderuZavaděč modů je rozbitý nebo nesedíSložka BepInEx a startovací skript
Log useknutý uprostřed řádku, bez chybyProces byl zabit zvenčíLimit paměti, nebo pád hostitele
Žádný join kód na crossplay serveruRegistrace u PlayFab selhalaOdchozí konektivita, stav PlayFab

Předposlední řádek tabulky si zaslouží druhý pohled. Proces zabitý pro nedostatek paměti nestihne napsat rozloučení; log prostě skončí. Pokud log končí náhle a stroj nebo panel v tu dobu ukazuje paměť na limitu, máš odpověď. Na RE:NODE se server, který dosáhne limitu paměti, zastaví a čistě restartuje, místo aby se nechal swapovat, takže useknutý log vedle grafu paměti na stropu přesně říká, co se stalo. Úplný seznam příčin při startu je v článku server Valheim padá při startu.

Uchovávání a prohledávání logů#

Log, který za týden nedokážeš prohledat, moc nepomůže. Pár návyků:

  • Pod systemd práci dělá žurnál: journalctl -u valheim --since "2 hours ago" a journalctl -u valheim -g "Got character" pokryjí většinu otázek.
  • S `-logFile` ho rotuj sám, jinak soubor poroste donekonečna. Pravidlo logrotate s copytruncate funguje s procesem, který drží soubor otevřený.
  • S Dockerem nastav na kontejneru limity velikosti logu, aby upovídaný server nezaplnil disk.
  • Před aktualizací nebo změnou modů si poznamenej poslední řádek s verzí a ulož kopii logu z čistého startu. Když se něco rozbije, známý dobrý log k porovnání má větší cenu než jakýkoli návod.

Na RE:NODE ukazuje živá konzole nefiltrovaný výstup, s příkazovým řádkem pod ním pro admin příkazy, které vanilla Valheim povoluje, a join kód se tam objeví po každém startu. Správce souborů a SFTP dosáhnou na jakýkoli soubor logu, který zapíšeš přes -logFile. O tom, co a jak dlouho uchovávat, se víc dočteš v článku logy, které stojí za uchování.

FAQ#

Kde je soubor s logem dedikovaného serveru Valheim?

Ve výchozím stavu žádný soubor není: log jde na standardní výstup - do terminálu, okna konzole, konzole panelu, žurnálu nebo docker logs. Přidej -logFile s cestou, aby se zapisoval do souboru, což je jediný způsob, jak ho zachovat, když se okno konzole ve Windows zavře.

Jak v logu najdu ID hráče?

Nech ho jednou se připojit, i když bude odmítnut. Řádky o připojení nesou jeho ID v podobě, kterou server používá - SteamID64 na serveru jen pro Steam, ID s prefixem platformy na crossplay serveru. Zkopíruj ho přesně do souboru se seznamem.

Kde je v logu join kód?

V řádku relace vypsaném po startu na serveru běžícím s -crossplay, vedle názvu serveru a adresy. Při každém restartu se mění, takže si ho po každém přečti znovu.

Proč log pořád ukazuje stejný řádek relace?

Server pravidelně znovu vypisuje stav relace s aktuálním počtem hráčů. Není to chyba a je to rychlý způsob, jak zjistit, kolik lidí je online.

Můžu šum v logu Valheimu skrýt?

Některé image Dockeru a panely běžný šum filtrují výchozně a na vlastním stroji totéž udělá grep -v. Nech si nefiltrovanou kopii pro řešení problémů, protože filtrovaný výstup může skrýt řádek těsně před chybou.

Co znamená ZDOID 0:0 v logu?

Zaloguje se, když postava hráče zemře, ne když se připojí. Skripty oznamující připojení proto ignorují řádky končící 0:0.