-
-
Notifications
You must be signed in to change notification settings - Fork 285
/
LogIncomingRequestMiddleware.ts
122 lines (106 loc) · 3.23 KB
/
LogIncomingRequestMiddleware.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import {InjectorService} from "@tsed/di";
import {PlatformLoggerSettings} from "../../config/interfaces/PlatformLoggerSettings";
import {IMiddleware, Middleware, Req, Res} from "../../mvc";
/**
* @deprecated Use PlatformLogMiddleware instead of.
* @middleware
*/
@Middleware()
export class LogIncomingRequestMiddleware implements IMiddleware {
protected static DEFAULT_FIELDS = ["reqId", "method", "url", "duration"];
$onResponse: any;
protected settings: PlatformLoggerSettings;
// tslint:disable-next-line: no-unused-variable
constructor(injector: InjectorService) {
this.settings = injector.settings.logger || {};
this.settings.requestFields = this.settings.requestFields || LogIncomingRequestMiddleware.DEFAULT_FIELDS;
if (this.settings.level !== "off") {
this.$onResponse = this.onLogEnd;
}
}
/**
* Handle the request.
* @param {e.Request} request
*/
public use(@Req() request: Req): void {
this.configureRequest(request);
this.onLogStart(request);
}
/**
* The separate onLogStart() function will allow developer to overwrite the initial request log.
* @param {e.Request} request
*/
protected onLogStart(request: Req) {
const {debug, logRequest, logStart} = this.settings;
if (logStart !== false) {
if (debug) {
request.ctx.logger.debug({
event: "request.start"
});
} else if (logRequest) {
request.ctx.logger.info({
event: "request.start"
});
}
}
}
/**
* Called when the `$onResponse` is called by Ts.ED (through Express.end).
* @param request
* @param response
*/
protected onLogEnd(request: Req, response: Res) {
const {debug, logRequest, logEnd} = this.settings;
if (logEnd !== false) {
if (debug) {
request.ctx.logger.debug({
event: "request.end",
status: response.statusCode,
data: request.ctx.data
});
} else if (logRequest) {
request.ctx.logger.info({
event: "request.end",
status: response.statusCode
});
}
}
request.ctx.logger.flush();
}
/**
* Attach all information that will be necessary to log the request. Attach a new `request.log` object.
* @param request
*/
protected configureRequest(request: Req) {
request.ctx.logger.minimalRequestPicker = (obj: any) => ({...this.minimalRequestPicker(request), ...obj});
request.ctx.logger.completeRequestPicker = (obj: any) => ({...this.requestToObject(request), ...obj});
}
/**
* Return complete request info.
* @param request
* @returns {Object}
*/
protected requestToObject(request: Req): any {
return {
method: request.method,
url: request.originalUrl || request.url,
headers: request.headers,
body: request.body,
query: request.query,
params: request.params
};
}
/**
* Return a filtered request from global configuration.
* @param request
* @returns {Object}
*/
protected minimalRequestPicker(request: Req): any {
const {requestFields} = this.settings;
const info = this.requestToObject(request);
return requestFields!.reduce((acc: any, key: string) => {
acc[key] = info[key];
return acc;
}, {});
}
}