/** * Application logger. * * @import { LoggerOptions, Level } from "pino" * @import { PrettyOptions } from "pino-pretty" * @import { IConsoleLogger } from "./shared.js" */ /// import { fixture, prefix } from "./shared.js"; export * from "./shared.js"; let warnedAboutPino = false; const { pino } = await import("pino").catch(() => { if (!warnedAboutPino) { console.warn( `Pino is not available. Falling back to a lightweight console logger. Please install Pino to get the full logging experience: npm install pino`, ); warnedAboutPino = true; } return import("./shared.js").then((module) => ({ pino: module.pinoLight })); }); //#region Constants /** * Default options for creating a Pino logger. * * @category Logger * @satisfies {LoggerOptions} */ export const DEFAULT_PINO_LOGGER_OPTIONS = { enabled: true, level: "info", transport: { target: "./transport.js", options: /** @satisfies {PrettyOptions} */ ({ colorize: true, }), }, }; //#endregion //#region Functions /** * Read the log level from the environment. * @return {Level} */ export function readLogLevel() { return process.env.AK_LOG_LEVEL || DEFAULT_PINO_LOGGER_OPTIONS.level; } /** * A singleton logger instance for Node.js. * * ```js * import { ConsoleLogger } from "#logger/node"; * * ConsoleLogger.info("Hello, world!"); * ``` * * @runtime node * @type {IConsoleLogger} */ export const ConsoleLogger = Object.assign( pino({ ...DEFAULT_PINO_LOGGER_OPTIONS, level: readLogLevel(), }), { fixture, prefix, }, );