Customizing output
This page collects the options that change how entries look: level colors, visible fields and format. For where entries go, see Transports. For the full option list, see Configuration.
Two output paths
fields and the logger-level format apply only when you have not set transports. Once you set transports, format each transport instead (for example transports.console.format). See Configuration.
Level colors
Colors are set per level in levelOptions.colors. Pass all the levels you care about, because setting levelOptions replaces the defaults.
import { createLogger } from 'logixia';
const logger = createLogger({
appName: 'api',
levelOptions: {
level: 'debug',
colors: {
error: 'brightRed',
warn: 'brightYellow',
info: 'brightBlue',
debug: 'brightGreen',
trace: 'gray',
verbose: 'brightCyan',
},
},
});
await logger.info('colored by level');Available colors: black, red, green, yellow, blue, magenta, cyan, white, gray, grey, brightRed, brightGreen, brightYellow, brightBlue, brightMagenta, brightCyan, brightWhite. Set format.colorize: false (default path) or transports.console.colorize: false to turn colors off.
Colors set here are also given to the console transport, so custom levels keep their color when you add transports.console.
Custom levels with colors
import { createLogger } from 'logixia';
const logger = createLogger({
appName: 'api',
levelOptions: {
level: 'info',
levels: { error: 0, warn: 1, critical: 0, audit: 1, notice: 2, info: 2, debug: 3 },
colors: { critical: 'magenta', audit: 'brightYellow', notice: 'white' },
},
});
await logger.critical('database unreachable');
await logger.audit('role changed', { userId: 'u_9' });A custom level without a color gets one from a small rotating palette. See Log levels for how priorities work.
Choosing visible fields
In the default output path, fields hides parts of the line. A value of false hides a field; anything else, or leaving the field out, shows it.
import { createLogger } from 'logixia';
const logger = createLogger({
appName: 'api',
fields: {
timestamp: true,
level: true,
appName: true,
traceId: false,
message: true,
payload: false,
},
});
await logger.info('only the essentials', { hidden: true });The fields the text line can show are timestamp, level, appName, traceId, context, message and payload. Fields you leave out of fields stay visible.
Toggle a field on one logger at runtime:
import { createLogger } from 'logixia';
const logger = createLogger({ appName: 'api' });
logger.disableField('traceId');
console.log(logger.isFieldEnabled('traceId')); // false
logger.enableField('traceId');
logger.resetFieldState(); // back to the configuration
console.log(logger.getFieldState());Each toggle also prints a short [logixia] notice on stderr.
Text or JSON
On the default path:
import { createLogger } from 'logixia';
const text = createLogger({ appName: 'api', format: { timestamp: true, colorize: true } });
const json = createLogger({ appName: 'api', format: { json: true, colorize: false } });
await text.info('human readable');
await json.info('one JSON object per line');With transports, use the transport's own format:
import { createLogger } from 'logixia';
const logger = createLogger({
appName: 'api',
transports: { console: { format: process.env['NODE_ENV'] === 'production' ? 'json' : 'text' } },
});
await logger.info('format chosen by environment');Per-environment setups
import { createLogger } from 'logixia';
const isProd = process.env['NODE_ENV'] === 'production';
export const logger = createLogger({
appName: 'api',
environment: isProd ? 'production' : 'development',
levelOptions: { level: isProd ? 'warn' : 'debug' },
redact: isProd ? { autoDetect: true } : {},
transports: isProd
? { file: { filename: 'app.log', dirname: '/var/log/api', format: 'json', maxFiles: 7 } }
: { console: { format: 'text' } },
});Tips:
- Keep field names consistent across your services, so queries and dashboards work everywhere.
- Prefer a lower level in production and raise it temporarily with
setLevel()orLOGIXIA_LEVEL(see Log levels). - Do not log secrets in the payload; configure redaction.
Going further
For behaviour that options cannot express, write a plugin to transform entries or a custom transport to send them somewhere new.