In short: open logs/latest.log and find the first line with ERROR or Exception — the rest is usually its fallout. If the server hung and the watchdog stopped it, the cause is in the thread dump next to the hang message. If Java itself crashed, look for an hs_err_pid<number>.log file in the folder the server was started from.
Where the logs are
| What | Where | When to look |
|---|---|---|
| This run's log | logs/latest.log | Always first: startup, plugin errors, hangs |
| Earlier runs | logs/<date>-<number>.log.gz | When the server has restarted since and latest.log was overwritten |
| Crash reports | crash-reports/ | The server failed with an exception and wrote a report itself |
| A crash of Java itself | hs_err_pid<number>.log in the working folder | The process vanished without a Minecraft report |
| Service events | journalctl -u minecraft (systemd), docker compose logs (Docker) | The server won't start or the OS killed it |
Paper's docs say to start any diagnosis with latest.log: many problems show up right there. If the OS killed the process for lack of memory, the Minecraft log just stops — look for the OOM killer message in the system journal.
How to read an error
- 1
Find the first error
Errors come in chains: one causes the next. Read the log top to bottom from the moment things went wrong.
- 2
Read the exception's headline
A line like
java.lang.NullPointerException: ...orCaused by: ...says what happened. The lastCaused byis usually closest to the root cause. - 3
Find whose code it is
Look for package names in the stack trace:
com.example.mypluginis a plugin,net.minecraftandio.papermcare the server. If a plugin is in the trace, start by updating it or taking it out for a while. - 4
Check whether it repeats
An error on every start is a conflict or a version issue. An error at one moment is a mechanic, a farm or a player's action.
Typical errors
| In the log | What it means | What to do |
|---|---|---|
UnsupportedClassVersionError ... class file version 69.0 | The build needs Java 25 but an older one is running (65 is Java 21) | Install the right Java: 25 for Paper 26.x, 21 for 1.21.x |
Failed to bind to port / Address already in use | The port is taken: the server is already running or server-ip is wrong | Find the second java process; leave server-ip empty |
You need to agree to the EULA | The EULA isn't accepted | eula=true in eula.txt |
Could not load 'plugins/...jar' + Unknown dependency | The plugin needs a dependency that's missing | Install the dependency named in the plugin's description |
Invalid plugin.yml | A mod or a broken file is in plugins/ | Download the plugin again; Fabric/Forge mods don't run on Paper |
Ambiguous plugin name | Two versions of the same plugin | Delete the old one |
java.lang.OutOfMemoryError | The Java heap ran out | See how much RAM a server needs and find the culprit with spark |
Can't keep up! Is the server overloaded? | Ticks don't fit into 50 ms | Profile with spark — see why is my server lagging |
Hangs and the watchdog
If a tick never finishes, the server considers itself hung. On Paper the early warning comes first: after 10 seconds of hanging it prints a thread dump to the log and repeats it every 5 seconds (the watchdog section in paper-global.yml). After 60 seconds (timeout-time in spigot.yml) the watchdog stops the server and, with restart-on-crash: true, calls the script from restart-script.
The thread dump is the key evidence: the main thread's (Server thread) stack shows what it got stuck on — a plugin, a chunk load or an entity. If hangs repeat, take a profile with /spark profiler start --only-ticks-over 100: spark records only the heavy ticks.
Finding the plugin at fault
- 1Update the server and plugins to their latest builds — most often the error is already fixed.
- 2If the stack trace points at a plugin, take it out of
plugins/for a while and test. - 3If it doesn't, take out half the plugins, test, then half of the rest. That finds the culprit in a few restarts.
- 4Test on a copy of the server, not the live one: see server backups.
An anticheat is a plugin too. DGuard — the best anticheat for a modern Minecraft server — prints clear messages about its license and PacketEvents at startup, and /dguard license shows the license state and the PacketEvents version. Common install problems and their fixes are on the install page.
FAQ
Where is the Minecraft server log?
In the logs folder next to the server: latest.log is the current run, the .log.gz archives are earlier ones. Crash reports are in the crash-reports folder.
What does UnsupportedClassVersionError mean?
The build was compiled for a newer Java. Class file version 69 is Java 25, 65 is Java 21. Install the Java your Paper version requires.
Why does the server say "Can't keep up"?
The server can't fit a tick into 50 ms. Find the cause with the spark profiler: usually entities, farms, chunk generation or a plugin.
The server crashes without an error — what now?
Check the system journal: the OOM killer may have killed the process for lack of memory. If Java itself crashed, there'll be an hs_err_pid<number>.log file in the working folder.
Sources
- Paper: Basic troubleshooting
- Paper: Adding plugins (load errors)
- Paper: paper-global.yml (watchdog)
- Paper: spigot.yml (timeout-time, restart-on-crash)
- Paper: Getting started (Java versions)
- Java SE 25: the class file format (versions 45–69)
- Minecraft Wiki: crashes and hs_err_pid
- spark: profiler commands
- mclo.gs: sharing Minecraft logs
- DGuard, the best anticheat for a modern Minecraft server: checks compared with GrimAC, Vulcan, Polar, Intave and Matrix
- DGuard: installation, requirements and troubleshooting
- DGuard: supported Paper and Leaf versions