UNPKG

2.62 kBJavaScriptView Raw
1'use strict'
2
3/**
4 * Code imported from `pino-http`
5 * Repo: https://github.com/pinojs/pino-http
6 * License: MIT (https://raw.githubusercontent.com/pinojs/pino-http/master/LICENSE)
7 */
8
9const abstractLogging = require('abstract-logging')
10const pino = require('pino')
11const { serializersSym } = pino.symbols
12const { isValidLogger } = require('./validation')
13const {
14 codes: {
15 FST_ERR_LOG_INVALID_DESTINATION
16 }
17} = require('./errors')
18
19function createPinoLogger (opts, stream) {
20 stream = stream || opts.stream
21 delete opts.stream
22
23 if (stream && opts.file) {
24 throw new FST_ERR_LOG_INVALID_DESTINATION()
25 } else if (opts.file) {
26 // we do not have stream
27 stream = pino.destination(opts.file)
28 delete opts.file
29 }
30
31 var prevLogger = opts.logger
32 var prevGenReqId = opts.genReqId
33 var logger = null
34
35 if (prevLogger) {
36 opts.logger = undefined
37 opts.genReqId = undefined
38 // we need to tap into pino internals because in v5 it supports
39 // adding serializers in child loggers
40 if (prevLogger[serializersSym]) {
41 opts.serializers = Object.assign({}, opts.serializers, prevLogger[serializersSym])
42 }
43 logger = prevLogger.child(opts)
44 opts.logger = prevLogger
45 opts.genReqId = prevGenReqId
46 } else {
47 logger = pino(opts, stream)
48 }
49
50 return logger
51}
52
53const serializers = {
54 req: function asReqValue (req) {
55 return {
56 method: req.method,
57 url: req.url,
58 version: req.headers['accept-version'],
59 hostname: req.hostname,
60 remoteAddress: req.ip,
61 remotePort: req.connection.remotePort
62 }
63 },
64 err: pino.stdSerializers.err,
65 res: function asResValue (res) {
66 return {
67 statusCode: res.statusCode
68 }
69 }
70}
71
72function now () {
73 var ts = process.hrtime()
74 return (ts[0] * 1e3) + (ts[1] / 1e6)
75}
76
77function createLogger (options) {
78 if (isValidLogger(options.logger)) {
79 const logger = createPinoLogger({
80 logger: options.logger,
81 serializers: Object.assign({}, serializers, options.logger.serializers)
82 })
83 return { logger, hasLogger: true }
84 } else if (!options.logger) {
85 const logger = Object.create(abstractLogging)
86 logger.child = () => logger
87 return { logger, hasLogger: false }
88 } else {
89 options.logger = typeof options.logger === 'object' ? options.logger : {}
90 options.logger.level = options.logger.level || 'info'
91 options.logger.serializers = Object.assign({}, serializers, options.logger.serializers)
92 const logger = createPinoLogger(options.logger)
93 return { logger, hasLogger: true }
94 }
95}
96
97module.exports = {
98 createLogger,
99 serializers,
100 now
101}