服务端启动失败,终端里滚过几百行英文,最后停在一段看不懂的堆栈。大多数新手在这里做两件事:截图发群里问“这是啥”,或者干脆重装。其实你不需要读懂每一行,只需要找到那几行真正有用的。
看日志像看化验单:几十项指标,医生只盯几个箭头。日志里的“箭头”就是级别(ERROR、FATAL)、异常名(Exception),以及 Caused by 后面那句人话。
这一页教你看日志的骨架:先看哪里、找哪些词、往哪查。学会之后,大部分启动问题你能在 30 秒内判断方向。
先看最后 50 行,再找 Caused by,这是最快的两条路。
Caused by 后面那句才是根因,外层那句只说明“它失败了”。
终端只显示最近 300 行,出问题先点「复制当前日志」留证据。
服务端最终有没有 Done,是判断“还有没有救”的唯一标准。
日志从哪里看:四个位置#
先记一句话:出错那一刻用终端,事后复盘用文件。
| 位置 | 看到什么 | 适合什么时候用 |
|---|---|---|
| 终端页 | 实时控制台输出,屏幕上最多 300 行 | 启动中、刚崩、要发命令 |
服务端目录的 logs/latest.log | 本次运行的完整日志 | 终端刷过去了,要慢慢翻 |
| 「更多 → 崩溃报告」 | 摘要 + 关键片段 + 完整日志 + 原生报告 | 异常退出之后、准备求助之前 |
| 「更多 → 运行诊断」 | 环境检查结论,不是完整日志 | 先确认 Java、存储、端口状态 |
Minexa 当前版本没有独立的日志页入口。如果你在别的地方看到“点概览的查看日志”,那个文字点不动,别找了;用上面这四个位置。
终端:底部导航点「终端」,默认会话是「MC 控制台」。离开再回来日志还在,但超出上限的旧行会被折掉。
latest.log:「文件」页进logs目录点开即可。它只保留本次运行内容,重启就被覆盖。崩溃报告:点开有三个页签(摘要、原始报告、完整日志),摘要只是应用的判断。
终端右上角的「复制当前日志」复制的是当前会话全部显示内容,不受屏幕 300 行、单行 400 字符的限制。出问题先点它,粘到备忘录;重启服务端后旧内容就没了。
中文界面下终端会显示成“中文摘要 + 原文:”,这层翻译只影响显示,latest.log 里永远是英文原文;对照时以原文为准。
一行日志长什么样:先看级别,再看内容#
以 Java 服务端为例,一行通常长这样:
[12:34:56] [Server thread/INFO]: Starting minecraft server version 1.21.1三段:[12:34:56] 是时间;[Server thread/INFO] 是线程和级别,Server thread 是主线程,它卡住整服就卡住;最后是内容——这行同时告诉了你服务端的真实版本。
级别只要认四个,其余忽略:
| 级别 | 中文意思 | 要不要管 |
|---|---|---|
INFO | 正常信息 | 不用管,启动刷几十行很正常 |
WARN | 警告,还能跑 | 反复刷同一条才要管 |
ERROR | 出错了 | 要看,通常紧跟一段异常栈 |
FATAL | 致命错误,基本等于终止 | 必须看,这次启动多半已失败 |
先看级别,再看内容。 满屏 INFO 通常没事;真正的问题是 ERROR、FATAL 和它们下面那段缩进堆栈。
抓关键词的五个位置#
日志可能上千行,但这五个位置含金量最高。一般看到第二、三个就有答案了。
位置 1:最后 50 行#
崩溃时真正的原因通常在最后一段输出里,而不是最前面。先看最后 50 行,找 ERROR、Exception、Caused by。
如果最后一行是 Closing Server、Stopping server,说明是正常关闭而不是崩溃——多半是你自己点了停止,或者某个自动化任务停了它。
位置 2:第一个 Exception#
堆栈可能很长,但第一个异常通常最接近根因。搜 Exception,从第一次出现处往下读三五行,一般能看出是版本、端口、文件还是模组的问题。
注意是“第一个”,不是“最长的那一个”:后面的异常常是连带反应。
位置 3:Caused by:#
Java 的异常层层包裹,外层只说“启动失败”,Caused by 才告诉你“端口被占用”:
java.lang.RuntimeException: Failed to start the minecraft server
at net.minecraft.server.Main.main(Main.java:123)
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)看到 Caused by 往下多看两行,那才是能拿去搜的句子。
位置 4:启动阶段的 Done 之前#
启动失败时错误一定出现在 Done 之前。找到日志里最后一次出现的阶段词(Loading properties、Preparing level、Starting minecraft server),错误就在它附近——阶段词告诉你“它死在哪一步”,对照表在第六节。
位置 5:crash-reports/ 和 latest.log#
终端刷过去了就去服务端目录找:crash-reports/ 里最新的 .txt(形如 crash-2026-10-25_12.34.56-server.txt)是 Minecraft 自己写的崩溃报告,信息最全;没有它时看 logs/latest.log。用「文件」页的编辑器打开,别用会改编码的编辑器另存。
一张关键词对照表,照着查就行#
看到不认识的词先在这张表里找,找到就按“去哪篇”点过去。
| 看到这些词 | 大概率是什么 | 去哪篇 |
|---|---|---|
UnsupportedClassVersionError | Java 版本太低或太高 | 启动失败 |
Address already in use / Failed to bind to port | 端口被占用 | 启动失败 |
OutOfMemoryError: Java heap space | 堆内存不足 | 内存与 CPU |
Missing or unsupported / Mod resolution | 模组缺失或版本不匹配 | 模组冲突 |
NoSuchFileException / FileNotFoundException | 文件被删、路径不对 | 目录结构 |
AccessDeniedException / Permission denied | 权限或存储问题 | 启动失败 |
Invalid or corrupt / level.dat | 世界存档损坏 | 崩溃与存档 |
Watchdog / Server thread 卡住 | 主线程卡死,常见于死循环 | 崩溃与存档 |
Invalid session / Failed to verify username | 正版验证或网络问题 | 客户端报错 |
Unknown host | 地址解析失败,多半是地址打错 | 客户端报错 |
更完整的索引见 日志关键词索引。同一句话在不同核心上写法略有差别,认关键词,别认整句。
三个真实场景,逐行拆给你看#
场景 A:Java 版本不对#
java.lang.UnsupportedClassVersionError: net/minecraft/server/Main has been compiled
by a more recent version of the Java Runtime (class file version 65.0), this version
of the Java Runtime only recognizes class file versions up to 61.0只看两个数字:65.0 是服务端要求的版本,61.0 是当前 Java 能支持到的版本。61 = Java 17,65 = Java 21。
结论:服务端要 Java 21,你在用 Java 17。去 运行环境管理 装 Java 21,再到启动设置抽屉选它。不要重装服务端,也不要换核心——换核心只会提高 Java 要求。
场景 B:端口被占用#
日志里出现两行就够判定了:**** FAILED TO BIND TO PORT! 和紧跟其后的 java.net.BindException: Address already in use。后面那句 Perhaps a server is already running on that port? 是服务端自己的猜测,可以直接跳过。
端口(同一台手机不同程序的“门牌号”)被别的进程占了。常见原因按频率排:上一个服务端没退干净、两个服写了同一个 server-port、改过端口没重启、别的应用占了它。
处理顺序:先用概览页确认是否已有服务端在跑,是就先停(必要时「强制停止」);还不行就改 server-port,或重启手机释放异常占用。改完记得同步隧道那边的目标端口。
场景 C:模组缺失#
net.fabricmc.loader.impl.FormattedException: Mod resolution encountered an incompatible mod set!
A potential solution has been determined:
- Install fabric-api, version 0.100.0 or later.Fabric 算友好的:答案就在 A potential solution has been determined 下面——缺 fabric-api。按对应 MC 版本下载 Fabric API 放进 mods/,重启即可。
遇到 Mixin apply failed、Duplicate mod 这种只给一行结论的,按 模组冲突 用二分法一半一半地停用。
启动卡在哪一步:认阶段词,别被噪音骗#
新手最常误判“没看到 Done 就等于崩了”。其实要看阶段:进程活着、阶段还在推进,就不算失败。
| 阶段词 | 它在做什么 | 正常要多久 |
|---|---|---|
Loading properties | 读 server.properties | 一两秒;卡这里多半配置写坏了 |
Starting minecraft server version | 核心开始加载 | 几秒到几十秒,顺带告诉你真实版本 |
Preparing level "world" | 生成或读取世界 | 首次生成 1~3 分钟,之后更快 |
Preparing spawn area | 预生成出生点区块 | 手机弱或世界大时会久,可以再等 |
Done (3.214s)! For help, type "help" | 启动完成,端口开始监听 | 看到 Done 才算启动成功 |
判断方法很实用:看最后一行还有没有在变。有新阶段词就是在推进;五分钟没有任何新输出才算卡死。
这些日志可以不管#
大量
INFO:正常加载信息,只是刷得快。Can't keep up! Is the server overloaded?:TPS 掉刻提示,值得关注但不是崩溃。Unknown recipe/Ignoring advancement:数据包或模组的兼容小问题,多数不影响进服。
标准只有一条:能不能连、有没有反复刷同一条 ERROR。
看日志时最容易卡住的两件事#
一、以为能搜索。 终端没有搜索框,颜色只是上色不是过滤;想搜关键词,只能「复制当前日志」粘到备忘录里搜。
二、以为滚动条里就是全部。 屏幕最多渲染 300 行,单行超过 400 字符会截断,更早的行只留在内存缓冲里(约 1500 行),重启后即消失。所以重要的段落要早点复制出去。
它是本地文件,只有你点「分享」才会发出去。想让人帮忙,必须自己发。
怎么把日志发给别人#
只发一句“进不去”,别人没法帮你。按这个模板发,基本一轮就能得到有用回复。
手机/系统:Android 版本 + 机型
Minexa 版本:见「设置 → 关于」
服务端:Paper 1.21.1 / Fabric 1.20.1 ...
Java:Termux Java 21
现象:点启动后 10 秒退出 / 卡在 Preparing level / 能进但朋友超时
改过什么:刚装了 XX 插件 / 改了 view-distance
日志:
(粘贴最后 50 行,或包含 Caused by 的那一段)发之前确认:日志里带着 Caused by 那几行(只发最后一行往往没用),敏感信息处理掉。
日志里可能出现公网地址、FRP 隧道 ID、令牌、玩家 UUID。发到公开群或论坛前把 token、IP、端口打码。
能在终端里指出最后一条
ERROR或Exception出现在第几行。读懂了一个
Caused by:,能说出它后面的关键词。知道
logs/latest.log在哪个目录,能自己点开。看到过
Done (...)这一行,并知道它才代表启动完成。复制了一份完整日志,粘到备忘录里能正常读到文字。