-
-
Notifications
You must be signed in to change notification settings - Fork 38
/
logger.ts
99 lines (96 loc) · 2.46 KB
/
logger.ts
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright 2019-2020 Yusuke Sakurai. All rights reserved. MIT license.
import {
cyan,
gray,
red,
yellow,
} from "./vendor/https/deno.land/std/fmt/colors.ts";
import { sprintf } from "./vendor/https/deno.land/std/fmt/printf.ts";
export enum Loglevel {
DEBUG,
INFO,
WARN,
ERROR,
NONE,
}
export interface Logger {
(level: Loglevel, msg: string, ...args: any[]): void;
}
let logLevel = Loglevel.INFO;
export function setLevel(level: Loglevel) {
logLevel = level;
}
const kPrefixMap = new Map<Loglevel, string>([
[Loglevel.INFO, "I"],
[Loglevel.DEBUG, "D"],
[Loglevel.WARN, "W"],
[Loglevel.ERROR, "E"],
]);
interface ColorFunc {
(msg: string): string;
}
const plain: ColorFunc = (msg) => msg;
const kColorFuncMap = new Map<Loglevel, ColorFunc>([
[Loglevel.DEBUG, gray],
[Loglevel.INFO, cyan],
[Loglevel.WARN, yellow],
[Loglevel.ERROR, red],
]);
export interface NamedLogger {
debug(msg: string, ...args: any[]): void;
info(msg: string, ...args: any[]): void;
warn(msg: string, ...args: any[]): void;
error(msg: string, ...args: any[]): void;
}
export function createLogger(
handler: Logger = (level, msg, ...args) => console.log(msg, ...args),
{
prefixMap = kPrefixMap,
prefixColorMap = kColorFuncMap,
prefixFmt = "%s[%s] %s",
noColor = false,
}: {
prefixFmt?: string;
prefixMap?: Map<Loglevel, string>;
prefixColorMap?: Map<Loglevel, ColorFunc>;
noColor?: boolean;
} = {},
): Logger {
return function log(level: Loglevel, msg: string, ...args: any[]) {
if (level < logLevel) return;
const prefix = prefixMap.get(level) || "D";
let color = prefixColorMap.get(level);
if (noColor || !color) {
color = plain;
}
// [INFO] namespace msg
const now = new Date();
if (logLevel <= level) {
handler(
level,
sprintf(prefixFmt, color(prefix), now.toISOString(), msg),
...args,
);
}
};
}
export function namedLogger(
namespace: string,
handler: Logger = createLogger(),
): NamedLogger {
const wrap = (msg: string) => `${namespace} ${msg}`;
return {
debug(msg: string, ...args: any[]) {
handler(Loglevel.DEBUG, wrap(msg), ...args);
},
error(msg: string, ...args: any[]) {
handler(Loglevel.ERROR, wrap(msg), ...args);
},
info(msg: string, ...args: any[]) {
handler(Loglevel.INFO, wrap(msg), ...args);
},
warn(msg: string, ...args: any[]) {
handler(Loglevel.ERROR, wrap(msg), ...args);
},
};
}