UNPKG

typescript-logging

Version:

Library for logging, written in typescript, can be used by normal es5+ javascript as well.

405 lines (338 loc) 13.5 kB
import {DateFormatEnum, LoggerType, LogLevel} from "../log/LoggerOptions"; import {LoggerFactoryRuntimeSettings} from "../log/standard/LoggerFactoryRuntimeSettings"; import {LFService} from "../log/standard/LFService"; import {StringBuilder, TuplePair} from "../utils/DataStructures"; import {LogGroupRuntimeSettings} from "../log/standard/LogGroupRuntimeSettings"; import {LFServiceRuntimeSettings} from "../log/standard/LFServiceRuntimeSettings"; /** * Allows to change the settings for one or all LogGroups. * Options will be applied only if set, undefined options are ignored. * * The only property really required is group. */ export interface LogGroupControlSettings { /** * Apply to specific group, or "all". */ group: number | "all"; /** * Set log level, undefined will not change the setting. */ logLevel: "Fatal" | "Error" | "Warn" | "Info" | "Debug" | "Trace" | undefined; /** * Set the log format, undefined will not change the setting. */ logFormat: "Default" | "YearMonthDayTime" | "YearDayMonthWithFullTime" | "YearDayMonthTime" | undefined; /** * Whether to show timestamp, undefined will not change the setting. */ showTimestamp: boolean | undefined; /** * Whether to show the logger name, undefined will not change the setting. */ showLoggerName: boolean | undefined; } /** * Interface to control LoggerFactories (LoggerFactory and related loggers) through * ordinary console (in browsers). */ export interface LoggerControl { /** * Shows help for this object. */ help(): void; /** * Lists all registered logger factories with associated log groups with respective ids */ listFactories(): void; /** * Show settings for LoggerFactory id (see listFactories() to get it) or null, for all. * @param idFactory LoggerFactory id or all */ showSettings(idFactory: number | "all"): void; /** * Reset one or all factories back to original values. * @param idFactory Id factory or "all" for all. */ reset(idFactory: number | "all"): void; /** * Return LoggerFactoryControl object. Throws error when number is invalid. * @param idFactory Id factory * @returns {LoggerFactoryControl} */ getLoggerFactoryControl(idFactory: number): LoggerFactoryControl; } /** * Interface to control LoggerFactory. */ export interface LoggerFactoryControl { /** * Shows help */ help(): void; /** * Shows an example of usage. */ example(): void; /** * Prints settings for given group id, "all" for all group. */ showSettings(id: number | "all"): void; /** * Apply new settings, see LogGroupControlSettings for details. * @param settings Settings to set */ change(settings: LogGroupControlSettings): void; /** * Resets everything to original values, for one specific or for all groups. */ reset(id: number | "all"): void; } export class LoggerControlImpl implements LoggerControl { private static _help: string = ` help(): void ** Shows this help. listFactories(): void ** List all registered LoggerFactories with associated log groups with respective ids (ids can be used to target a factory and/or group). showSettings(idFactory: number | "all"): void ** Show log group settings for idFactory (use listFactories to find id for a LoggerFactory). If idFactory is "all" shows all factories. getLoggerFactoryControl(idFactory: number): LoggerFactoryControl ** Return LoggerFactoryControl when found for given idFactory or throws Error if invalid or null, get the id by using listFactories() reset(idFactory: number | "all"): void ** Resets given factory or all factories back to original values. `; public help(): void { /* tslint:disable:no-console */ console.log(LoggerControlImpl._help); /* tslint:enable:no-console */ } public listFactories(): void { const rtSettingsFactories = LoggerControlImpl._getRuntimeSettingsLoggerFactories(); const result = new StringBuilder(); result.appendLine("Registered LoggerFactories (index / name)"); for (let i = 0; i < rtSettingsFactories.length; i++) { const rtSettingsFactory = rtSettingsFactories[i]; result.append(" " + i).append(": " + rtSettingsFactory.getName() + "\n"); } /* tslint:disable:no-console */ console.log(result.toString()); /* tslint:enable:no-console */ } public showSettings(id: number | "all" = "all"): void { const result: Array<TuplePair<number, LoggerFactoryRuntimeSettings>> = []; if (id === "all") { let idx = 0; LoggerControlImpl._getRuntimeSettingsLoggerFactories().forEach((item) => { result.push(new TuplePair(idx++, item)); }); } else { const settings = LoggerControlImpl._getRuntimeSettingsLoggerFactories(); if (id >= 0 && id < settings.length) { result.push(new TuplePair(id, settings[id])); } else { throw new Error("Requested number: " + id + " was not found."); } } for (const setting of result) { /* tslint:disable:no-console */ console.log(" LoggerFactory: " + setting.y.getName() + " (id=" + setting.x + ")"); const logGroupRuntimeSettings = setting.y.getLogGroupRuntimeSettings(); for (let g = 0; g < logGroupRuntimeSettings.length; g++) { const groupSetting = logGroupRuntimeSettings[g]; console.log(" LogGroup: (id=" + g + ")"); console.log(" RegExp: " + groupSetting.logGroupRule.regExp.source); console.log(" Level: " + LogLevel[groupSetting.level].toString()); console.log(" LoggerType: " + LoggerType[groupSetting.loggerType].toString()); } /* tslint:enable:no-console */ } } public reset(idFactory: number | "all" = "all"): void { const loggerFactoriesSettings = LoggerControlImpl._getRuntimeSettingsLoggerFactories(); let result: LoggerFactoryRuntimeSettings[] = []; if (idFactory === "all") { result = loggerFactoriesSettings; } else { if (idFactory >= 0 && idFactory < loggerFactoriesSettings.length) { result.push(loggerFactoriesSettings[idFactory]); } } result.forEach((setting) => { /* tslint:disable:no-console */ console.log("Reset all settings for factory " + idFactory); /* tslint:enable:no-console */ const control = new LoggerFactoryControlImpl(setting); control.reset(); }); } public getLoggerFactoryControl(idFactory: number): LoggerFactoryControl { const loggerFactoriesSettings = LoggerControlImpl._getRuntimeSettingsLoggerFactories(); if (idFactory >= 0 && idFactory < loggerFactoriesSettings.length) { return new LoggerFactoryControlImpl(loggerFactoriesSettings[idFactory]); } throw new Error("idFactory is invalid (less than 0) or non existing id."); } private static _getRuntimeSettingsLoggerFactories(): LoggerFactoryRuntimeSettings[] { return LoggerControlImpl._getSettings().getRuntimeSettingsForLoggerFactories(); } private static _getSettings(): LFServiceRuntimeSettings { return LFService.getRuntimeSettings(); } } class LoggerFactoryControlImpl implements LoggerFactoryControl { private static _help: string = ` help(): void ** Shows this help. example(): void ** Shows an example of usage. showSettings(id: number | "all"): void ** Prints settings for given group id, "all" for all group. change(settings: LogGroupControlSettings): void ** Changes the current settings for one or all log groups. ** LogGroupControlSettings, properties of object: group: number | "all" ** Apply to specific group, or "all". ** Required logLevel: "Fatal" | "Error" | "Warn" | "Info" | "Debug" | "Trace" | undefined ** Set log level, undefined will not change the setting. ** Optional logFormat: "Default" | "YearMonthDayTime" | "YearDayMonthWithFullTime" | "YearDayMonthTime" | undefined ** Set the log format, undefined will not change the setting. ** Optional showTimestamp: boolean | undefined ** Whether to show timestamp, undefined will not change the setting. ** Optional showLoggerName: boolean | undefined ** Whether to show the logger name, undefined will not change the setting. ** Optional reset(id: number | "all"): void ** Resets everything to original values, for one specific or for all groups. help(): ** Shows this help. `; private static _example: string = ` Examples: change({group: "all", logLevel: "Info"}) ** Change loglevel to Info for all groups. change({group: 1, recursive:false, logLevel: "Warn"}) ** Change logLevel for group 1 to Warn. change({group: "all", logLevel: "Debug", logFormat: "YearDayMonthTime", showTimestamp:false, showLoggerName:false}) ** Change loglevel to Debug for all groups, apply format, do not show timestamp and logger names. `; private _settings: LoggerFactoryRuntimeSettings; public constructor(settings: LoggerFactoryRuntimeSettings) { this._settings = settings; } public help(): void { /* tslint:disable:no-console */ console.log(LoggerFactoryControlImpl._help); /* tslint:enable:no-console */ } public example(): void { /* tslint:disable:no-console */ console.log(LoggerFactoryControlImpl._example); /* tslint:enable:no-console */ } public showSettings(id: number | "all" = "all"): void { const result = new StringBuilder(); const logGroupRuntimeSettings = this._settings.getLogGroupRuntimeSettings(); result.appendLine("Registered LogGroups (index / expression)"); for (let i = 0; i < logGroupRuntimeSettings.length; i++) { const logGroupRuntimeSetting = logGroupRuntimeSettings[i]; result.appendLine(" " + i + ": " + logGroupRuntimeSetting.logGroupRule.regExp.source + ", logLevel=" + LogLevel[logGroupRuntimeSetting.level].toString() + ", showTimestamp=" + logGroupRuntimeSetting.logFormat.showTimeStamp + ", showLoggerName=" + logGroupRuntimeSetting.logFormat.showLoggerName + ", format=" + DateFormatEnum[logGroupRuntimeSetting.logFormat.dateFormat.formatEnum].toString()); } /* tslint:disable:no-console */ console.log(result.toString()); /* tslint:enable:no-console */ } public change(settings: LogGroupControlSettings): void { const logGroupRuntimeSettings = this._getLogGroupRunTimeSettingsFor(settings.group); let logLevel: LogLevel | null = null; let formatEnum: DateFormatEnum | null = null; let showLoggerName: boolean | null = null; let showTimestamp: boolean | null = null; let result: string | null = null; const addResult = (value: string) => { if (result !== null) { result += ", "; } if (result === null) { result = value; } else { result += value; } }; if (typeof settings.logLevel === "string") { logLevel = LogLevel.fromString(settings.logLevel); addResult("logLevel=" + settings.logLevel); } if (typeof settings.logFormat === "string") { formatEnum = DateFormatEnum.fromString(settings.logFormat); addResult("logFormat=" + settings.logFormat); } if (typeof settings.showLoggerName === "boolean") { showLoggerName = settings.showLoggerName; addResult("showLoggerName=" + settings.showLoggerName); } if (typeof settings.showTimestamp === "boolean") { showTimestamp = settings.showTimestamp; addResult("showTimestamp=" + settings.showTimestamp); } logGroupRuntimeSettings.forEach((s) => { if (logLevel !== null) { s.level = logLevel; } if (formatEnum !== null) { s.logFormat.dateFormat.formatEnum = formatEnum; } if (showTimestamp !== null) { s.logFormat.showTimeStamp = showTimestamp; } if (showLoggerName !== null) { s.logFormat.showLoggerName = showLoggerName; } }); /* tslint:disable:no-console */ console.log("Applied changes: " + result + " to log groups '" + settings.group + "'."); /* tslint:enable:no-console */ } public reset(idGroup: number | "all" = "all"): void { const settings = this._getLogGroupRunTimeSettingsFor(idGroup); for (const setting of settings) { setting.level = setting.logGroupRule.level; setting.logFormat.showTimeStamp = setting.logGroupRule.logFormat.showTimeStamp; setting.logFormat.showLoggerName = setting.logGroupRule.logFormat.showLoggerName; setting.logFormat.dateFormat.formatEnum = setting.logGroupRule.logFormat.dateFormat.formatEnum; } /* tslint:disable:no-console */ console.log("Reset all settings for group " + idGroup); /* tslint:enable:no-console */ } private _getLogGroupRunTimeSettingsFor(idGroup: number | "all"): LogGroupRuntimeSettings[] { let settings: LogGroupRuntimeSettings[] = []; if (idGroup === "all") { settings = this._settings.getLogGroupRuntimeSettings(); } else { this._checkIndex(idGroup); settings.push(this._settings.getLogGroupRuntimeSettings()[idGroup]); } return settings; } private _checkIndex(index: number): void { if (index < 0 || index >= this._settings.getLogGroupRuntimeSettings().length) { throw new Error("Invalid index, use listLogGroups to find out a valid one."); } } }