RE:NODE

Лог сервера Valheim: запуск, подключения и ошибки

Автор Команда RE:NODE
12 мин чтения


Лог сервера Valheim - единственное место, где сервер объясняет сам себя. По умолчанию он выводится в стандартный вывод - терминал, консоль панели, docker logs или журнал systemd, - а -logFile /path/to/file.log отправляет его в файл. Здоровый запуск читается в строгом порядке: инициализируются Unity и Steam, загружается или генерируется мир, сервер регистрируется, а на кроссплей-сервере появляется строка с шестизначным кодом входа. После этого каждый подключившийся игрок оставляет короткий след из строк с его ID, именем персонажа и, в конце концов, закрытым сокетом. Остальное в основном шум. Несколько строк, которые действительно важны - несовпадение версий, неверные пароли, отклонённые ID, неудачные сохранения, отсутствующие библиотеки, - как раз и учит находить эта статья.

Точные формулировки строк меняются от версии к версии игры. Примеры ниже типичны для текущих сборок; ориентируйтесь на характерную часть строки, а не на каждое слово.

Куда пишется лог#

У Valheim нет собственного файла лога, пока вы его не попросите. Без -logFile вывод идёт туда, откуда запущен процесс:

Как запущен серверГде читать лог
Linux, вручную или в tmux / screenВ сеансе терминала
Linux, под systemdjournalctl -u valheim (имя вашего юнита)
Dockerdocker logs <container> или собственный путь логов образа
Консольное окно WindowsСамо окно, которое закрывается, когда процесс завершается
Хостинг с панельюКонсоль в реальном времени
Любой из вариантов с -logFileУказанный вами файл

-logFile - это аргумент проигрывателя Unity, а не Valheim, и пишется он с заглавной F:

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

Используйте его всякий раз, когда вывод иначе пропадёт, а больше всего - в Windows, где сервер, упавший при запуске, уносит с собой окно консоли и причину. Под systemd или в Docker его обычно лучше не включать, потому что журнал и среда выполнения контейнера уже хранят вывод, ротируют его и ставят метки времени. Один подвох: файл, указанный в -logFile, как правило, перезаписывается при следующем запуске. Если сервер упал, скопируйте файл до перезапуска, иначе единственные улики исчезнут вместе со следующим стартом.

У клиента тоже есть свой лог. В Windows это Player.log в %USERPROFILE%\AppData\LocalLow\IronGate\Valheim\. Когда игрок говорит, что не может войти, его лог и лог сервера, прочитанные рядом, обычно решают вопрос за минуту.

Обычный запуск по порядку#

Успешный запуск выдаёт длинный поток вывода. Каждая строка вам не нужна; нужно знать ориентиры, потому что место, где они обрываются, и есть место проблемы. С большими сокращениями, между этими строками пропущены сотни других, запуск выглядит примерно так:

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)

Читая сверху вниз, это означает:

  1. Unity инициализировалась. Первыми идут строки о подсистемах и графическом устройстве. На безголовом сервере сообщения об отсутствии графического устройства ожидаемы.
  2. Загрузился API игрового сервера Steam. Без него сервер не может аутентифицировать игроков и нигде зарегистрироваться. В Linux сбой здесь почти всегда означает, что не найден steamclient.so.
  3. Мир загружен или создан. Нужно искать строку Load world: Midgard с названием вашего мира. Если лог говорит о создании нового мира, а вы ожидали существующий, значит, имя в -world не совпадает с именем файла, включая регистр, и сервер создал новый мир рядом со старым.
  4. Запустились система зон и база данных подземелий. Они идут после загрузки мира; остановка между загрузкой мира и этими строками указывает на повреждённый файл мира.
  5. Сервер подключился к Steam и зарегистрировался. "Game server connected" или похожая строка означает, что бэкенд его принял. На кроссплей-сервере примерно здесь же появляются строки PlayFab.
  6. Строка сессии. На кроссплей-сервере в ней указан код входа; на любом сервере она подтверждает имя, адрес и число игроков.

На зрелом мире промежуток между "Load world" и строкой сессии может занимать десятки секунд. Это чтение файла мира с диска и построение данных зон, и оно растёт вместе с размером мира. Игроки, пытающиеся войти в этот промежуток, получают "Failed to connect", поэтому сервер, который по списку процессов "работает", может быть ещё не готов.

Код входа и строка сессии#

На сервере, запущенном с -crossplay, код входа печатается в строке такого вида:

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

Строка повторяется, пока сервер работает, а число игроков в ней меняется по мере того, как люди приходят и уходят, так что это дешёвый способ окинуть взглядом занятость сервера. Код генерируется при запуске и меняется после каждого перезапуска. Если вы публикуете его в канале Discord, обновляйте после каждого перезапуска или выберите фиксированное время перезапуска, чтобы группа знала, когда смотреть.

Если кроссплей-сервер так и не печатает код входа, он не зарегистрировался в PlayFab. Обычные причины - сервер не может выйти в интернет, сбой PlayFab или неудавшийся запуск, который проглядели раньше. Игроки Steam тем временем могут входить по адресу. Сторона ретранслятора описана в статье кроссплей и игроки Xbox.

