RE:NODE

Эксплуатация11 мин чтения

Логи игрового сервера: где и что искать

Куда пишут логи серверы Minecraft, Source, Unity, Unreal, DayZ, Zomboid и других игр, какие файлы важны и какие строки стоит искать в первую очередь.

0 прочтений

Каждый игровой сервер ведёт два вида записей: вывод консоли, который вы видите бегущим в панели, и один или несколько файлов логов на диске, которые переживают рестарт. Когда что-то идёт не так, нужен именно файл, потому что консоль хранит только то, что произошло с последнего запуска. Где лежит файл, зависит в основном от движка игры: Minecraft и другие серверы на Java пишут logs/latest.log, игры на Unreal Engine - в <Project>/Saved/Logs/, игры на Source не пишут вообще ничего, пока вы не включите логирование, а игры на Unity пишут туда, куда указывает -logFile. Когда файл найден, поиск короткий: первый ERROR или Exception после стартового баннера плюс несколько конкретных строк, у каждой из которых одно значение.

Эта статья - карта: где каждая распространённая игра хранит логи, какие из файлов важны и что искать. Как долго их хранить и как ротировать - отдельное решение, оно описано в статье какие логи стоит хранить, а искусство чтения stack trace, когда вы его нашли, - в статье как читать консоль сервера.

Консоль и файл лога - не одно и то же#

В панели вроде Pterodactyl консоль в браузере - это стандартный вывод игрового процесса, транслируемый в реальном времени. Это самый быстрый взгляд на то, что происходит прямо сейчас, и у него два ограничения:

  • Она начинается заново при каждой загрузке. После краша и рестарта вывод краша пропадает из живого просмотра, его заменяет новый запуск.
  • В ней может быть не всё. Многие игры пишут некоторые строки только в файл - подробные ошибки, чат, действия админов, - а в консоль выводят сводку или ничего.

Файл лога на диске - долговечная запись. Большинство игр при каждой загрузке начинают новый файл и сохраняют предыдущий под другим именем, поэтому после краша нужен обычно не текущий файл, а предыдущий. Одна эта деталь объясняет большую долю жалоб «в логе ничего нет»: человек открыл лог здорового рестарта, а не лог краша.

На RE:NODE консоль показывает нефильтрованный живой вывод со строкой ввода команд и историей, а каждый файл лога доступен через файловый менеджер или SFTP. Если нужно искать по большому файлу, часто быстрее скачать его и искать локально, чем листать в браузере.

Где лежат логи в зависимости от движка#

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

Java: Minecraft и его прокси

ФайлЧто это
logs/latest.logТекущий запуск. Начинается заново при каждой загрузке
logs/YYYY-MM-DD-N.log.gzПредыдущие запуски, сжатые, по одному на запуск или день
crash-reports/crash-<date>-server.txtСоздаётся, когда игра перехватывает фатальную ошибку
hs_err_pid<pid>.logСоздаётся в корне, когда падает сама JVM

Paper, Purpur, Velocity, BungeeCord, Forge, NeoForge и Fabric следуют этой схеме. Плагины часто ведут собственные логи в plugins/<Name>/, а CoreProtect хранит историю блоков в базе данных, а не в логе. Отчёт о краше - самый полезный файл в Minecraft: в нём указаны поток, исключение и обычно мод или плагин.

Движок Source: CS2, TF2, Garry's Mod, CS 1.6

Серверы на Source по умолчанию хранят на диске очень мало. Это меняют два переключателя:

  • log on в server.cfg (или в консоли) записывает логи событий - подключения, чат, убийства, раунды - в папку logs/ каталога игры, по одному файлу на смену карты с именем L<MMDD><NNN>.log.
  • -condebug в строке запуска копирует весь вывод консоли в console.log в папке игры. Полезно, когда ловите краш, но шумно в качестве постоянной настройки.

SourceMod добавляет свои логи в addons/sourcemod/logs/: errors_<date>.log с ошибками плагинов - первый файл, который стоит открыть на капризничающем модовом сервере, - и L<date>.log с действиями админов. AMX Mod X в CS 1.6 делает то же самое в addons/amxmodx/logs/. Metamod и CounterStrikeSharp в CS2 пишут в консоль и в свои папки внутри addons/.

Unreal Engine: Palworld, Satisfactory, The Isle, Abiotic Factor

Серверы на Unreal пишут в <Project>/Saved/Logs/<Project>.log, а при запуске переименовывают предыдущий лог в <Project>-backup-<timestamp>.log. Так что у Palworld лог в Pal/Saved/Logs/, у Satisfactory - FactoryGame/Saved/Logs/FactoryGame.log. Фатальные краши ещё оставляют папку в <Project>/Saved/Crashes/ с минидампом и копией лога. Строки лога Unreal помечены категорией вроде LogNet, LogWorld или LogOnline - это лучший способ сузить поиск.

Unity: Valheim, Rust, 7 Days to Die, Unturned, SCP: Secret Laboratory

