Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit c64c350

Browse files
authored
Merge pull request #10 from AckeeCZ/chng/refactor-1903
Pretty streams optimizations, refactoring
2 parents baad2ab + 332703e commit c64c350

5 files changed

Lines changed: 54 additions & 50 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
### Fixed
44
- lint issue due to changes in tslint 5.12.0
55
- stream write function type
6+
- pretty streams created only when needed
67

78
### Added
89
- coveralls integration
10+
11+
## Changed
12+
- refactoring of express handlers
913

1014
## [1.0.3] - 2018-11-08
1115

src/declarations.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ declare module 'pick-deep' {
88
export = pickDeep;
99
}
1010

11-
declare module 'pino-multi-stream' {}
11+
declare module 'pino-multi-stream' {
12+
13+
}
1214

1315
// there is a @typed/pino-multi-stream package, but it has wrong type in its Streams definition. So until its fixed, we use this
1416
/* declare module 'pino-multi-stream' {

src/express.ts

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,59 @@ import { AckeeLogger } from '.';
55

66
const errorSymbol = Symbol.for('error');
77

8+
type AckeeRequest = Request & { _startAt?: [number, number]; ackId?: string };
9+
type AckeeResponse = Response & { _startAt?: [number, number]; time?: string; out?: object; [errorSymbol]?: any };
10+
811
export type AckeeLoggerExpressMiddleware = (
912
this: AckeeLogger,
10-
req: Request & { _startAt?: [number, number]; ackId?: string },
11-
response: Response & { _startAt?: [number, number]; time?: string; out?: object; [errorSymbol]?: any },
13+
req: AckeeRequest,
14+
response: AckeeResponse,
1215
next: any
1316
) => void;
1417

18+
const expressOnHeaders = (req: AckeeRequest, res: AckeeResponse) => () => {
19+
res._startAt = process.hrtime();
20+
const diffFromSeconds = (res._startAt[0] - req._startAt![0]) * 1e3;
21+
const diffFromNanoseconds = (res._startAt[1] - req._startAt![1]) * 1e-6;
22+
const ms = diffFromSeconds + diffFromNanoseconds;
23+
res.time = ms.toFixed(3);
24+
};
25+
26+
const expressOnFinished = (logger: AckeeLogger, req: AckeeRequest) => (_err: Error | null, res: AckeeResponse) => {
27+
const error = res[errorSymbol];
28+
const reqOut = `${res.statusCode} ${req.method} ${req.originalUrl} ${res.time} ms ${req.headers['user-agent']}`;
29+
if (logger.options.ignoredHttpMethods && logger.options.ignoredHttpMethods.includes(req.method)) {
30+
return;
31+
}
32+
const standardOutput = {
33+
data: {
34+
req,
35+
res,
36+
ackId: req.ackId,
37+
},
38+
message: `${reqOut} - Standard output`,
39+
};
40+
41+
if (error) {
42+
logger.error({ error, req, res, ackId: req.ackId }, `${reqOut} - Error handler at the end of app`);
43+
} else if (res.out) {
44+
logger.debug(standardOutput.data, standardOutput.message);
45+
} else {
46+
logger.info(standardOutput.data, standardOutput.message);
47+
}
48+
};
49+
1550
const expressMiddleware: RequestHandler = function(
1651
this: AckeeLogger,
17-
req: Request & { _startAt?: [number, number]; ackId?: string },
18-
response: Response & { _startAt?: [number, number]; time?: string; out?: object; [errorSymbol]?: any },
52+
req: AckeeRequest,
53+
response: AckeeResponse,
1954
next: any
2055
) {
2156
const reqIn = `--- ${req.method} ${req.originalUrl} ${req.headers['user-agent']}`;
2257
this.debug({ req, ackId: req.ackId }, `${reqIn} - Request accepted`);
2358
req._startAt = process.hrtime();
24-
onHeaders(response, () => {
25-
response._startAt = process.hrtime();
26-
const diffFromSeconds = (response._startAt[0] - req._startAt![0]) * 1e3;
27-
const diffFromNanoseconds = (response._startAt[1] - req._startAt![1]) * 1e-6;
28-
const ms = diffFromSeconds + diffFromNanoseconds;
29-
response.time = ms.toFixed(3);
30-
});
31-
onFinished(response, (_err, res) => {
32-
const error = res[errorSymbol];
33-
const reqOut = `${res.statusCode} ${req.method} ${req.originalUrl} ${res.time} ms ${req.headers['user-agent']}`;
34-
if (this.options.ignoredHttpMethods && this.options.ignoredHttpMethods.includes(req.method)) {
35-
return;
36-
}
37-
const standardOutput = {
38-
data: {
39-
req,
40-
res,
41-
ackId: req.ackId,
42-
},
43-
message: `${reqOut} - Standard output`,
44-
};
45-
46-
if (error) {
47-
this.error({ error, req, res, ackId: req.ackId }, `${reqOut} - Error handler at the end of app`);
48-
} else if (res.out) {
49-
this.debug(standardOutput.data, standardOutput.message);
50-
} else {
51-
this.info(standardOutput.data, standardOutput.message);
52-
}
53-
});
59+
onHeaders(response, expressOnHeaders(req, response));
60+
onFinished(response, expressOnFinished(this, req));
5461
next();
5562
};
5663

src/index.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,8 @@ const defaultLogger = (options: AckeeLoggerOptions = {}): AckeeLogger => {
5252
serializers.enablePaths(options.enableFields);
5353

5454
const isTesting = process.env.NODE_ENV === 'test';
55-
let defaultLevel: Level = 'debug';
56-
57-
if (options.defaultLevel) {
58-
defaultLevel = options.defaultLevel;
59-
} else if (isTesting) {
60-
defaultLevel = 'silent';
61-
}
62-
55+
const defaultLevel: Level = options.defaultLevel || (isTesting ? 'silent' : 'debug');
6356
const streams = initLoggerStreams(defaultLevel, options);
64-
const defaultMessageKey = options.pretty ? 'msg' : 'message'; // "message" is the best option for Google Stackdriver
6557

6658
if (!options.ignoredHttpMethods) {
6759
options.ignoredHttpMethods = ['OPTIONS'];
@@ -74,7 +66,7 @@ const defaultLogger = (options: AckeeLoggerOptions = {}): AckeeLogger => {
7466
{
7567
base: {},
7668
level: defaultLevel,
77-
messageKey: defaultMessageKey,
69+
messageKey: options.pretty ? 'msg' : 'message', // "message" is the best option for Google Stackdriver,
7870
serializers: serializers.serializers,
7971
timestamp: false,
8072
},

src/streams.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,14 @@ const decorateStreams = <T extends Transform>(streams: AckeeLoggerStream[], stre
3131
};
3232

3333
const initLoggerStreams = (defaultLevel: pino.LevelWithSilent, options: AckeeLoggerOptions = {}) => {
34-
const pretty = pino.pretty();
35-
pretty.pipe(process.stdout);
36-
const prettyErr = pino.pretty();
37-
prettyErr.pipe(process.stderr);
38-
3934
let streams: AckeeLoggerStream[];
4035
if (options.streams) {
4136
streams = options.streams;
4237
} else if (options.pretty) {
38+
const pretty = pino.pretty();
39+
pretty.pipe(process.stdout);
40+
const prettyErr = pino.pretty();
41+
prettyErr.pipe(process.stderr);
4342
streams = [
4443
{ level: defaultLevel, maxLevel: levels.warn, stream: pretty },
4544
{ level: 'warn', stream: prettyErr },

0 commit comments

Comments
 (0)