Adapt Logger
This commit is contained in:
parent
72c5248cc3
commit
fa579251d9
@ -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;
|
||||
const container = getSingleton('nopeBackendDispatcher.instance', () => {
|
||||
return new NopeLogger();
|
||||
});
|
||||
|
||||
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
|
||||
)
|
||||
}),
|
||||
]
|
||||
}
|
||||
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
217
lib/logger/nopeLogger.ts
Normal 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 !== '';
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user