Adapt Logger

This commit is contained in:
Martin Karkowski 2020-11-06 14:17:47 +01:00
parent 72c5248cc3
commit fa579251d9
2 changed files with 229 additions and 54 deletions

View File

@ -2,66 +2,24 @@
* @author Martin Karkowski
* @email m.karkowski@zema.de
* @create date 2020-11-06 08:54:35
* @modify date 2020-11-06 08:56:59
* @modify date 2020-11-06 11:33:31
* @desc [description]
*/
import { createLogger, format, transports } from 'winston';
import { getSingleton } from '../helpers/singletonMethod';
import { LoggerLevel, NopeLogger } from './nopeLogger';
/**
* Contains the Valid Types of the Loger.
* Function to extract a Singleton Dispatcher
* @param options The provided options for the Dispatcher
*/
export type LoggerLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly'
export function getCentralNopeLogger() {
/**
* Helper Function to generate default Logger Options.
* This results in creating a Logger with a specific label,
* and rendering format.
*
* @export
* @param {LoggerLevel} level The Level, which should be rendered
* @param {string} [label=''] An Lable for the Logger. Every Message beginns with that lable.
* @return {*} The Loger-Options as Object
*/
export function generateLoggerOptions(level: LoggerLevel, label: string = '') {
let readableFormat: any;
if (label) {
readableFormat = format.printf(({ level, message, timestamp, label }) => {
return `[${timestamp} ${level}] - ${label}: ${message}`;
const container = getSingleton('nopeBackendDispatcher.instance', () => {
return new NopeLogger();
});
} else {
readableFormat = format.printf(({ level, message, timestamp }) => {
return `[${timestamp} ${level}]: ${message}`;
});
}
return {
level,
format: label ? format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss:ms'
}),
format.label({ label }),
format.errors({ stack: true }),
readableFormat
) : format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss:ms'
}),
format.errors({ stack: true }),
readableFormat
),
exitOnError: false,
transports: [
new (transports.Console)({
format: format.combine(
format.colorize(),
readableFormat
)
}),
]
}
return container.instance
}
/**
@ -74,6 +32,6 @@ export function generateLoggerOptions(level: LoggerLevel, label: string = '') {
* @param {string} [label=''] An Lable for the Logger. Every Message beginns with that lable.
* @return {*} Returns a Logger.
*/
export function getLogger(level: LoggerLevel, label: string = '') {
return createLogger(generateLoggerOptions(level, label));
export function getNopeLogger(name: string, level: LoggerLevel) {
return getCentralNopeLogger().getLogger(name, level);
}

217
lib/logger/nopeLogger.ts Normal file
View File

@ -0,0 +1,217 @@
import { createLogger, format, Logger, transports } from "winston";
import { SPLITCHAR } from "../helpers/objectMethods";
/**
* Contains the Valid Types of the Loger.
*/
export type LoggerLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly'
/**
* Helper Function to generate default Logger Options.
* This results in creating a Logger with a specific label,
* and rendering format.
*
* @export
* @param {LoggerLevel} level The Level, which should be rendered
* @param {string} [label=''] An Lable for the Logger. Every Message beginns with that lable.
* @return {*} The Loger-Options as Object
*/
function _generateLoggerOptions(level: LoggerLevel, label: string = '') {
let readableFormat: any;
if (label) {
readableFormat = format.printf(({ level, message, timestamp, label }) => {
return `[${timestamp} ${level}] - ${label}: ${message}`;
});
} else {
readableFormat = format.printf(({ level, message, timestamp }) => {
return `[${timestamp} ${level}]: ${message}`;
});
}
return {
level,
format: label ? format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss:ms'
}),
format.label({ label }),
format.errors({ stack: true }),
readableFormat
) : format.combine(
format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss:ms'
}),
format.errors({ stack: true }),
readableFormat
),
exitOnError: false,
transports: [
new (transports.Console)({
format: format.combine(
format.colorize(),
readableFormat
)
}),
]
}
}
/**
* Helper Function, to create a Logger.
* Therefore it uses a specific Level and a Lable of the
* Logger
*
* @export
* @param {LoggerLevel} level The Level, which should be rendered
* @param {string} [label=''] An Lable for the Logger. Every Message beginns with that lable.
* @return {*} Returns a Logger.
*/
function _getLogger(level: LoggerLevel, label: string = '') {
return createLogger(_generateLoggerOptions(level, label));
}
export class NopeLogger {
protected _logger: Logger;
protected _loggers: Map<string, Logger>;
protected _levels: { [index: string]: number } = {
error: 0,
warn: 1,
info: 2,
http: 3,
verbose: 4,
debug: 5,
silly: 6
};
set level(value: LoggerLevel) {
if (!this.isLocked) {
this._level = value;
this.setLoglevel('core' + SPLITCHAR, value);
}
}
get level() {
return this._level;
}
public _level: LoggerLevel = 'debug';
/**
* Create or returns the provided Logger
* @param name
* @param level
*/
getLogger(name: string = '', level: LoggerLevel = this.level) {
if (!this._loggers.has(name)) {
this._loggers.set(
name,
_getLogger(level, name)
);
}
return this._loggers.get(name) as Logger;
}
/**
* Function to a Stream to the Logger
* @param stream
*/
addStream(stream) {
// Store the Stream for new Streams
this._logger.add(stream)
}
/**
* Function to determine the Logger Level
* @param loggerGroup The specified group, which should be addressed
* @param level The Level to Set
*/
setLoglevel(loggerGroup: string, level: LoggerLevel) {
if (!loggerGroup.startsWith('core' + SPLITCHAR)) {
loggerGroup = 'core' + SPLITCHAR + loggerGroup;
}
if (!loggerGroup.endsWith(SPLITCHAR)) {
loggerGroup += SPLITCHAR;
}
/** Iterate over all Loggers and close the unused Loggers */
for (let [name, logger] of this._loggers.entries()) {
if (!name.startsWith('core' + SPLITCHAR)) {
name = 'core' + SPLITCHAR + name;
}
if (!name.endsWith(SPLITCHAR)) {
name += SPLITCHAR;
}
if (name == loggerGroup || name.startsWith(loggerGroup)) {
/** Update the Level */
logger.level = level;
}
}
}
/**
* Function, to check, whether a specific logger is logging or not
* @param loggerName Name of the Logger
* @param level The Log-Level to Test
*/
isLogging(loggerName: string, level: LoggerLevel) {
return this._levels[this.getLogger(loggerName).level] >= this._levels[level];
}
/**
* Creates A Logger-Manager
*/
constructor() {
this._loggers = new Map<string, Logger>();
this._logger = _getLogger('debug', 'root');
this._loggers.set('', this._logger);
}
protected _pw: string = '';
/**
* Lock the Logger Level with a password
*
* @param {string} pw The Password to Lock the Logger
* @memberof NopeLogger
*/
lock(pw: string) {
if (this._pw !== '') {
this._loggers.get('').error('Please unlock before');
} else {
this._pw = pw;
}
}
/**
* Unlock the Logger, therefore the password used for locking is
* required. After unlocking, the log-level can be adapted.
*
* @param {string} pw
* @memberof NopeLogger
*/
unlock(pw: string) {
if (this._pw === pw) {
this._pw = '';
} else {
this._loggers.get('').error('Unlocking wasnt successfull');
}
}
/**
* Flag indicating, whether the logger is locked or not.
*
* @readonly
* @memberof NopeLogger
*/
public get isLocked() {
return this._pw !== '';
}
}