Серверы на Unity пишут туда, куда указывает аргумент -logFile, или в стандартный вывод, если аргумента нет или он равен - (это поведение менялось между версиями Unity). Если нет ни того ни другого, по умолчанию в Linux используется ~/.config/unity3d/<Company>/<Product>/Player.log. На практике:

  • Valheim по умолчанию пишет в консоль; чтобы сохранять файл, добавьте -logFile.
  • Rust обычно запускают с -logfile, где указан файл, а Oxide или Carbon добавляют oxide/logs/ или carbon/logs/ с ошибками плагинов.
  • Стандартный скрипт запуска 7 Days to Die передаёт -logfile с датированным именем, поэтому каждый запуск получает свой файл output_log в папке данных сервера. Они накапливаются - см. статью про место на диске.

Логи Unity многословны и на headless-сервере часто забиты безобидными предупреждениями о шейдерах и ассетах. Полезные строки содержат Exception, а самая полезная часть исключения - первая строка stack trace, в которой упоминается что-то кроме UnityEngine.

Bohemia: DayZ и Arma 3

DayZ и Arma 3 пишут в папку профилей, заданную через -profiles=. Важные файлы:

ФайлСодержимое
*.RPTВывод движка и скриптов, ошибки, загрузка модов - основной лог
*.ADMАдмин-лог: подключения, убийства, попадания, чат, если задан -adminlog
script_<date>.logОшибки скриптов (DayZ)
crash_<date>.logСоздаётся при краше сервера

Новый .RPT начинается при каждом запуске, и старые никто не удаляет, поэтому папка профилей - частая причина заполненного диска на DayZ. -nologs полностью отключает вывод RPT; это полезно, только если вы уверены, что он никогда не понадобится, а на DayZ так не бывает никогда. Что читает файл .ADM, описано в статье админ-инструменты DayZ и RCON BattlEye.

Игры со своей структурой

ИграГде смотреть
Project ZomboidZomboid/server-console.txt (текущий запуск), Zomboid/Logs/ (логи чата, пользователей, админов и отладки по датам)
Factoriofactorio-current.log и factorio-previous.log в каталоге данных; --console-log для чата и подключений
TerrariaПо умолчанию ничего; TShock пишет в tshock/logs/
Don't Starve Together<Cluster>/Master/server_log.txt, server_chat_log.txt и то же самое в Caves/
FiveMКонсоль сервера; txAdmin хранит админские и серверные логи в txData/<profile>/logs/

Папка Logs/ в Project Zomboid особенно хороша: отдельные файлы для чата, админ-команд, подключений игроков, событий с предметами и PvP, так что из перечисленных игр она лучше всех подходит для разрешения споров.

Что искать в первую очередь#

Лог на 40 000 строк не читают, по нему ищут. Порядок, который срабатывает почти всегда:

  1. Стартовый баннер. Найдите последний запуск сервера: в Minecraft это Starting minecraft server version, в Unreal - первые строки LogInit, в Source - номер сборки. Всё выше относится к предыдущему запуску.
  2. Первая ошибка после него. Ищите ERROR, Exception, FATAL или Error: и берите первое совпадение после баннера, а не последнее в файле.
  3. Последние строки перед концом. Если файл обрывается без сообщения о выключении, процесс убили снаружи - память, кнопка kill или хостер, - и лог этого не объяснит.

Затем конкретные строки, которые ценнее любого общего поиска, потому что у каждой одно значение:

СтрокаЧто она означает
Address already in use, Failed to bind, BindExceptionПорт занят другим процессом
OutOfMemoryError, Could not reserve enough spaceСлишком маленький heap Java или -Xmx больше контейнера
Can't keep up! Is the server overloaded?Основной поток Minecraft отстаёт; тики пропускаются
Segmentation fault, SIGSEGVНативный краш - часто баг мода, плагина или движка
Incompatible version, version mismatchСборки клиента и сервера различаются
UnknownDependencyException, missing dependencyМоду или плагину нужен другой, который не установлен
Permission denied, AccessDeniedExceptionФайл, который сервер не может прочитать или записать
No space left on deviceДиск заполнен
Invalid token, login failed, GSLTТокен игрового сервера или вход в аккаунт отклонены

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

Поиск по логам с shell и без него#

С shell - на своей машине, на VDS или по скачанной копии логов - всю работу делает grep:

bash
# first errors in the current Minecraft log, with line numbers$ grep -n -E "ERROR|Exception" logs/latest.log | head -20# the same across every compressed older log$ zgrep -l "OutOfMemoryError" logs/*.log.gz# five lines of context around each match$ grep -n -C 5 "Segmentation fault" console.log# follow a log as it is written$ tail -f Pal/Saved/Logs/Pal.log

zgrep читает файлы .gz напрямую, так что не нужно распаковывать неделю логов Minecraft, чтобы по ним искать. -l выводит только имена совпавших файлов - это самый быстрый способ выяснить, в какой день что-то началось.

