UNPKG

@elsikora/cladi

Version:

Zero-dependency TypeScript DI toolkit with typed tokens and scoped lifecycles.

134 lines (131 loc) 4.95 kB
import '../../domain/enum/captive-dependency-policy.enum.js'; import '../../domain/enum/dependency-lifecycle.enum.js'; import '../../domain/enum/di-container-duplicate-provider-policy.enum.js'; import { ELoggerLogLevel } from '../../domain/enum/logger-log-level.enum.js'; import '../../domain/enum/provider-type.enum.js'; import { CONSOLE_LOGGER_DEFAULT_OPTIONS } from '../constant/console-logger-default-options.constant.js'; /** * Console logger implementation. * @see {@link https://elsikora.com/docs/cladi/services/logging} */ class ConsoleLoggerService { /** * Current log level. Messages below this level will not be logged. */ LEVEL; /** * Default source identifier. */ SOURCE; /** * Create a new console logger. * @param {IConsoleLoggerOptions} [options] - The options to use for the logger. * @default */ constructor(options = CONSOLE_LOGGER_DEFAULT_OPTIONS) { this.LEVEL = options.level; this.SOURCE = options.source; } /** * Log a debug message. * @param {string} message Message to log. * @param {ILoggerMethodOptions} [options] Optional logging options. */ debug(message, options) { if (this.shouldLog(ELoggerLogLevel.DEBUG)) { // eslint-disable-next-line @elsikora/javascript/no-console console.debug(this.formatMessage(ELoggerLogLevel.DEBUG, message, options)); } } /** * Log an error message. * @param {string} message Message to log. * @param {ILoggerMethodOptions} [options] Optional logging options. */ error(message, options) { if (this.shouldLog(ELoggerLogLevel.ERROR)) { console.error(this.formatMessage(ELoggerLogLevel.ERROR, message, options)); } } /** * Log an info message. * @param {string} message Message to log. * @param {ILoggerMethodOptions} [options] Optional logging options. */ info(message, options) { if (this.shouldLog(ELoggerLogLevel.INFO)) { // eslint-disable-next-line @elsikora/javascript/no-console console.info(this.formatMessage(ELoggerLogLevel.INFO, message, options)); } } /** * Log a trace message. * @param {string} message Message to log. * @param {ILoggerMethodOptions} [options] Optional logging options. */ trace(message, options) { if (this.shouldLog(ELoggerLogLevel.TRACE)) { // eslint-disable-next-line @elsikora/javascript/no-console console.trace(this.formatMessage(ELoggerLogLevel.TRACE, message, options)); } } /** * Log a warning message. * @param {string} message Message to log. * @param {ILoggerMethodOptions} [options] Optional logging options. */ warn(message, options) { if (this.shouldLog(ELoggerLogLevel.WARN)) { console.warn(this.formatMessage(ELoggerLogLevel.WARN, message, options)); } } /** * Combines source from options with class source. * @param {string} [optionsSource] Source from options. * @returns {string|undefined} Combined source or undefined if both sources are undefined. */ combineSource(optionsSource) { if (!this.SOURCE && !optionsSource) { return undefined; } if (!this.SOURCE) { return `[${optionsSource}]`; } if (!optionsSource) { return `[${this.SOURCE}]`; } return `[${this.SOURCE}${optionsSource}]`; } /** * Format a message for logging. * @param {ELoggerLogLevel} level Log level. * @param {string} message Message to log. * @param {ILoggerMethodOptions} [options] Optional logging options. * @returns {string} Formatted message. */ formatMessage(level, message, options) { const timestamp = new Date().toISOString(); // Safely extract context from options let context; let source; if (options) { context = options.context; source = options.source; } const formattedContext = context ? ` ${JSON.stringify(context)}` : ""; const formattedSource = this.combineSource(source) ?? ""; const sourceWithSpace = formattedSource ? `${formattedSource} ` : ""; return `[${timestamp}] ${level.toUpperCase()}: ${sourceWithSpace}${message}${formattedContext}`; } /** * Check if the given level should be logged. * @param {ELoggerLogLevel} level Level to check. * @returns {boolean} True if the level should be logged. */ shouldLog(level) { const levels = [ELoggerLogLevel.ERROR, ELoggerLogLevel.WARN, ELoggerLogLevel.INFO, ELoggerLogLevel.DEBUG, ELoggerLogLevel.TRACE]; return levels.indexOf(level) <= levels.indexOf(this.LEVEL); } } export { ConsoleLoggerService }; //# sourceMappingURL=console-logger.service.js.map