This repository has been archived by the owner on Jun 27, 2020. It is now read-only.
/
index.js
executable file
·115 lines (97 loc) · 2.58 KB
/
index.js
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
#!/usr/bin/env node
const { print, chalk } = require('@ianwalter/print')
const split = require('split2')
const parseJson = require('fast-json-parse')
const cli = require('@ianwalter/cli')
const config = cli({
name: 'pino-print',
opts: {
alias: {
level: 'l'
},
default: {
level: 'info'
}
}
})
function pinoPrint (line) {
if (line[0] === '{') {
let {
value: {
// General log properties:
level,
time,
msg,
// Log properties specific to servers.
req,
res,
responseTime,
// Only included in debug levels:
hostname,
pid,
// Ignored:
v,
// Everything else:
...rest
}
} = parseJson(line || {})
const messages = []
const isRequest = responseTime !== undefined
// Determine type of log to use.
let logType = 'debug'
let logColor = 'magenta'
if (level === 30) {
logType = isRequest ? 'text' : 'info'
logColor = isRequest ? 'white' : 'blue'
} else if (level === 40) {
logType = 'warn'
logColor = 'yellow'
} else if (level === 50) {
logType = 'error'
logColor = 'red'
} else if (level === 60) {
logType = 'fatal'
logColor = 'red'
}
if (time) {
const datetime = new Date(time)
const [second, meridiem] = datetime.toLocaleTimeString().split(' ')
const ms = `${datetime.getMilliseconds()}`.padEnd(3, '0')
const date = datetime.toLocaleDateString()
messages.push(
chalk.white.bold(`${date} ${second}.${ms}${meridiem.toLowerCase()} ●`)
)
}
if (res && res.statusCode) {
messages.push(chalk[logColor](res.statusCode))
}
if (req && req.method && isRequest) {
messages.push(chalk[logColor](req.method))
}
if (req && req.url && isRequest) {
messages.push(chalk[logColor](req.url))
}
if (msg) {
messages.push(chalk[logColor](msg))
}
if (isRequest) {
responseTime = responseTime === 0 ? '< 1' : responseTime
// FIXME: use timer to get a better formatted duration string.
messages.push(chalk.dim(`in ${responseTime}ms`))
}
// Add back information if log level is debug.
if (config.level === 'debug' && responseTime) {
rest.hostname = hostname
rest.pid = pid
rest.req = {
id: req.id,
headers: req.headers
}
rest.res = { headers: res.headers }
}
print[logType](...messages, ...Object.keys(rest).length ? [rest] : [])
} else {
print.write(line)
}
}
process.stdin.pipe(split(pinoPrint))