-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlogger.ts
More file actions
67 lines (61 loc) · 2.58 KB
/
logger.ts
File metadata and controls
67 lines (61 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
* Copyright Splunk Inc.
*
* 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.
*/
import chalk from 'chalk';
import { Spinner } from './spinner';
/** Logger methods can be called just like console.log */
export interface Logger {
error: typeof console.log;
warn: typeof console.log;
info: typeof console.log;
debug: typeof console.log;
}
export const enum LogLevel {
ERROR = 4,
WARN = 3,
INFO = 2,
DEBUG = 1
}
export function createLogger(logLevel: LogLevel, spinner?: Spinner): Logger {
// Send info to stdout, and all other logs to stderr
const basicLogger = {
error: (msg, ...params) => LogLevel.ERROR >= logLevel && prefixedConsoleError(chalk.stderr.red('ERROR '), msg, ...params),
warn: (msg, ...params) => LogLevel.WARN >= logLevel && prefixedConsoleError(chalk.stderr.yellow('WARN '), msg, ...params),
info: (msg, ...params) => LogLevel.INFO >= logLevel && console.log(msg, ...params),
debug: (msg, ...params) => LogLevel.DEBUG >= logLevel && prefixedConsoleError(chalk.stderr.gray('DEBUG '), msg, ...params),
} as Logger;
if (spinner) {
// wrap logging functions with spinner.interrupt() to avoid jumbled logs when the spinner is active
const spinnerAwareLogger = {
error: (...args) => { spinner.interrupt(() => basicLogger.error(...args)); },
warn: (...args) => { spinner.interrupt(() => basicLogger.warn(...args)); },
info: (...args) => { spinner.interrupt(() => basicLogger.info(...args)); },
debug: (...args) => { spinner.interrupt(() => basicLogger.debug(...args)); },
} as Logger;
return spinnerAwareLogger;
} else {
return basicLogger;
}
}
/** Carefully wrap console.error so the logger can properly support format strings */
const prefixedConsoleError = (prefix: string, msg: unknown, ...params: unknown[]) => {
if (typeof msg === 'string') {
// String concatenation is needed for format strings,
// otherwise console.error('Hello ', '%s!', ' World') would print 'Hello %s! World', not 'Hello World!'
console.error(`${prefix}${msg}`, ...params);
} else {
console.error(prefix, msg, ...params);
}
};