TeaHost
Minecraftminecraftлогидиагностикаадминистрирование4 мин. чтения

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

Логи сервера Minecraft: где лежит latest.log, как разбирать стектрейсы и краш-репорты, искать нужное через grep и убирать лишний спам из консоли

Кратко

Логи сервера Minecraft лежат в папке logs: текущая сессия — latest.log, прошлые запуски — архивы .log.gz, падения — в crash-reports и hs_err_pid*.log. Ищите первый ERROR по времени инцидента и читайте стектрейс снизу вверх до последнего Caused by — там настоящая причина. Регулярное Can't keep up — признак нагрузки, его разбирают профайлером Spark.

Когда сервер падает, лагает или плагин молча не работает, логи сервера Minecraft — единственный источник правды. Всё остальное будет гаданием. Проблема в том, что в latest.log за сутки набегает десятки тысяч строк, и без понимания структуры там утонуть проще, чем найти причину.

Держите короткий справочник: какие файлы есть, что в них искать и как отсеять шум.

Где лежат логи сервера Minecraft

Все файлы — в корне сервера:

код
logs/
  latest.log            — текущая сессия, обнуляется при рестарте
  2026-04-17-1.log.gz   — архив предыдущих запусков
  debug.log             — расширенный лог, если включён
crash-reports/
  crash-2026-04-18_03.14.22-server.txt
hs_err_pid12345.log     — падение самой JVM, в корне

Логика простая: при каждом старте сервера текущий latest.log сжимается в .gz с датой и номером запуска. Если сервер за сутки перезапускался четыре раза, будет 2026-04-18-1.log.gz ... -4.log.gz.

Отдельно смотрите crash-reports. Туда попадают именно креши процесса — с полным стектрейсом, списком модов и состоянием тредов. А hs_err_pid*.log появляется, когда падает не сервер, а сама виртуальная машина Java: обычно это нехватка памяти на уровне контейнера или сбойный нативный код.

Скачивать удобнее по SFTP — подключение разбирали отдельно. В панели логи тоже видно, но искать в веб-консоли по десяткам тысяч строк неудобно.

Структура строки

код
[03:14:22 INFO]: [LuckPerms] Loaded 14 groups
[03:14:23 WARN]: Can't keep up! Is the server overloaded? Running 4213ms behind
[03:14:25 ERROR]: Could not pass event PlayerJoinEvent to EssentialsX v2.20.1

Три уровня, которые встречаются в 99% случаев:

  • INFO — обычные события: старт, подключения, загрузка плагинов. Нужен для контекста.
  • WARN — что-то не так, но сервер продолжает работать. Пропущенные конфиги, отставание тика, устаревшие API-вызовы.
  • ERROR — исключение. Дальше почти всегда идёт стектрейс.

Есть ещё имя треда в квадратных скобках у Paper при включённом debug — по нему видно, произошло что-то в главном потоке или в асинхронной задаче плагина.

Как читать стектрейс

Типичная простыня выглядит устрашающе, но полезной информации в ней три строки:

код
[19:02:11 ERROR]: Could not pass event BlockBreakEvent to MyShop v1.4
java.lang.NullPointerException: Cannot invoke "org.bukkit.entity.Player.getName()" because "p" is null
    at ru.example.myshop.ShopListener.onBreak(ShopListener.java:88)
    at com.destroystokyo.paper.event.executor.MethodHandleEventExecutor.execute(...)
    ...
Caused by: java.lang.IllegalStateException: Database connection closed
    at ru.example.myshop.Storage.query(Storage.java:41)

Что смотреть:

  1. Первая строка — какой плагин и на каком событии сломался. Здесь MyShop на BlockBreakEvent, значит проблема воспроизводится при ломании блока.
  2. Тип исключения — NullPointerException означает баг в плагине, а не в вашем конфиге. ClassNotFoundException или NoSuchMethodError — плагин собран под другую версию API.
  3. Самая нижняя строка Caused by: — настоящая причина. В примере это оборванное соединение с базой, а не сам NPE.

Правило, которое экономит часы: читайте стектрейс снизу вверх и ищите последний Caused by. Всё, что выше, — только цепочка вызовов.

Поиск по логам через grep

Веб-консоль хороша для просмотра в реальном времени, а разбор удобнее делать в шелле:

bash
tail -f logs/latest.log
grep -n "ERROR" logs/latest.log | tail -50
grep -c "Can't keep up" logs/latest.log
grep -A 20 "PlayerJoinEvent" logs/latest.log
zgrep "OutOfMemoryError" logs/*.log.gz

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

Поиск по конкретному игроку:

bash
grep -i "Steve" logs/latest.log

Так находятся входы, выходы, смены IP и команды, если у вас включено логирование команд.

Что означают частые сообщения

СообщениеЧто значитЧто делать
Can't keep up! Is the server overloaded?Сервер не успел обработать тикиЕдиничное после генерации мира — норма; регулярное — запускайте профайлер Spark
java.lang.OutOfMemoryError: Java heap spaceКончилась кучаПроверьте -Xmx и выделение памяти, потом ищите утечку в плагинах
... moved too quickly!Обычно ложное срабатывание проверки движения на лифтах или лодкахПараметр moved-too-quickly-multiplier в spigot.yml
The server has stopped responding!Watchdog: главный поток завис дольше timeout-time (по умолчанию 60 секунд)Смотрите дамп стека ниже — часто виноват плагин, который синхронно лезет в базу
Failed to check session lock, abortingМир занят другим процессомДвойной запуск: старый процесс не завершился

Как убрать спам

Половина объёма логов — бесполезные сообщения. Отфильтровать их можно через собственный log4j2.xml в корне сервера: туда добавляется RegexFilter с шаблоном вида .*(Ignoring unknown custom packet payload).* и действием DENY. Файл подключается флагом -Dlog4j.configurationFile=log4j2.xml в строке запуска.

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

Отдельно проверьте verbose у плагинов. У WorldGuard, LuckPerms и античитов подробный режим по умолчанию бывает включён и генерирует мегабайты в час.

Ротация и хранение

Логи копятся бесконечно, и на сервере с частыми рестартами logs/ за месяц раздувается до гигабайта. Простое решение — крон-задача:

bash
find /home/container/logs -name "*.log.gz" -mtime +14 -delete

Две недели истории покрывают почти любой разбор инцидента. Если у вас настроен автоперезапуск, добавьте очистку в тот же скрипт.

Итог

Алгоритм разбора любой проблемы: открыть latest.log, найти первый ERROR по времени инцидента, прочитать последний Caused by, определить плагин, проверить его версию под ваше ядро. Если ERROR нет, а есть только «Can't keep up» — это не ошибка, а нагрузка, и лечится профайлером и конфигами.

Для постоянного контроля состояния сервера пригодится мониторинг нагрузки. А если логи стабильно показывают нехватку памяти — вопрос решается не конфигом, а тарифом: посмотреть варианты.