Skip to content

Commit 44a7e77

Browse files
feat: add logger service (#24)
1 parent f5b2a0a commit 44a7e77

File tree

2 files changed

+222
-0
lines changed

2 files changed

+222
-0
lines changed

src/app/core/enums/log-level.enum.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export enum LogLevel {
2+
INFO = 'INFO',
3+
WARN = 'WARN',
4+
ERROR = 'ERROR',
5+
FATAL = 'FATAL',
6+
}
7+
8+
export enum Severity {
9+
LOW = 'LOW',
10+
MEDIUM = 'MEDIUM',
11+
HIGH = 'HIGH',
12+
}
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
import { Injectable } from '@angular/core';
2+
import { LogLevel, Severity } from '../enums/log-level.enum';
3+
4+
@Injectable({
5+
providedIn: 'root',
6+
})
7+
export class LoggerService {
8+
private sessionId: string;
9+
10+
constructor() {
11+
this.sessionId = this.generateSessionId();
12+
}
13+
14+
// eslint-disable-next-line class-methods-use-this
15+
private generateSessionId(): string {
16+
return `session-${new Date().getTime()}`;
17+
}
18+
19+
private formatLog(
20+
level: LogLevel,
21+
severity: Severity,
22+
tracebackId: string,
23+
screenName: string,
24+
source: string,
25+
deviceInfo: string,
26+
data: string,
27+
message: string,
28+
stackTrace = '',
29+
timestamp = '',
30+
): string {
31+
return JSON.stringify({
32+
timestamp,
33+
level,
34+
tracebackId,
35+
severity,
36+
sessionId: this.sessionId,
37+
screenName,
38+
source,
39+
deviceInfo,
40+
data,
41+
message,
42+
stackTrace,
43+
});
44+
}
45+
46+
log(
47+
level: LogLevel,
48+
severity: Severity,
49+
message: string,
50+
stackTrace: string,
51+
tracebackId: string = this.generateTracebackId(),
52+
screenName: string = this.getScreenName(),
53+
source: string = this.getSource(),
54+
deviceInfo: string = this.getDeviceInfo(),
55+
timestamp: string = new Date().toISOString(),
56+
): void {
57+
const formattedLog = this.formatLog(
58+
level,
59+
severity,
60+
tracebackId,
61+
screenName,
62+
source,
63+
deviceInfo,
64+
'',
65+
message,
66+
stackTrace,
67+
timestamp,
68+
);
69+
70+
// eslint-disable-next-line no-console
71+
console.log(formattedLog);
72+
}
73+
74+
// eslint-disable-next-line class-methods-use-this
75+
private getScreenName(): string {
76+
return window.location.pathname || 'unknown-screen';
77+
}
78+
79+
// eslint-disable-next-line class-methods-use-this
80+
private getSource(): string {
81+
return 'app';
82+
}
83+
84+
// eslint-disable-next-line class-methods-use-this
85+
private getDeviceInfo(): string {
86+
const { userAgent } = window.navigator;
87+
let platform = '';
88+
89+
if (userAgent.match(/Win/)) {
90+
platform = 'Windows';
91+
} else if (userAgent.match(/Mac/)) {
92+
platform = 'Mac';
93+
} else if (userAgent.match(/Linux/)) {
94+
platform = 'Linux';
95+
} else if (userAgent.match(/Android/)) {
96+
platform = 'Android';
97+
} else if (userAgent.match(/iPhone|iPad|iPod/)) {
98+
platform = 'iOS';
99+
} else {
100+
platform = 'Other';
101+
}
102+
103+
const device = {
104+
userAgent,
105+
platform,
106+
screenResolution: `${window.screen.width}x${window.screen.height}`,
107+
viewport: `${window.innerWidth}x${window.innerHeight}`,
108+
onlineStatus: navigator.onLine,
109+
};
110+
111+
return JSON.stringify(device);
112+
}
113+
114+
// eslint-disable-next-line class-methods-use-this
115+
private generateTracebackId(): string {
116+
return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
117+
}
118+
119+
info(
120+
severity: Severity,
121+
tracebackId: string,
122+
screenName: string,
123+
source: string,
124+
deviceInfo: string,
125+
data: string,
126+
message: string,
127+
stackTrace?: string,
128+
): void {
129+
this.log(
130+
LogLevel.INFO,
131+
severity || Severity.LOW,
132+
tracebackId,
133+
screenName,
134+
source,
135+
deviceInfo,
136+
data,
137+
message,
138+
stackTrace,
139+
);
140+
}
141+
142+
warn(
143+
severity: Severity,
144+
tracebackId: string,
145+
screenName: string,
146+
source: string,
147+
deviceInfo: string,
148+
data: string,
149+
message: string,
150+
stackTrace?: string,
151+
): void {
152+
this.log(
153+
LogLevel.WARN,
154+
severity || Severity.LOW,
155+
tracebackId,
156+
screenName,
157+
source,
158+
deviceInfo,
159+
data,
160+
message,
161+
stackTrace,
162+
);
163+
}
164+
165+
error(
166+
severity: Severity,
167+
tracebackId: string,
168+
screenName: string,
169+
source: string,
170+
deviceInfo: string,
171+
data: string,
172+
message: string,
173+
stackTrace?: string,
174+
): void {
175+
this.log(
176+
LogLevel.ERROR,
177+
severity || Severity.MEDIUM,
178+
tracebackId,
179+
screenName,
180+
source,
181+
deviceInfo,
182+
data,
183+
message,
184+
stackTrace,
185+
);
186+
}
187+
188+
fatal(
189+
severity: Severity,
190+
tracebackId: string,
191+
screenName: string,
192+
source: string,
193+
deviceInfo: string,
194+
data: string,
195+
message: string,
196+
stackTrace?: string,
197+
): void {
198+
this.log(
199+
LogLevel.FATAL,
200+
severity || Severity.HIGH,
201+
tracebackId,
202+
screenName,
203+
source,
204+
deviceInfo,
205+
data,
206+
message,
207+
stackTrace,
208+
);
209+
}
210+
}

0 commit comments

Comments
 (0)