Logging
createLogger, logSafe und previewJson: Konsolenzeilen mit dem Namen deiner Ressource und nicht vertrauenswürdiger Text, der sicher ausgegeben werden kann.
Diese Helfer schreiben in die Konsole (F8 auf einem Client, die Server-Konsole oder txAdmin auf dem Server). Für Logs, die der Serverbetreiber in Discord, Fivemanage oder FiveM Stats liest, nutze stattdessen aiLog (siehe Logs).
import { createLogger, logSafe, previewJson } from "@aicore-fivem/lib/shared";createLogger
Gibt einen Logger zurück, dessen Zeilen mit [your-resource] beginnen, damit die Server-Konsole zeigt, woher jede Zeile kommt. Warnungen sind gelb, Fehler rot.
Seite: Client, Server und NUI · Wartet: nein
createLogger(resource: string): LoggerLua: kein Zwilling; nutze print(('[%s] %s'):format(GetCurrentResourceName(), message)).
Parameter
Prop
Type
Rückgabewert
Logger:
Prop
Type
Beispiel
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"); // gelb
try {
JSON.parse("{");
} catch (error) {
log.error("could not read shops.json", error); // rot, mit dem Fehler
}logSafe
Macht Text, den ein Client gesendet hat, sicher für die Server-Konsole: eine Zeile (Zeilenumbrüche werden zu |), keine Steuerzeichen, keine ^1-Farbcodes, auf max Zeichen gekürzt. Nutze es immer, wenn eine Log-Zeile Text eines Spielers enthält (einen Namen, eine Nachricht, eine Notiz).
Seite: Client, Server und NUI · Wartet: nein
logSafe(text: string, max: number): stringLua: kein Zwilling.
Parameter
Prop
Type
Rückgabewert
string: der bereinigte Text.
Beispiel
import { logSafe } from "@aicore-fivem/lib/shared";
logSafe("^1fake error\nsecond line", 100); // "fake error | second line"Ohne es kann ein Spieler eine Chatnachricht mit ^1-Farbcodes und Zeilenumbrüchen schreiben, die in deiner Konsole wie ein echter Server-Fehler aussieht.
previewJson
Ein kurzer JSON-ähnlicher Text eines beliebigen nicht vertrauenswürdigen Werts, bei max Zeichen abgeschnitten, gebaut, ohne zuerst den ganzen Wert zu serialisieren (eine feindliche Nutzlast kann Megabytes groß sein). Verschachtelung tiefer als 4 Ebenen erscheint als [...] / {...}. Nutze es, um auszugeben, was ein Client gesendet hat, wenn du es ablehnst.
Seite: Client, Server und NUI · Wartet: nein
previewJson(value: unknown, max: number): stringLua: kein Zwilling.
Parameter
Prop
Type
Rückgabewert
string: die Vorschau, höchstens max Zeichen. Objektschlüssel werden auf 50 Zeichen gekürzt.
Beispiel
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)}`);
}