AI Core

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).

TypeScript
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

Signature
createLogger(resource: string): Logger

Lua: no twin; use print(('[%s] %s'):format(GetCurrentResourceName(), message)).

Parameters

Prop

Type

Returns

Logger:

Prop

Type

Example

resource/server/index.ts
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

Signature
logSafe(text: string, max: number): string

Lua: 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

Signature
previewJson(value: unknown, max: number): string

Lua: no twin.

Parameters

Prop

Type

Returns

string: the preview, at most max characters. Object keys are cut to 50 characters.

Example

resource/server/index.ts
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)}`);
}

On this page