-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.js
More file actions
executable file
·67 lines (56 loc) · 1.92 KB
/
cli.js
File metadata and controls
executable file
·67 lines (56 loc) · 1.92 KB
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
#!/usr/bin/env node
const split = require('split2');
const pump = require('pump');
const through = require('through2');
const program = require('commander');
const chalk = require('chalk');
const pretty = require('pino').pretty();
program
.description('Pipe heroku live tail logs into a readable output')
.option('-i, --include [include]', 'Comma-delimited list of properties to include. Defaults to all')
.parse(process.argv);
const props = program.include ? program.include.split(',') : [];
const regex = /^.*?:\s({.*})$/;
const transformer = through.obj((chunk, enc, cb) => {
const [, herokuSyslog, message] = chunk.match(/^(.*?]:)(\s.*)$/);
// Non-JSON logs
if (!regex.test(chunk)) {
return cb(null, `${chalk.green(herokuSyslog)}${message}\n`);
}
// Parse JSON
let parsed;
try {
parsed = JSON.parse(chunk.match(regex)[1]);
} catch (e) {
// Not a valid JSON line, log it as is
return cb(null, `${chalk.green(herokuSyslog)}${message}\n`);
}
// Cherry picked default properties
const defaultProps = {
time: parsed.time,
level: parsed.level,
name: parsed.name,
v: parsed.v,
msg: parsed.msg,
namespace: parsed.namespace,
};
const extraProps = !props.length
// Include all properties if user hasn't chosen any
? parsed
// Included properties by user
: props.reduce((acc, prop) => ({
...acc,
[prop]: parsed[prop],
}), {});
// Stringify JSON
const stringified = JSON.stringify({ ...defaultProps, ...extraProps });
return cb(null, `${stringified}\n`);
});
// Pipeline steps
pump(
process.stdin, // Take everything that is piped in
split(), // Split stream so we have a line per chunk
transformer, // Apply our own transformer
pretty, // Pretty print JSON lines through Pino
process.stdout, // Output everything to stdout
);