Plugin
Connect a server to your minelog account. Its errors land in your dashboard and in the chat apps you already use, and Skript can send alerts of your own.
What it does
The minelog plugin watches your server's log. When an error shows up, it saves it under Alerts in your dashboard and tells the webhooks you picked. You can also tell it to message you when the server starts or stops. If you use Skript, it adds a few lines of syntax so your own scripts can send alerts and react to the same events.
You need an account for this part, since the alerts belong to you. Sharing a log still works without one.
If something breaks, tell us on GitHub.
Install
- Download the jar from the site you like best: Paper Hangar or CurseForge. Modrinth is coming soon. Put the jar in your
pluginsfolder. - Restart the server. Spigot, Paper, Purpur and Folia all run the same jar.
- Using Skript? There is nothing more to install. If Skript 2.9 or newer is there, on Java 17 or newer, the syntax below switches on by itself. You will see
Skript found. The minelog syntax is ready.in the console.
Connect your server
- Sign in and open Servers in your dashboard. Choose Add server.
- Copy the key it shows you. It starts with
mlk_and is shown only once. - Run
/minelog auth mlk_your_keyin the server console.
Use the console, not the in-game chat. Commands typed in chat are written to the server log, and the key would be in it.
The server is named after its software and version, for example Paper 1.21.8. You can rename it in the dashboard. Run /minelog status any time to check the connection.
Right after you connect, the plugin tells you if Skript is missing. Error alerts work without it, but the Skript lines below stay off until you install Skript.
Pick where alerts go
Webhooks live under Webhooks in the dashboard. Paste the URL and minelog works out which service it belongs to. Every webhook also gets a short handle, like ops-discord, that Skript uses to pick it. A webhook can listen to all your servers or only some.
- Discord. Alerts arrive as a message card.
- Slack. Alerts arrive as an attachment with a colour bar.
- Microsoft Teams. Alerts arrive as an Adaptive Card.
- Google Chat. Alerts arrive as a plain message.
- Telegram. Alerts arrive as a message from your bot.
- Guilded. Alerts arrive as an embed, the same way as on Discord.
- Mattermost. Alerts arrive as an attachment. The server needs a public https address.
The dashboard has a longer list with where to find each URL. Open Add webhook and choose See supported platforms.
Error alerts
The plugin reads logs/latest.log and picks out lines at ERROR or FATAL level, together with the stack trace under them. Each one is saved under Alerts.
- The same error counts up instead of piling up. Your webhooks hear about it the first time.
- Alerts are stored encrypted and only you can read them. Each one is deleted after 14 days.
- The plugin starts reading from the end of the log when it connects, so old errors are not sent.
- Start and stop notices go to your webhooks too. Turn them off with
notify-startandnotify-stopinconfig.yml, or all error alerts withalerts: false.
Want to see it work? Run /minelog test. It writes a harmless error to the log and you should see it under Alerts a few seconds later.
Commands
/mlog does the same as /minelog, and so does /log unless you turn it off with log-command: false. Every permission is given to operators by default, and minelog.admin holds all of them.
| Command | What it does | Permission |
|---|---|---|
/minelog share [file] | Uploads logs/latest.log, or one file from logs/, and gives you a link. | minelog.share |
/minelog delete <id> | Deletes an upload that was made from this server. | minelog.delete |
/minelog auth <key> | Connects the server to your account with a key from the dashboard. | minelog.connect |
/minelog status | Shows whether the server is connected and whether it is watching the log. | minelog.connect |
/minelog test | Writes a harmless test error to the log, so you can see it arrive under Alerts. | minelog.connect |
/minelog disconnect | Forgets the key. The server stops sending anything. | minelog.connect |
/minelog reload | Reads config.yml again without a restart. | minelog.reload |
Use it from Skript
You write the scripts, minelog sends the message. Anything Skript can notice, from a player joining to a command running to a number crossing a line, can become an alert. Put a script in plugins/Skript/scripts and run /sk reload your-script.
Without a webhook named, an alert goes to every webhook listening to the server. Name one with to webhook "handle" to send only there.
Effects
| Syntax | What it does |
|---|---|
send minelog alert "Title" | Sends a message to your webhooks. Without a webhook named, it goes to every webhook that listens to this server. |
send minelog alert "Title" with message "More text" as warning | Adds a second line and a level: info, warning or error. The level picks the colour in Discord, Slack and the others. |
send minelog alert "Title" to webhook "ops-discord" | Sends to one webhook, by the handle you gave it in the dashboard. Name several with to webhooks "a" and "b". |
send minelog tps alert "Title" | The same, with the type tps, crash, start or stop in front of alert. The type is sent along as the event name, and it sets a default level: warning for tps, error for crash, info for the rest. |
send minelog error "Something broke" | Saves an error under Alerts, the same place errors from the server log go. The same text is counted instead of saved twice. |
share minelog log | Uploads logs/latest.log in the background. Add named "2026-10-01-1.log" to pick another file from logs/. The link arrives in the minelog log shared event. |
delete minelog log "id" | Deletes a log this server shared earlier. You can give the id or the whole link. Logs shared from other servers cannot be deleted from here. |
Events
| Syntax | When it runs |
|---|---|
on minelog tps drop [below 15] | Runs once when the TPS falls under the number, 15 if you give none. It runs again only after the TPS climbed back up and dropped once more. The TPS is measured every 5 seconds. |
on minelog error detected | Runs when an error shows up in the server log. Use it to add your own context, or to send the error somewhere else. |
on minelog connected | Runs when the server connects to minelog, at startup or after /minelog auth. |
on minelog disconnected | Runs when the key is removed or minelog says it was revoked. |
on minelog log shared | Runs when a log was uploaded, from a command or from a script. The link is available inside. |
on minelog send failed | Runs when something could not be sent or uploaded. It fires at most once every 30 seconds, so a handler that sends an alert cannot loop. |
Expressions
| Syntax | What it gives you |
|---|---|
minelog tps | The server's TPS over the last 5 seconds, from 0 to 20. |
minelog error summary | The error line, inside minelog error detected. |
minelog error text | The error with the log lines around it, inside minelog error detected. |
minelog link, minelog log id, minelog raw link | The page link, the id and the plain text link of a shared log. Inside minelog log shared it is that log. Anywhere else it is the last log this server shared. |
minelog problem count | How many problems minelog found in the shared log. |
minelog failure reason | Why something failed, inside minelog send failed. |
minelog webhooks | The handles of your webhooks. Empty until the server is connected. |
Recipes
These are starting points. Change the text, the level and the handle to fit your server. Skript prints its own error in the console when it cannot read a line, so a typo is easy to find.
Someone joins
Waiting two seconds gives the server time to measure the ping. A ping read at the very moment of joining is usually 0.
on join:
wait 2 seconds
if player is online:
set {_where} to location of player
send minelog alert "%player% joined" with message "Ping: %ping of player% ms | World: %world of player% | Position: %rounded x-coordinate of {_where}%, %rounded y-coordinate of {_where}%, %rounded z-coordinate of {_where}%" as infoSomeone is kicked
A kicked player also triggers the quit event, so the script remembers the kick and skips the second message. Minecraft hands over its default kick text as a translation key, which the script turns into plain words.
on kick:
set {minelog::kicked::%uuid of player%} to true
set {_reason} to "%the on-screen kick message%"
if {_reason} contains "multiplayer.disconnect.kicked":
set {_reason} to "Kicked by an operator"
else if {_reason} contains "<lang:":
replace all "<lang:" and ">" in {_reason} with ""
send minelog alert "%player% was kicked" with message "Reason: %{_reason}%" as warning
on quit:
if {minelog::kicked::%uuid of player%} is set:
delete {minelog::kicked::%uuid of player%}
stop
send minelog alert "%player% left" with message "Players online: %(number of all players) - 1%" as infoThe server slows down
on minelog tps drop below 15:
send minelog tps alert "TPS dropped to %minelog tps%" with message "Players online: %number of all players%"An error shows up
New errors already reach your webhooks without a script. Use this when you want one of them sent to a different webhook, or with your own words around it.
on minelog error detected:
send minelog alert "Error in the log" with message minelog error summary as error to webhook "ops-discord"Share a log from a command
command /sharelog:
permission: op
trigger:
share minelog log
send "Uploading the log..." to player
on minelog log shared:
send "Log ready: %minelog link%" to console
on minelog send failed:
send "minelog problem: %minelog failure reason%" to consoleLimits
| What | Limit |
|---|---|
| Servers | 10 per account |
| Webhooks | 25 per account, up to 10 named in one alert |
| Alerts kept | The latest 100, each for 14 days |
| Alert title | 120 characters |
| Alert message | 1500 characters |
| Same error | Sent once, then not again for 20 seconds. At most 12 errors a minute from one server. |
Troubleshooting
- The plugin says it cannot connect.
- Open plugins/minelog/config.yml. api-base should be https://api.minelog.org unless you host your own copy. An error about SSL means the address starts with https:// but the server only speaks plain http://.
- Nothing shows up under Alerts.
- Run /minelog status. Check that alerts is true in config.yml, then run /minelog test and wait a few seconds. Only lines at ERROR or FATAL level are sent. Skript load errors are printed as plain INFO lines, so they are not alerts.
- /minelog test finds nothing right after startup.
- Give the server a few seconds first. The plugin starts reading the log from its end, and a line written before that first look is skipped.
- Skript says it can't understand a minelog line.
- Look for “Skript found. The minelog syntax is ready.” in the console at startup. It needs Skript 2.9 or newer on Java 17 or newer. If the line is missing, Skript was not loaded before minelog or is not installed.
- A webhook stays quiet.
- Open Webhooks in the dashboard. Each row shows its last result, and the send button posts a test message. A webhook that fails ten times in a row switches itself off.
- You typed a key into the game chat.
- Commands typed in chat end up in the server log. Revoke that key under Servers and make a new one, then run /minelog auth from the console.