На сервере только для Steam без -crossplay кода входа нет, а строка сессии может отсутствовать или быть короче, в зависимости от версии. Вместо неё ищите строку регистрации в Steam.

Строки подключения, входа и отключения#

Каждый подключившийся игрок оставляет узнаваемую последовательность. На сервере только для Steam она выглядит примерно так:

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

А когда он уходит:

code
Closing socket 76561198012345678

Что говорит каждая часть:

  • `Got connection SteamID ...` - сетевое соединение пришло. Это самое раннее доказательство того, что порт открыт и игрок добрался до нужного сервера. Если игрок пишет "Failed to connect", а этой строки для него нет, проблема в адресе, порте или брандмауэре, а не где-то внутри Valheim.
  • `Got handshake from client ...` - клиент заговорил на протоколе игры. Проверки версии, пароля и списков происходят примерно здесь.
  • `Got character ZDOID from Name : ...` - игрок прошёл все проверки и появился в мире. Эта строка показывает, кто на самом деле вошёл в мир, с именем персонажа. Именно её отслеживают скрипты уведомлений о входе и боты Discord.
  • `Closing socket ...` - соединение завершилось по любой причине: обычный выход, сбой, кик, тайм-аут.

ZDOID, равный 0:0, в строке персонажа - известный признак смерти игрока, а не входа; инструменты, объявляющие о входах в Discord, отфильтровывают его.

На кроссплей-сервере строки подключения несут ID с префиксом платформы - например Steam_76561198012345678 или Xbox_... - и строки сокетов PlayFab, а обычная форма SteamID может не появляться. Какую бы форму ни показал лог, именно она нужна файлам списков. Это надёжный способ узнать ID игрока для adminlist.txt или permittedlist.txt: пусть он подключится один раз, и скопируйте ID из лога. Форматы описаны в статье файлы списков.

Чтобы вытащить все входы из длинного лога в Linux:

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

Строки, объясняющие отказ игроку#

Когда игрока не пускают, сервер обычно объясняет причину одной строкой рядом с его подключением. Формулировки меняются; характерная фраза - нет.

Строка содержитЗначениеЧто делать
has wrong passwordПароль не совпалПроверьте, что ввёл игрок; см. правила пароля
incompatible versionСборки клиента и сервера различаются, обе версии напечатаныОбновите ту сторону, что отстала
is blacklisted or not in whitelistЕго ID в bannedlist.txt, либо список разрешённых есть, а его в нём нетИсправьте файл списка
Server is full или похожееУже подключено десять игроковПодождите или выкиньте неактивного

Строка о версии полезнее остальных, потому что печатает оба номера - сервера и клиента, - и вы знаете, какую сторону обновлять. После патча Valheim ожидайте череду таких строк, пока сервер не обновлён, и не обновляйте сервер с модами, пока не обновлены сами моды. О сроках рассказывает статья обновление сервера и несовпадение версий.

Игрок, дошедший до рукопожатия и затем получивший отказ, доказывает, что с сетью всё в порядке. Игрок, у которого нет строки Got connection, до сервера не добрался вовсе. Это различие разрешает большинство тем "не могу зайти"; все сообщения на стороне клиента разобраны в статье ошибки failed to connect.

Сохранения и периодические строки состояния#

Valheim держит мир в памяти и записывает его каждые -saveinterval секунд, по умолчанию 1800. Каждое сохранение пишется в лог:

code
World saved ( 412.5ms )

Число в скобках - сколько заняло сохранение, и за ним стоит следить на протяжении жизни мира. Новый мир сохраняется за десятки миллисекунд; сильно застроенный и изрытый терраформингом может занимать секунду и больше, и всё это время сервер подвисает. Если игроки жалуются на рывок или отключение каждые полчаса, сопоставьте это со строками сохранения. Лечится это обычно более коротким интервалом (меньшие, но более частые сохранения обходятся дешевле), меньшим числом брошенных предметов и менее масштабным терраформингом, а не более крупным тарифом. Более длинный список есть в статье производительность и лаги сервера Valheim.

Строка сохранения важна и при остановке. Корректная остановка записывает мир до выхода процесса, и последней значимой строкой в логе должно быть сохранение. Если лог закончился без него - оборвался на полуслове или завершился обычной болтовнёй, - процесс был убит, а не остановлен, и всё после предыдущего сохранения потеряно.

Периодически сервер также печатает строку состояния, близкую к этой:

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

Connections - число подключённых пиров. ZDOS - число объектов мира, которые отслеживает сервер: каждая постройка, предмет, существо и изменение ландшафта. Это число только растёт по мере исследования и застройки мира и хорошо показывает, насколько мир потяжелел. Внезапный скачок на десятки тысяч обычно означает, что кто-то построил огромное сооружение или выбросил гору предметов.

Шум, который можно игнорировать#