Без shell - а в панели это обычная ситуация - остаются файловый менеджер и SFTP. Небольшой лог откройте в редакторе файлового менеджера и воспользуйтесь поиском браузера; всё большое или сжатое скачайте по SFTP и ищите на своей машине. Любой приличный текстовый редактор справится с поиском по файлу на 100 MB, а большинство откроют файлы .gz или справятся после распаковки. Как подключиться, описано в статье SFTP и файловый менеджер.

Логи, которые не совсем логи: чат, админ-действия и аудит#

Некоторые из перечисленных файлов не столько про ошибки, сколько про людей. Вывод log on в Source, .ADM в DayZ, логи чата и админов в Zomboid, админ-лог SourceMod и строки чата Minecraft в latest.log - это запись того, кто что сделал. Они важны, когда игрок говорит, что его забанили несправедливо, когда разрушили базу и никто не признаётся, или когда админским аккаунтом воспользовался тот, кому не следовало.

Два практических момента:

  • Включите их до того, как они понадобятся. -adminlog в DayZ и log on в играх на Source выключены, пока вы их не включите, а восстановить лог убийств за прошлую неделю после события невозможно.
  • В них персональные данные. IP-адреса, Steam ID и чат с точки зрения GDPR - персональные данные. Храните их столько, сколько нужно для модерации, а не вечно, и ограничьте круг сотрудников, которые могут их читать. На RE:NODE права субпользователей позволяют дать модератору доступ к консоли без доступа к файлам или доступ к файлам без доступа к оплате.

Модерация сервера на основе этих логов описана в статье правила сервера, модерация и команда.

Как увеличить подробность логов и вернуть обратно#

Когда проблему трудно поймать, более подробное логирование на время помогает. У каждого движка свой способ:

  • Minecraft: у плагинов в конфиге часто есть опция debug: true; Paper заменил старую систему /timings на spark, который входит в свежие сборки, - но spark это профилировщик, а не лог.
  • Source: -condebug и log on, как описано выше; developer 1 выводит в консоль больше.
  • Unreal: подробность лога задаётся по категориям - через -LogCmds="LogNet Verbose" в командной строке или в DefaultEngine.ini в разделе [Core.Log].
  • Factorio: --console-log для файла с консолью мультиплеера.
  • BepInEx: BepInEx/config/BepInEx.cfg задаёт уровни логирования для LogOutput.log и консоли.

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

Когда лог не поможет#

Некоторые сбои не оставляют следов ни в одном логе, который пишет игра:

  • Остановка из-за нехватки памяти. Ядро завершает процесс снаружи, так что игра не успевает написать об этом ни строчки. Лог просто обрывается. Доказательство - график памяти в панели; как выглядит такая картина, показано в статье как читать график нагрузки сервера.
  • Kill из панели или остановка на уровне хоста. Та же подпись: лог обрывается на полуслове.
  • Проблемы с сетью на стороне игрока. Лог сервера может показать таймаут или причину отключения, но не то, почему оборвалось соединение у игрока.
  • Лаги. Медленный сервер редко что-то пишет в лог, кроме Can't keep up в Minecraft. Лаги находит профилировщик, а не лог - для Minecraft см. статью профилировщик spark.

Если лог заканчивается без ошибки и без сообщения о выключении, перестаньте по нему искать и посмотрите на графики.

FAQ#

Где лежит файл лога моего игрового сервера?

Зависит от движка. Серверы на Java используют logs/latest.log, серверы на Unreal - <Project>/Saved/Logs/, игры Bohemia - папку профилей, а игры на Unity - то, что указано в -logFile. Игры на Source хранят только то, что вы включили через log on или -condebug. Распространённые игры перечислены в таблицах выше.

Почему лог пустой после краша сервера?

Скорее всего, вы читаете лог рестарта, который последовал за крашем. Ищите предыдущий файл: .gz в logs/ у Minecraft, файл -backup- у Unreal, более старый датированный файл у Bohemia и 7 Days to Die. Если и он заканчивается без ошибки, процесс убили снаружи.

Безопасно ли удалять старые файлы логов?

Да, при остановленном сервере или если это файлы, в которые сервер сейчас не пишет. Для работы игры логи никогда не нужны. Храните последние неделю-две для диагностики и дольше - админские логи и логи чата, если вы опираетесь на них в модерации.

Можно ли посмотреть логи в панели, не скачивая их?

Да, файловый менеджер открывает текстовые файлы в браузере, а консоль показывает живой вывод. Большие или сжатые файлы быстрее скачать и искать по ним локально.

Почему в моём логе упоминаются пароли?

Некоторые игры выводят полную строку запуска, включая пароли, переданные аргументами, а некоторые плагины пишут в лог строку подключения к базе данных. Относитесь к файлам логов как к конфиденциальным, удаляйте из них секреты перед тем, как делиться, и меняйте любой пароль, который оказался в логе, выложенном публично.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000