怎么读服务器日志和崩溃报告
在游戏服务器日志里找到真正关键的那一行:日志级别、堆栈跟踪、首个错误法则,以及日志和崩溃报告在面板里的位置。
阅读约 5 分钟 · 更新于 2026年10月21日 · 作者:GuavaHost Team
当服务器崩溃或者拒绝启动时,原因几乎总是写在它的日志里。日志看着吓人,但你很少需要读懂全部:你只需要找到一行。本文教你怎么读一条日志行、各个级别是什么意思、怎么读堆栈跟踪,以及日志和崩溃报告在面板里的位置。
一条日志行的解剖
下面是 Minecraft 服务器里典型的一行:
[14:02:11] [Server thread/INFO]: Done (8.412s)! For help, type "help"
[14:02:11]是时间。这是服务器的时钟,可能和你的时区不一致。Server thread是程序的哪一部分写下了它。服务器线程就是主游戏循环。INFO是级别:这一行有多严重。- 冒号之后的全部内容 是消息正文。
其他游戏的行格式不一样,但几乎所有游戏都会在某个位置包含时间、级别和消息。
日志级别
| 级别 | 含义 | 需要担心吗? |
|---|---|---|
| DEBUG 或 TRACE | 给开发者看的细节 | 通常是隐藏的;忽略 |
| INFO | 正常活动:启动、加入、存档 | 不需要 |
| WARN | 有点不对劲,但服务器继续在跑 | 有时需要;很多警告只是无害的杂音 |
| ERROR | 某件事失败了 | 需要,前提是它和你的问题时间吻合 |
| FATAL 或 SEVERE | 服务器无法继续 | 需要,这通常就是崩溃本身 |
不要去追每一条警告。有大量健康的服务器每次启动都会打印同样的无害警告。把注意力放在和你问题同时发生的那些错误上。
首个错误法则
一个真正的问题往往会在它之后引出一堆错误,因为服务器的其他部分被头一个失败绊倒了。屏幕上最后那个错误通常只是症状。最后一行看起来正常的内容之后的 第一个 错误,通常才是原因。
- 找到最后一行一切看着都还正常的位置。
- 往下读,直到第一个
ERROR、Exception或FATAL。 - 修掉那一个,重启,再读一遍。如果服务器这次在出问题之前走得更远了,说明你在往前推进。
读懂堆栈跟踪
堆栈跟踪是程序出错时正在执行的那一串步骤。下面是插件型 Minecraft 服务器上常见的一例:
[12:40:03 ERROR]: Error occurred while enabling ExampleShop v2.1 (Is it up to date?)
java.lang.NoClassDefFoundError: net/milkbowl/vault/economy/Economy
at com.example.shop.ShopPlugin.onEnable(ShopPlugin.java:57)
...
Caused by: java.lang.ClassNotFoundException: net.milkbowl.vault.economy.Economy
怎么读它:
- 第一行说的是什么失败了: ExampleShop 插件没能启动。
- 异常类型说的是为什么:
NoClassDefFoundError意味着它需要的代码不在那里。 - 那些
at行说的是在哪里。 找一个你认得出的名字,比如插件自己的名字,而不是游戏内部的东西。 Caused by是根源。 当一条跟踪里有好几个时,最后那个Caused by通常才是真正的原因。这里缺的是 Vault 里的一个类,所以解决办法是安装这个商店插件依赖的 Vault 插件。
常见报错,以及它们通常意味着什么
| 你看到 | 通常意味着 |
|---|---|
NoClassDefFoundError、ClassNotFoundException | 缺少依赖,或者插件、模组是给别的版本做的 |
NoSuchMethodError | 某个东西是给另一个游戏版本编译的 |
OutOfMemoryError | 服务器内存耗尽了 |
FAILED TO BIND TO PORT 或 Address already in use | 端口被占用,常常是因为还有第二份实例在跑 |
found character '\t' that cannot start any token | YAML 配置文件里有制表符;YAML 只允许空格 |
NullPointerException | 一个程序缺陷,或者某个配置值缺失或拼错了 |
崩溃报告
有些游戏崩溃时会单独写一份更详细的报告。
- Minecraft 把它们存在
crash-reports文件夹里,文件名带日期和时间。靠顶部的位置你会看到一行Description和那个异常。模组服务器会列出每一个已加载的模组,而 Forge 和 NeoForge 的报告往往会直接点出一个可疑的模组。 - Java 本身被拖垮的崩溃 会在服务器主文件夹里留下一个
hs_err_pid文件(后面跟着一个数字)。这些通常指向内存或某个原生库,而不是插件。
日志在面板里的位置
Console 标签显示实时输出。它只保留近期的行,所以更早的内容要到 Files 标签里打开日志文件,或者通过 SFTP 下载。
| 游戏 | 到哪里找 |
|---|---|
| Minecraft Java | logs/latest.log;更早的日志是 logs 里的 .log.gz 文件(下载后解压);崩溃在 crash-reports 里 |
| 带 BepInEx 的 Valheim | BepInEx/LogOutput.log |
| ARK: Survival Evolved 和 Ascended | ShooterGame/Saved/Logs/ShooterGame.log |
| Don't Starve Together | DoNotStarveTogether/config/server/Master 和 .../Caves 里的 server_log.txt,每个分片一份 |
| Enshrouded | enshrouded_server.json 里由 logDirectory 指定的文件夹,默认是 logs |
| 其他游戏 | 控制台打印出来的内容;也可以找找 logs 或 Logs 文件夹,或者以 .log 结尾的文件 |
当面板报告崩溃时
如果服务器进程意外停止,面板可能会打印它自己的消息说服务器崩溃了,并附上一个退出码。有几个值得了解:
- 0: 正常停止。
- 1: 游戏因为一个错误而退出;读它上方那几行。
- 137: 进程被强制杀掉了,通常是因为超出了内存上限。参见 服务器内存耗尽的迹象。
- 139: 游戏内部发生了原生崩溃。
在一份很长的日志里搜索
- 把日志下载下来,用文本编辑器打开。
- 用查找(Ctrl+F,Mac 上是 Cmd+F)搜
ERROR,然后搜Exception,再搜Caused by。 - 搜一下你最后添加的那个插件或模组的名字。
- 把时间戳和问题发生的时刻对上。
带着日志求助
从最后一行正常内容开始,一直复制到第一个错误结束的位置,然后以文本形式粘贴,而不是截图。在把它分享到任何地方之前,先去掉密码、令牌和任何私密信息。然后把它带到我们的 Discord 来,团队可以和你一起读。专门针对启动问题,参见 服务器卡在 starting 状态。
还没搞定吗?来 discord.gg/GuavaHost 加入我们的 Discord,团队会帮你解决。
- logs
- crash report
- stack trace
- console
- troubleshooting
- errors
还是没解决? 我们的团队 7x24 小时在线,随时解答你的问题。