@viplance/nestjs-logger 0.3.4 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -61,8 +61,9 @@ Connect the database to store logs.<br />
61
61
  <br />
62
62
 
63
63
  ### The LogService methods:
64
- - log()
65
- - error()
66
- - warn()
67
- - debug()
68
- - verbose()
64
+ - log(message: string)
65
+ - error(message: string)
66
+ - warn(message: string)
67
+ - debug(message: string)
68
+ - verbose(message: string)
69
+ - addBreadcrumb(any)
@@ -6,6 +6,7 @@ export declare function createLogEntity(name: string): EntitySchema<{
6
6
  count: unknown;
7
7
  context: unknown;
8
8
  trace: unknown;
9
+ breadcrumbs: unknown;
9
10
  createdAt: unknown;
10
11
  updatedAt: unknown;
11
12
  }>;
@@ -16,6 +16,7 @@ function createLogEntity(name) {
16
16
  count: { type: Number, default: 1 },
17
17
  context: { type: String, nullable: true },
18
18
  trace: { type: String, nullable: true },
19
+ breadcrumbs: { type: String, nullable: true },
19
20
  createdAt: { type: Date },
20
21
  updatedAt: { type: Date },
21
22
  },
@@ -1 +1 @@
1
- {"version":3,"file":"log.entity.js","sourceRoot":"","sources":["../../src/entities/log.entity.ts"],"names":[],"mappings":";;AAEA,0CAkBC;AApBD,qCAAuC;AAEvC,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,sBAAY,CAAC;QACtB,IAAI;QACJ,OAAO,EAAE;YACP,GAAG,EAAE;gBACH,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,IAAI;aACd;YACD,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACtB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACzB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE;YACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YACvC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;YACzB,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;SAC1B;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"log.entity.js","sourceRoot":"","sources":["../../src/entities/log.entity.ts"],"names":[],"mappings":";;AAEA,0CAmBC;AArBD,qCAAuC;AAEvC,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,sBAAY,CAAC;QACtB,IAAI;QACJ,OAAO,EAAE;YACP,GAAG,EAAE;gBACH,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,IAAI;aACd;YACD,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACtB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACzB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE;YACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YACvC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC7C,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;YACzB,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;SAC1B;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -23,12 +23,13 @@ let LogInterceptor = class LogInterceptor {
23
23
  intercept(context, next) {
24
24
  return next.handle().pipe((0, rxjs_1.tap)({
25
25
  error: (error) => {
26
- var _a;
27
- // error handler
26
+ var _a, _b;
28
27
  (_a = this.logService) === null || _a === void 0 ? void 0 : _a.error(error.message, error.stack, context);
28
+ (_b = this.logService) === null || _b === void 0 ? void 0 : _b.clearBreadcrumbs();
29
29
  },
30
30
  complete: () => {
31
- // normal request
31
+ var _a;
32
+ (_a = this.logService) === null || _a === void 0 ? void 0 : _a.clearBreadcrumbs();
32
33
  },
33
34
  }));
34
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"log.interceptor.js","sourceRoot":"","sources":["../src/log.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAAoD;AACpD,+BAAuC;AACvC,wDAAoD;AAI7C,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAAiD,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAE3E,SAAS,CAAC,OAA6B,EAAE,IAAiB;QACxD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,UAAG,EAAC;YACF,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;;gBACf,gBAAgB;gBAChB,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE;gBACb,iBAAiB;YACnB,CAAC;SACF,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAEE,WAAA,IAAA,eAAM,EAAC,wBAAU,CAAC,CAAA;qCAA8B,wBAAU;GAD5D,cAAc,CAgB1B"}
1
+ {"version":3,"file":"log.interceptor.js","sourceRoot":"","sources":["../src/log.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAAoD;AACpD,+BAAuC;AACvC,wDAAoD;AAI7C,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAAiD,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAE3E,SAAS,CAAC,OAA6B,EAAE,IAAiB;QACxD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,UAAG,EAAC;YACF,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;;gBACf,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC5D,MAAA,IAAI,CAAC,UAAU,0CAAE,gBAAgB,EAAE,CAAC;YACtC,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE;;gBACb,MAAA,IAAI,CAAC,UAAU,0CAAE,gBAAgB,EAAE,CAAC;YACtC,CAAC;SACF,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAEE,WAAA,IAAA,eAAM,EAAC,wBAAU,CAAC,CAAA;qCAA8B,wBAAU;GAD5D,cAAc,CAgB1B"}
@@ -10,8 +10,11 @@ export declare class LogService implements LoggerService {
10
10
  static options: LogModuleOptions;
11
11
  static Log: EntitySchema;
12
12
  static timer: ReturnType<typeof setInterval>;
13
+ breadcrumbs: any[];
13
14
  constructor(memoryDbService: MemoryDbService);
14
15
  connectDb(options: LogModuleOptions): Promise<DataSource>;
16
+ addBreadcrumb(breadcrumb: any): void;
17
+ clearBreadcrumbs(): void;
15
18
  log(message: string, context?: ExecutionContextHost): void;
16
19
  error(message: string, trace?: string, context?: ExecutionContextHost): void;
17
20
  warn(message: string, context?: ExecutionContextHost): void;
@@ -21,6 +21,7 @@ const timers_1 = require("timers");
21
21
  let LogService = LogService_1 = class LogService {
22
22
  constructor(memoryDbService) {
23
23
  this.memoryDbService = memoryDbService;
24
+ this.breadcrumbs = [];
24
25
  }
25
26
  async connectDb(options) {
26
27
  var _a, _b, _c, _d, _e, _f;
@@ -41,6 +42,12 @@ let LogService = LogService_1 = class LogService {
41
42
  LogService_1.timer = (0, timers_1.setInterval)(this.checkRecords, 1000 * 60 * 60); // check one time per hour
42
43
  return LogService_1.connection;
43
44
  }
45
+ addBreadcrumb(breadcrumb) {
46
+ this.breadcrumbs.push(breadcrumb);
47
+ }
48
+ clearBreadcrumbs() {
49
+ this.breadcrumbs = [];
50
+ }
44
51
  log(message, context) {
45
52
  this.smartInsert({
46
53
  type: types_1.LogType.LOG,
@@ -88,6 +95,7 @@ let LogService = LogService_1 = class LogService {
88
95
  "updatedAt",
89
96
  "context",
90
97
  "trace",
98
+ "breadcrumbs",
91
99
  ],
92
100
  order: { updatedAt: "DESC" },
93
101
  });
@@ -107,6 +115,7 @@ let LogService = LogService_1 = class LogService {
107
115
  return await connection.update(LogService_1.Log, log._id, {
108
116
  context,
109
117
  trace: data.trace,
118
+ breadcrumbs: this.breadcrumbs,
110
119
  count: log.count + 1,
111
120
  updatedAt: currentDate,
112
121
  });
@@ -116,6 +125,7 @@ let LogService = LogService_1 = class LogService {
116
125
  message: data.message,
117
126
  context,
118
127
  trace: data.trace,
128
+ breadcrumbs: this.breadcrumbs,
119
129
  count: 1,
120
130
  createdAt: currentDate,
121
131
  updatedAt: currentDate,
@@ -1 +1 @@
1
- {"version":3,"file":"log.service.js","sourceRoot":"","sources":["../../src/services/log.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"log.service.js","sourceRoot":"","sources":["../../src/services/log.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viplance/nestjs-logger",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "NestJS internal logging system",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -124,7 +124,7 @@ function getLogHtmlElement(log) {
124
124
  <div id="${log._id}" class="row">
125
125
  <div class="col ${getTypeClass(log.type)}">${log.type}</div>
126
126
  <div class="col">
127
- <div>${log.message}</div>
127
+ <div class="log-info">${log.message}</div>
128
128
  <div class="date">${getDate(log.updatedAt)}</div>
129
129
  </div>
130
130
  <div class="col context">${log.trace || ""}</div>
@@ -137,9 +137,7 @@ async function getLogs() {
137
137
  const res = await fetch(`${origin}${pathname}api${search}`);
138
138
 
139
139
  if (res.ok) {
140
- logs = (await res.json()).filter((log) => {
141
- return selectedLogTypes["all"] || selectedLogTypes[log.type];
142
- });
140
+ logs = await res.json();
143
141
 
144
142
  if (logs.length === 0) {
145
143
  document.getElementById("no-logs").style.display = "block";
@@ -151,6 +149,10 @@ async function getLogs() {
151
149
  document.querySelector("nav").style.display = "flex";
152
150
  }
153
151
 
152
+ logs = logs.filter((log) => {
153
+ return selectedLogTypes["all"] || selectedLogTypes[log.type];
154
+ });
155
+
154
156
  let html = "";
155
157
 
156
158
  logs.forEach((log) => {
@@ -3,17 +3,17 @@ function showLogDetails(log) {
3
3
 
4
4
  popup.innerHTML = `
5
5
  <div class="content center">
6
- <div class="container mt-2">
7
- <h2 class="${log.type}">${log.type}: ${log.message}</h2>
8
- <span class="date">${getDate(log.updatedAt)}</span>
9
- ${
10
- log.trace
11
- ? `
12
- <h3 class="mt-2">Trace</h3>
13
- <p class="key pl-2"><span>${getTrace(log.trace)}</span></p>
14
- `
15
- : ""
16
- }
6
+ <div class="container">
7
+ <h2 class="popup-title ${log.type}">${log.type}: ${log.message}</h2>
8
+ <div class="mt-05">${getDate(log.updatedAt)}</div>
9
+ ${
10
+ log.trace
11
+ ? `
12
+ <h3 class="mt-2">Trace</h3>
13
+ <p class="key pl-2"><span>${getTrace(log.trace)}</span></p>
14
+ `
15
+ : ""
16
+ }
17
17
  ${
18
18
  log.context
19
19
  ? `
@@ -22,6 +22,14 @@ function showLogDetails(log) {
22
22
  `
23
23
  : ""
24
24
  }
25
+ ${
26
+ log.breadcrumbs && log.breadcrumbs.length > 0
27
+ ? `
28
+ <h3 class="mt-2">Breadcrumbs</h3>
29
+ <p>${jsonViewer(log.breadcrumbs)}</p>
30
+ `
31
+ : ""
32
+ }
25
33
  <button class="white mt-2" onclick="closePopup()">Close</button>
26
34
  </div>
27
35
  <div>`;
@@ -5,11 +5,22 @@ function jsonViewer(json, parentKey) {
5
5
 
6
6
  res = `<div>`;
7
7
 
8
- if (parentKey) {
9
- res += `<div class="pl-2"><div>${parentKey}</div>`;
8
+ if (Array.isArray(json)) {
9
+ json.forEach((item) => {
10
+ res += `<div class="key pl-2">${
11
+ typeof item === "object" ? jsonViewer(item) : `<span>${item}</span>`
12
+ }</div>`;
13
+ });
14
+
15
+ return res;
10
16
  }
11
17
 
12
18
  const keys = Object.keys(json);
19
+ const showParentKey = parentKey && keys.length > 0; // hide an empty object
20
+
21
+ if (showParentKey) {
22
+ res += `<div class="pl-2"><div>${parentKey}</div>`;
23
+ }
13
24
 
14
25
  for (const key of keys) {
15
26
  if (typeof json[key] === "object") {
@@ -19,7 +30,7 @@ function jsonViewer(json, parentKey) {
19
30
  }
20
31
  }
21
32
 
22
- if (parentKey) {
33
+ if (showParentKey) {
23
34
  res += `</div>`;
24
35
  }
25
36
 
@@ -3,6 +3,7 @@ body {
3
3
  background-color: var(--white);
4
4
  color: black;
5
5
  font-family: Verdana, sans-serif;
6
+ font-size: 14px;
6
7
  display: flex;
7
8
  flex-direction: column;
8
9
  align-items: center;
@@ -11,19 +12,19 @@ body {
11
12
  }
12
13
 
13
14
  h1 {
14
- font-size: 2.5rem;
15
+ font-size: 2.6rem;
15
16
  font-weight: 400;
16
17
  line-height: 3rem;
17
18
  }
18
19
 
19
20
  h2 {
20
- font-size: 1.7rem;
21
+ font-size: 1.4rem;
21
22
  font-weight: 400;
22
- line-height: 2.5rem;
23
+ line-height: 1.8rem;
23
24
  }
24
25
 
25
26
  h3 {
26
- font-size: 1.3rem;
27
+ font-size: 1.1rem;
27
28
  font-weight: 400;
28
29
  line-height: 2rem;
29
30
  }
@@ -162,14 +163,18 @@ nav ul li:hover {
162
163
  }
163
164
 
164
165
  /* margins and paddings */
166
+ .mt-05 {
167
+ margin-top: 0.5rem;
168
+ }
169
+ .mt-1 {
170
+ margin-top: 1rem;
171
+ }
165
172
  .mt-2 {
166
173
  margin-top: 2rem;
167
174
  }
168
-
169
175
  .mt-3 {
170
176
  margin-top: 3rem;
171
177
  }
172
-
173
178
  .pl-2 {
174
179
  box-sizing: border-box;
175
180
  padding-left: 2rem;
@@ -206,7 +211,7 @@ nav ul li:hover {
206
211
 
207
212
  .table-header > :nth-child(2),
208
213
  .row > :nth-child(2) {
209
- flex: 0 0 20rem;
214
+ flex: 0 0 auto;
210
215
  }
211
216
  .table-header > :nth-child(3),
212
217
  .row > :nth-child(3) {
@@ -239,7 +244,6 @@ nav ul li:hover {
239
244
  }
240
245
 
241
246
  .context {
242
- font-size: small;
243
247
  color: var(--dark);
244
248
  display: -webkit-box;
245
249
  -webkit-box-orient: vertical;
@@ -247,10 +251,20 @@ nav ul li:hover {
247
251
  -webkit-line-clamp: 2;
248
252
  overflow: hidden;
249
253
  text-overflow: ellipsis;
250
- max-height: 2.65rem;
254
+ max-height: 2.7rem;
251
255
  margin-top: -1rem;
252
256
  }
253
257
 
258
+ .log-info {
259
+ display: -webkit-box;
260
+ -webkit-box-orient: vertical;
261
+ line-clamp: 1;
262
+ -webkit-line-clamp: 1;
263
+ overflow: hidden;
264
+ text-overflow: ellipsis;
265
+ max-height: 1.2rem;
266
+ }
267
+
254
268
  .date {
255
269
  font-size: small;
256
270
  color: var(--dark);
@@ -288,17 +302,29 @@ nav ul li:hover {
288
302
  height: 100%;
289
303
  overflow-y: scroll;
290
304
  z-index: 1;
291
- opacity: 0.95;
305
+ opacity: 0.97;
292
306
  }
293
307
 
294
308
  /* JSON viewer */
309
+ .key {
310
+ font-size: 0.9rem;
311
+ }
312
+
295
313
  .key span {
296
314
  color: var(--dark);
297
315
  }
298
316
 
299
317
  @media (max-width: 1620px) {
300
- .container {
301
- padding: 0 2rem;
318
+ header button {
319
+ margin-right: 1rem;
320
+ }
321
+
322
+ .logo {
323
+ margin-left: 1rem;
324
+ }
325
+
326
+ .logo h2 {
327
+ display: none;
302
328
  }
303
329
 
304
330
  #popup {
@@ -14,6 +14,7 @@ export function createLogEntity(name: string) {
14
14
  count: { type: Number, default: 1 },
15
15
  context: { type: String, nullable: true },
16
16
  trace: { type: String, nullable: true },
17
+ breadcrumbs: { type: String, nullable: true },
17
18
  createdAt: { type: Date },
18
19
  updatedAt: { type: Date },
19
20
  },
@@ -12,11 +12,11 @@ export class LogInterceptor implements NestInterceptor {
12
12
  return next.handle().pipe(
13
13
  tap({
14
14
  error: (error) => {
15
- // error handler
16
15
  this.logService?.error(error.message, error.stack, context);
16
+ this.logService?.clearBreadcrumbs();
17
17
  },
18
18
  complete: () => {
19
- // normal request
19
+ this.logService?.clearBreadcrumbs();
20
20
  },
21
21
  })
22
22
  );
@@ -19,6 +19,8 @@ export class LogService implements LoggerService {
19
19
  static Log: EntitySchema = createLogEntity(defaultTable);
20
20
  static timer: ReturnType<typeof setInterval>;
21
21
 
22
+ breadcrumbs: any[] = [];
23
+
22
24
  constructor(private readonly memoryDbService: MemoryDbService) {}
23
25
 
24
26
  async connectDb(options: LogModuleOptions): Promise<DataSource> {
@@ -49,6 +51,14 @@ export class LogService implements LoggerService {
49
51
  return LogService.connection;
50
52
  }
51
53
 
54
+ addBreadcrumb(breadcrumb: any) {
55
+ this.breadcrumbs.push(breadcrumb);
56
+ }
57
+
58
+ clearBreadcrumbs() {
59
+ this.breadcrumbs = [];
60
+ }
61
+
52
62
  log(message: string, context?: ExecutionContextHost) {
53
63
  this.smartInsert({
54
64
  type: LogType.LOG,
@@ -101,6 +111,7 @@ export class LogService implements LoggerService {
101
111
  "updatedAt",
102
112
  "context",
103
113
  "trace",
114
+ "breadcrumbs",
104
115
  ],
105
116
  order: { updatedAt: "DESC" },
106
117
  });
@@ -130,6 +141,7 @@ export class LogService implements LoggerService {
130
141
  return await connection.update(LogService.Log, log._id, {
131
142
  context,
132
143
  trace: data.trace,
144
+ breadcrumbs: this.breadcrumbs,
133
145
  count: log.count + 1,
134
146
  updatedAt: currentDate,
135
147
  });
@@ -140,6 +152,7 @@ export class LogService implements LoggerService {
140
152
  message: data.message,
141
153
  context,
142
154
  trace: data.trace,
155
+ breadcrumbs: this.breadcrumbs,
143
156
  count: 1,
144
157
  createdAt: currentDate,
145
158
  updatedAt: currentDate,