@elsikora/cladi
Version:
Zero-dependency TypeScript DI toolkit with typed tokens and scoped lifecycles.
134 lines (131 loc) • 4.95 kB
JavaScript
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