-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathlogger.ts
More file actions
90 lines (73 loc) · 2.25 KB
/
logger.ts
File metadata and controls
90 lines (73 loc) · 2.25 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*!
* Copyright 2018-2019 VMware, Inc.
* SPDX-License-Identifier: MIT
*/
import { LogLevel } from "./types/settings"
export interface LogChannel {
debug(message: string): void
info(message: string): void
warn(message: string): void
error(message: string): void
}
export default class Logger {
private static logLevel: LogLevel = "info"
private static logChannel: LogChannel
constructor(private className: string) { }
/**
* Get a logger instance.
*
* @param className
*/
static get(className: string): Logger {
return new Logger(className)
}
static setup(channel?: LogChannel, logLevel?: LogLevel): void {
if (channel) {
Logger.logChannel = channel
}
if (logLevel) {
Logger.logLevel = logLevel
}
}
debug(message: string, data?: any): void {
if (this.channel && Logger.logLevel === "debug") {
this.channel.debug(this.format("DEBUG", message, data))
}
}
info(message: string, data?: any): void {
if (this.channel) {
this.channel.info(this.format("INFO", message, data))
}
}
warn(message: string, data?: any): void {
if (this.channel) {
this.channel.warn(this.format("WARN", message, data))
}
}
error(message: string, data?: any): void {
if (this.channel) {
this.channel.error(this.format("ERROR", message, data))
}
}
private readonly format = (level: string, message: string, data?: any) => {
return (
`[${new Date().toISOString()} ${level} - ${this.className}] ` +
`${message} ${data ? this.metaToString(data) : ""}`
)
}
private get channel(): LogChannel | undefined {
return Logger.logLevel !== "off" && Logger.logChannel ? Logger.logChannel : undefined
}
private metaToString(data: any): string {
if (data instanceof Error) {
if (typeof data.stack === "string") {
return data.stack
}
return (data as Error).message
}
if (typeof data === "string") {
return data
}
return data && Object.keys(data).length ? JSON.stringify(data) : ""
}
}