The Log Panel
logs opens a searchable view of what has happened on this server. It is part of the console. Run the command and the panel takes over; close it and you are back where you were.
logsThe panel has two tabs.
General Logs is the audit log rendered: every command anyone ran, with who ran it and how it turned out. Commands marked :noAudit(), which are help, ping, jobid and players, are excluded, so browsing help does not bury real activity.
Ban Logs is moderation actions: bans, kicks, and anything else a command explicitly records. Each row reads as a sentence, Enforced 7 day ban on user Someone, for reason Excessive Toxicity, with the moderator underneath.
Searching
The search box matches across everything on a row: username, display name, user ID, the command text, the action, the reason, and the moderator's name. Type and press Enter.
Search runs on Enter rather than as you type.
The 24h / 7d / 30d chips limit how far back to look. Load more appears when there are more matches than fit in one page.
Recording a moderation action
Ban Logs is not inferred from command names. A command says what it did:
:run(function(context, args)
context:logAction({
action = "7 day ban",
target = args.target,
reason = args.reason,
duration = 604800,
severity = "ban",
})
context:reply(`banned {args.target.Name}`)
end)| Field | Meaning |
|---|---|
action | what happened, shown as written: "7 day ban", "Inventory Wipe" |
target | a Player, a user ID, or a name |
reason | optional, shown on the row |
duration | optional, in seconds |
severity | ban, kick, wipe, warn or custom; picks the row's colour and badge |
The built-in ban, unban and kick already call it. Your own commands need this line to appear in Ban Logs; without it they still show in General Logs like anything else.
Actions are only recorded when the command succeeds. A command that fails, is denied, or is cancelled writes nothing. A ban that did not happen does not appear as one.
Who can read it
By default, anyone who can run logs. That is the same role gate as the command itself, so the two can never disagree.
To gate reading more tightly than running:
Operator.Start({
Logs = { Permission = "admin" },
})A player without it sees "You are not allowed to read these logs."
What it is not
The log is in memory, and per-server
Records live in that server's memory. They are gone when it shuts down, and one server never sees another's. The panel shows what happened here, since this server started.
For history that survives, attach an audit sink and store records yourself.
Client-reported rows are not verified
Rows marked client-reported came from a client command, which runs on the player's machine. The server stamps who, when and where, but what they say they ran is their word, and a modified client can simply not report at all.
Absence of a client-reported row proves nothing. See what you can and cannot trust.
Without the built-in console
logs also prints its results as text, so it still works with Client.UI = false or a custom interface. The panel is the presentation, not the feature.
A custom interface can query the same data directly with Api.queryLogs.