2020-04-20 16:52:26 +02:00
|
|
|
/**
|
|
|
|
|
* Copyright Microsoft Corporation. All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
2020-04-21 05:00:55 +02:00
|
|
|
import * as debug from 'debug';
|
2020-04-20 16:52:26 +02:00
|
|
|
|
|
|
|
|
export type LoggerSeverity = 'verbose' | 'info' | 'warning' | 'error';
|
|
|
|
|
|
|
|
|
|
export type Log = {
|
|
|
|
|
name: string;
|
|
|
|
|
severity?: LoggerSeverity;
|
|
|
|
|
color?: string | undefined;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export interface Logger {
|
|
|
|
|
isEnabled(name: string, severity: LoggerSeverity): boolean;
|
|
|
|
|
log(name: string, severity: LoggerSeverity, message: string | Error, args: any[], hints: { color?: string }): void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const errorLog: Log = { name: 'generic', severity: 'error' };
|
2020-06-05 01:43:48 +02:00
|
|
|
export const apiLog: Log = { name: 'api', color: 'cyan' };
|
2020-04-20 16:52:26 +02:00
|
|
|
|
2020-04-21 08:24:53 +02:00
|
|
|
export function logError(logger: InnerLogger): (error: Error) => void {
|
2020-06-10 01:11:17 +02:00
|
|
|
return error => logger.log(errorLog, error, []);
|
2020-04-20 16:52:26 +02:00
|
|
|
}
|
|
|
|
|
|
2020-06-10 01:11:17 +02:00
|
|
|
export class InnerLogger {
|
|
|
|
|
private _userSink: Logger | undefined;
|
|
|
|
|
private _debugSink: DebugLogger;
|
2020-04-20 16:52:26 +02:00
|
|
|
|
2020-04-21 08:24:53 +02:00
|
|
|
constructor(userSink: Logger | undefined) {
|
2020-06-10 01:11:17 +02:00
|
|
|
this._userSink = userSink;
|
|
|
|
|
this._debugSink = new DebugLogger();
|
2020-04-20 16:52:26 +02:00
|
|
|
}
|
|
|
|
|
|
2020-06-10 01:11:17 +02:00
|
|
|
isLogEnabled(log: Log): boolean {
|
|
|
|
|
const severity = log.severity || 'info';
|
|
|
|
|
if (this._userSink && this._userSink.isEnabled(log.name, severity))
|
|
|
|
|
return true;
|
|
|
|
|
return this._debugSink.isEnabled(log.name, severity);
|
2020-04-20 16:52:26 +02:00
|
|
|
}
|
|
|
|
|
|
2020-06-10 01:11:17 +02:00
|
|
|
log(log: Log, message: string | Error, ...args: any[]) {
|
|
|
|
|
const severity = log.severity || 'info';
|
|
|
|
|
const hints = log.color ? { color: log.color } : {};
|
|
|
|
|
if (this._userSink && this._userSink.isEnabled(log.name, severity))
|
|
|
|
|
this._userSink.log(log.name, severity, message, args, hints);
|
|
|
|
|
this._debugSink.log(log.name, severity, message, args, hints);
|
2020-05-20 09:10:10 +02:00
|
|
|
}
|
2020-04-20 16:52:26 +02:00
|
|
|
}
|
|
|
|
|
|
2020-04-21 05:00:55 +02:00
|
|
|
const colorMap = new Map<string, number>([
|
|
|
|
|
['red', 160],
|
|
|
|
|
['green', 34],
|
|
|
|
|
['yellow', 172],
|
|
|
|
|
['blue', 33],
|
|
|
|
|
['magenta', 207],
|
|
|
|
|
['cyan', 45],
|
|
|
|
|
['reset', 0],
|
|
|
|
|
]);
|
2020-04-20 16:52:26 +02:00
|
|
|
|
2020-06-10 01:11:17 +02:00
|
|
|
class DebugLogger {
|
2020-04-21 05:00:55 +02:00
|
|
|
private _debuggers = new Map<string, debug.IDebugger>();
|
2020-04-20 16:52:26 +02:00
|
|
|
|
|
|
|
|
isEnabled(name: string, severity: LoggerSeverity): boolean {
|
2020-04-21 08:24:53 +02:00
|
|
|
return debug.enabled(`pw:${name}`);
|
2020-04-20 16:52:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log(name: string, severity: LoggerSeverity, message: string | Error, args: any[], hints: { color?: string }) {
|
2020-04-21 05:00:55 +02:00
|
|
|
let cachedDebugger = this._debuggers.get(name);
|
|
|
|
|
if (!cachedDebugger) {
|
2020-04-21 08:24:53 +02:00
|
|
|
cachedDebugger = debug(`pw:${name}`);
|
2020-04-21 05:00:55 +02:00
|
|
|
this._debuggers.set(name, cachedDebugger);
|
|
|
|
|
|
|
|
|
|
let color = hints.color || 'reset';
|
|
|
|
|
switch (severity) {
|
|
|
|
|
case 'error': color = 'red'; break;
|
|
|
|
|
case 'warning': color = 'yellow'; break;
|
|
|
|
|
}
|
|
|
|
|
const escaped = colorMap.get(color) || 0;
|
|
|
|
|
if (escaped)
|
|
|
|
|
(cachedDebugger as any).color = String(escaped);
|
2020-04-20 16:52:26 +02:00
|
|
|
}
|
2020-04-21 05:00:55 +02:00
|
|
|
cachedDebugger(message, ...args);
|
2020-04-20 16:52:26 +02:00
|
|
|
}
|
|
|
|
|
}
|