Skip to content

Commit 7a4d6ea

Browse files
Implement logger (boundlessfi#186)
* Create logger.types.ts * Create logger.ts
1 parent 68740de commit 7a4d6ea

2 files changed

Lines changed: 74 additions & 0 deletions

File tree

lib/logger.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import type { ILogger, LoggerData } from './types/logger.types'
2+
3+
type LogLevel = LoggerData['LogLevel']
4+
type LogData = LoggerData['LogData']
5+
6+
export class Logger implements ILogger {
7+
private minLevel: LogLevel = 'info'
8+
9+
setMinLevel(level: LogLevel) {
10+
this.minLevel = level
11+
}
12+
13+
private shouldLog(level: LogLevel): boolean {
14+
const levels: LogLevel[] = ['error', 'warn', 'info']
15+
return levels.indexOf(level) <= levels.indexOf(this.minLevel)
16+
}
17+
18+
private log(level: LogLevel, data: LogData) {
19+
if (!this.shouldLog(level)) return
20+
21+
const timestamp = new Date().toISOString()
22+
const logMethod = console[level] as (
23+
message: string,
24+
...optionalParams: unknown[]
25+
) => void
26+
const prefix = `[${level.toUpperCase()}] ${timestamp}:`
27+
28+
try {
29+
const { eventType, ...rest } = data
30+
const logData = {
31+
eventType,
32+
timestamp,
33+
...rest,
34+
}
35+
const jsonData = JSON.stringify(logData, null, 2)
36+
logMethod(prefix, eventType, '\n', jsonData)
37+
} catch (error) {
38+
console.error(`Error stringifying log data: ${error}`)
39+
logMethod(
40+
prefix,
41+
data.eventType,
42+
'\n',
43+
'Error: Unable to stringify log data',
44+
)
45+
}
46+
}
47+
48+
error(data: LogData) {
49+
this.log('error', data)
50+
}
51+
52+
warn(data: LogData) {
53+
this.log('warn', data)
54+
}
55+
56+
info(data: LogData) {
57+
this.log('info', data)
58+
}
59+
}

types/logger.types.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export interface LoggerData {
2+
LogLevel: 'error' | 'warn' | 'info'
3+
4+
LogData: {
5+
eventType: string
6+
[key: string]: unknown
7+
}
8+
}
9+
10+
export interface ILogger {
11+
setMinLevel: (level: LoggerData['LogLevel']) => void
12+
error: (data: LoggerData['LogData']) => void
13+
warn: (data: LoggerData['LogData']) => void
14+
info: (data: LoggerData['LogData']) => void
15+
}

0 commit comments

Comments
 (0)