Adapt Logger
This commit is contained in:
parent
72c5248cc3
commit
fa579251d9
@ -2,66 +2,24 @@
|
|||||||
* @author Martin Karkowski
|
* @author Martin Karkowski
|
||||||
* @email m.karkowski@zema.de
|
* @email m.karkowski@zema.de
|
||||||
* @create date 2020-11-06 08:54:35
|
* @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]
|
* @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() {
|
||||||
|
|
||||||
/**
|
const container = getSingleton('nopeBackendDispatcher.instance', () => {
|
||||||
* Helper Function to generate default Logger Options.
|
return new NopeLogger();
|
||||||
* 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}`;
|
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
readableFormat = format.printf(({ level, message, timestamp }) => {
|
|
||||||
return `[${timestamp} ${level}]: ${message}`;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return container.instance
|
||||||
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
|
|
||||||
)
|
|
||||||
}),
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -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.
|
* @param {string} [label=''] An Lable for the Logger. Every Message beginns with that lable.
|
||||||
* @return {*} Returns a Logger.
|
* @return {*} Returns a Logger.
|
||||||
*/
|
*/
|
||||||
export function getLogger(level: LoggerLevel, label: string = '') {
|
export function getNopeLogger(name: string, level: LoggerLevel) {
|
||||||
return createLogger(generateLoggerOptions(level, label));
|
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