Logging
createLogger, logSafe and previewJson: console lines with your resource's name, and untrusted text made safe to print.
These helpers write to the console (F8 on a client, the server console or txAdmin on the server). For logs the server owner reads in Discord, Fivemanage or FiveM Stats, use aiLog instead (see Logs).
import { createLogger, logSafe, previewJson } from "@aicore-fivem/lib/shared";createLogger
Returns a logger whose lines start with [your-resource], so the server console shows where each line came from. Warnings are yellow, errors red.
Side: Client, server and NUI · Waits: no
createLogger(resource: string): LoggerLua: no twin; use print(('[%s] %s'):format(GetCurrentResourceName(), message)).
Parameters
Prop
Type
Returns
Logger:
Prop
Type
Example
import { createLogger } from "@aicore-fivem/lib/shared";
const log = createLogger(GetCurrentResourceName());
log.info("loaded 12 shops"); // [my-shop] loaded 12 shops
log.warn("shop legion has no ped model"); // yellow
try {
JSON.parse("{");
} catch (error) {
log.error("could not read shops.json", error); // red, with the error
}logSafe
Makes text a client sent safe for the server console: one line (line breaks become |), no control characters, no ^1 colour codes, cut to max characters. Use it whenever a log line contains a player's text (a name, a message, a note).
Side: Client, server and NUI · Waits: no
logSafe(text: string, max: number): stringLua: no twin.
Parameters
Prop
Type
Returns
string: the cleaned text.
Example
import { logSafe } from "@aicore-fivem/lib/shared";
logSafe("^1fake error\nsecond line", 100); // "fake error | second line"Without it, a player can write a chat message with ^1 colour codes and line breaks that looks like a real server error in your console.
previewJson
A short JSON-like text of any untrusted value, cut at max characters, built without serializing the whole value first (a hostile payload can be megabytes). Nesting deeper than 4 levels shows as [...] / {...}. Use it to print what a client sent when you refuse it.
Side: Client, server and NUI · Waits: no
previewJson(value: unknown, max: number): stringLua: no twin.
Parameters
Prop
Type
Returns
string: the preview, at most max characters. Object keys are cut to 50 characters.
Example
import { onClientEvent } from "@aicore-fivem/lib/server";
import { createLogger, logSafe, previewJson } from "@aicore-fivem/lib/shared";
const log = createLogger(GetCurrentResourceName());
onClientEvent("my-shop:rate", (source) => {
log.info(`${logSafe(GetPlayerName(String(source)) ?? "?", 32)} opened the rating`);
});
function refuse(source: number, raw: unknown[]): void {
log.warn(`refused input from ${source}: ${previewJson(raw, 200)}`);
}