Лог Valheim - это в основном шум, и часть его выглядит тревожно. На работающем сервере это нормально:

  • `Fallback handler could not load library ...` - Mono проверяет библиотеки в Linux. Безвредно и повторяется много раз при запуске.
  • Строки `(Filename: ... Line: ...)` после почти каждого сообщения - ссылки на исходники из отладочной сборки Unity. Игнорируйте их, читайте строку выше.
  • Предупреждения о шейдерах, графическом устройстве и звуке - у выделенного сервера нет ни графики, ни звука, и Unity об этом упоминает.
  • `Destroying abandoned non persistent zdo ...` и подобная служебная работа с ZDO - сервер убирает объекты, которыми никто не владеет.
  • Предупреждения Steam API, за которыми следует успешная строка "connected" - первая попытка не удалась, повторная сработала.

Docker-образ lloesche и ряд панелей по умолчанию отфильтровывают часть этого. Так лог читать проще, но при реальной проблеме можно потерять контекст, поэтому если что-то не складывается, смотрите нефильтрованный вывод. Общие советы, как читать шумные логи и не пропустить единственную важную строку, есть в статье логи игровых серверов.

Строки с ошибками, на которые стоит реагировать#

Эти строки означают, что что-то действительно сломано. Большинство появляется при запуске.

Строка или шаблонЧто это значитЧто проверить в первую очередь
steamclient.so: cannot open shared object fileСервер Linux не находит библиотеку SteamLD_LIBRARY_PATH или отсутствие библиотеки в установке
Жалоба на пароль, затем выходПароль короче 5 символов или входит в имяЗначение -password
Лог останавливается после Load worldФайл мира повреждён или нечитаемВосстановите предыдущий .db из backup
Ошибка сокета или bind с названием портаИгровой порт занят другим процессомВторой сервер или зависший процесс
Ошибки прелоадера BepInExЗагрузчик модов сломан или не подходитПапка BepInEx и стартовый скрипт
Лог оборван на полуслове, ошибки нетПроцесс убит извнеЛимит памяти или сбой хоста
Нет кода входа на кроссплей-сервереНе удалась регистрация в PlayFabИсходящее соединение, статус PlayFab

Предпоследняя строка заслуживает второго взгляда. Процесс, убитый за нехватку памяти, не успевает написать прощание; лог просто обрывается. Если лог оборвался внезапно, а машина или панель показывают, что в это время память была на пределе, ответ найден. На RE:NODE сервер, достигший лимита памяти, останавливается и чисто перезапускается, а не уходит в swap, поэтому оборванный лог рядом с графиком памяти на потолке точно говорит, что произошло. Полный список для запуска есть в статье сервер Valheim падает при старте.

Хранение логов и поиск по ним#

Лог, по которому через неделю нельзя искать, мало чем полезен. Несколько привычек:

  • Под systemd всю работу делает журнал: journalctl -u valheim --since "2 hours ago" и journalctl -u valheim -g "Got character" отвечают на большинство вопросов.
  • С `-logFile` ротируйте файл сами, иначе он будет расти бесконечно. Правило logrotate с copytruncate подходит для процесса, который держит файл открытым.
  • С Docker задайте для контейнера ограничения размера логов, чтобы разговорчивый сервер не заполнил диск.
  • Перед обновлением или изменением модов запишите последнюю строку с версией и сохраните копию чистого лога запуска. Когда что-то сломается, заведомо рабочий лог для сравнения ценнее любого руководства.

На RE:NODE живая консоль показывает нефильтрованный вывод, а под ней есть командная строка для админ-команд, которые допускает ванильный Valheim; код входа появляется там после каждого запуска. Файловый менеджер и SFTP дают доступ к любому файлу лога, который вы пишете через -logFile. Более подробно о том, что хранить и как долго, рассказывает статья логи, которые стоит хранить.

FAQ#

Где находится файл лога выделенного сервера Valheim?

По умолчанию файла нет: лог идёт в стандартный вывод - терминал, окно консоли, консоль панели, журнал или docker logs. Добавьте -logFile с путём, чтобы писать его в файл; это единственный способ сохранить лог, когда закрывается окно консоли Windows.

Как найти ID игрока в логе?

Пусть он подключится один раз, даже если его не пустят. Строки подключения несут его ID в той форме, которую использует сервер: SteamID64 на сервере только для Steam, ID с префиксом платформы на кроссплей-сервере. Скопируйте его в файл списка в точности.

Где в логе код входа?

В строке сессии, которая печатается после запуска на сервере, работающем с -crossplay, рядом с именем сервера и адресом. Он меняется при каждом перезапуске, поэтому читайте его заново после каждого.

Почему в логе снова и снова одна и та же строка сессии?

Сервер периодически перепечатывает состояние сессии с текущим числом игроков. Это не ошибка, и это быстрый способ узнать, сколько людей на сервере.

Можно ли убрать шум из лога Valheim?

Некоторые Docker-образы и панели по умолчанию фильтруют распространённые шумовые строки, а на своей машине то же делает grep -v. Храните нефильтрованную копию для диагностики, потому что фильтрованный вывод может скрыть строку прямо перед ошибкой.

Что означает ZDOID 0:0 в логе?

Он пишется, когда персонаж игрока умирает, а не когда игрок входит. Скрипты объявлений о входе игнорируют строки, оканчивающиеся на 0:0, именно по этой причине.