Каждый игровой сервер ведёт два вида записей: вывод консоли, который вы видите бегущим в панели, и один или несколько файлов логов на диске, которые переживают рестарт. Когда что-то идёт не так, нужен именно файл, потому что консоль хранит только то, что произошло с последнего запуска. Где лежит файл, зависит в основном от движка игры: 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 Zomboid | Zomboid/server-console.txt (текущий запуск), Zomboid/Logs/ (логи чата, пользователей, админов и отладки по датам) |
| Factorio | factorio-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 строк не читают, по нему ищут. Порядок, который срабатывает почти всегда:
- Стартовый баннер. Найдите последний запуск сервера: в Minecraft это
Starting minecraft server version, в Unreal - первые строкиLogInit, в Source - номер сборки. Всё выше относится к предыдущему запуску. - Первая ошибка после него. Ищите
ERROR,Exception,FATALилиError:и берите первое совпадение после баннера, а не последнее в файле. - Последние строки перед концом. Если файл обрывается без сообщения о выключении, процесс убили снаружи - память, кнопка 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:
# 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.logzgrep читает файлы .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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.