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

Commit 2cbb90c

Browse files
author
Michal Vlasák
committed
Add exclusive streams
1 parent a65ee94 commit 2cbb90c

2 files changed

Lines changed: 48 additions & 3 deletions

File tree

index.js

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,43 @@ const pino = require('pino');
88
const multistream = require('pino-multi-stream').multistream;
99
const serializers = require('./serializers');
1010

11+
const levels = {
12+
silent: Infinity,
13+
fatal: 60,
14+
error: 50,
15+
warn: 40,
16+
info: 30,
17+
debug: 20,
18+
trace: 10,
19+
};
20+
1121
// options.disableFields = ['error.stack'];
1222

23+
const maxLevelWrite = function(data) {
24+
let dest;
25+
let stream;
26+
const needsMetadata = Symbol.for('needsMetadata');
27+
const level = this.lastLevel;
28+
const streams = this.streams;
29+
for (let i = 0; i < streams.length; i++) {
30+
dest = streams[i];
31+
stream = dest.stream;
32+
if (dest.level <= level) {
33+
if (!dest.maxLevel || (dest.maxLevel && level < dest.maxLevel)) {
34+
if (stream[needsMetadata]) {
35+
stream.lastLevel = level;
36+
stream.lastMsg = this.lastMsg;
37+
stream.lastObj = this.lastObj;
38+
stream.lastLogger = this.lastLogger;
39+
}
40+
stream.write(data);
41+
}
42+
} else {
43+
break;
44+
}
45+
}
46+
};
47+
1348
const defaultLogger = (options = {}) => {
1449
const pretty = pino.pretty();
1550
pretty.pipe(process.stdout);
@@ -49,10 +84,16 @@ const defaultLogger = (options = {}) => {
4984

5085
let streams;
5186
if (isProduction) {
52-
streams = [{ level: defaultLevel, stream: process.stdout }, { level: 'warn', stream: process.stderr }];
87+
streams = [
88+
{ level: defaultLevel, stream: process.stdout, maxLevel: levels.warn },
89+
{ level: levels.warn, stream: process.stderr },
90+
];
5391
} else {
5492
// dev behavior = default
55-
streams = [{ level: defaultLevel, stream: pretty }, { level: 'warn', stream: prettyErr }];
93+
streams = [
94+
{ level: defaultLevel, stream: pretty, maxLevel: levels.warn },
95+
{ level: levels.warn, stream: prettyErr },
96+
];
5697
}
5798

5899
if (options.streams) {
@@ -62,6 +103,10 @@ const defaultLogger = (options = {}) => {
62103
const logger = pino({ level: defaultLevel, timestamp: false, base: {}, serializers }, multistream(streams));
63104
logger.warning = logger.warn;
64105

106+
// Add maxLevel support to pino-multi-stream
107+
// This could be replaced with custom pass-through stream being passed to multistream, which would filter the messages
108+
logger.stream.write = maxLevelWrite.bind(logger.stream);
109+
65110
return logger;
66111
};
67112

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"dependencies": {
1818
"lodash": "^4.17.5",
1919
"pino": "^4.13.0",
20-
"pino-multi-stream": "^3.1.2"
20+
"pino-multi-stream": "3.1.2"
2121
},
2222
"devDependencies": {
2323
"eslint": "^4.18.2",

0 commit comments

Comments
 (0)