You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
6.6 KiB
239 lines
6.6 KiB
3 years ago
|
'use strict'
|
||
|
/* eslint no-prototype-builtins: 0 */
|
||
|
const os = require('os')
|
||
|
const stdSerializers = require('pino-std-serializers')
|
||
|
const redaction = require('./lib/redaction')
|
||
|
const time = require('./lib/time')
|
||
|
const proto = require('./lib/proto')
|
||
|
const symbols = require('./lib/symbols')
|
||
|
const { assertDefaultLevelFound, mappings, genLsCache } = require('./lib/levels')
|
||
|
const {
|
||
|
createArgsNormalizer,
|
||
|
asChindings,
|
||
|
final,
|
||
|
stringify,
|
||
|
buildSafeSonicBoom,
|
||
|
buildFormatters,
|
||
|
noop
|
||
|
} = require('./lib/tools')
|
||
|
const { version } = require('./lib/meta')
|
||
|
const { mixinMergeStrategySym } = require('./lib/symbols')
|
||
|
const {
|
||
|
chindingsSym,
|
||
|
redactFmtSym,
|
||
|
serializersSym,
|
||
|
timeSym,
|
||
|
timeSliceIndexSym,
|
||
|
streamSym,
|
||
|
stringifySym,
|
||
|
stringifiersSym,
|
||
|
setLevelSym,
|
||
|
endSym,
|
||
|
formatOptsSym,
|
||
|
messageKeySym,
|
||
|
nestedKeySym,
|
||
|
mixinSym,
|
||
|
useOnlyCustomLevelsSym,
|
||
|
formattersSym,
|
||
|
hooksSym
|
||
|
} = symbols
|
||
|
const { epochTime, nullTime } = time
|
||
|
const { pid } = process
|
||
|
const hostname = os.hostname()
|
||
|
const defaultErrorSerializer = stdSerializers.err
|
||
|
const defaultOptions = {
|
||
|
level: 'info',
|
||
|
messageKey: 'msg',
|
||
|
nestedKey: null,
|
||
|
enabled: true,
|
||
|
prettyPrint: false,
|
||
|
base: { pid, hostname },
|
||
|
serializers: Object.assign(Object.create(null), {
|
||
|
err: defaultErrorSerializer
|
||
|
}),
|
||
|
formatters: Object.assign(Object.create(null), {
|
||
|
bindings (bindings) {
|
||
|
return bindings
|
||
|
},
|
||
|
level (label, number) {
|
||
|
return { level: number }
|
||
|
}
|
||
|
}),
|
||
|
hooks: {
|
||
|
logMethod: undefined
|
||
|
},
|
||
|
timestamp: epochTime,
|
||
|
name: undefined,
|
||
|
redact: null,
|
||
|
customLevels: null,
|
||
|
levelKey: undefined,
|
||
|
useOnlyCustomLevels: false
|
||
|
}
|
||
|
|
||
|
const normalize = createArgsNormalizer(defaultOptions)
|
||
|
|
||
|
const serializers = Object.assign(Object.create(null), stdSerializers)
|
||
|
|
||
|
function pino (...args) {
|
||
|
const instance = {}
|
||
|
const { opts, stream } = normalize(instance, ...args)
|
||
|
const {
|
||
|
redact,
|
||
|
crlf,
|
||
|
serializers,
|
||
|
timestamp,
|
||
|
messageKey,
|
||
|
nestedKey,
|
||
|
base,
|
||
|
name,
|
||
|
level,
|
||
|
customLevels,
|
||
|
useLevelLabels,
|
||
|
changeLevelName,
|
||
|
levelKey,
|
||
|
mixin,
|
||
|
mixinMergeStrategy,
|
||
|
useOnlyCustomLevels,
|
||
|
formatters,
|
||
|
hooks
|
||
|
} = opts
|
||
|
|
||
|
const allFormatters = buildFormatters(
|
||
|
formatters.level,
|
||
|
formatters.bindings,
|
||
|
formatters.log
|
||
|
)
|
||
|
|
||
|
if (useLevelLabels && !(changeLevelName || levelKey)) {
|
||
|
process.emitWarning('useLevelLabels is deprecated, use the formatters.level option instead', 'Warning', 'PINODEP001')
|
||
|
allFormatters.level = labelsFormatter
|
||
|
} else if ((changeLevelName || levelKey) && !useLevelLabels) {
|
||
|
process.emitWarning('changeLevelName and levelKey are deprecated, use the formatters.level option instead', 'Warning', 'PINODEP002')
|
||
|
allFormatters.level = levelNameFormatter(changeLevelName || levelKey)
|
||
|
} else if ((changeLevelName || levelKey) && useLevelLabels) {
|
||
|
process.emitWarning('useLevelLabels is deprecated, use the formatters.level option instead', 'Warning', 'PINODEP001')
|
||
|
process.emitWarning('changeLevelName and levelKey are deprecated, use the formatters.level option instead', 'Warning', 'PINODEP002')
|
||
|
allFormatters.level = levelNameLabelFormatter(changeLevelName || levelKey)
|
||
|
}
|
||
|
|
||
|
if (serializers[Symbol.for('pino.*')]) {
|
||
|
process.emitWarning('The pino.* serializer is deprecated, use the formatters.log options instead', 'Warning', 'PINODEP003')
|
||
|
allFormatters.log = serializers[Symbol.for('pino.*')]
|
||
|
}
|
||
|
|
||
|
if (!allFormatters.bindings) {
|
||
|
allFormatters.bindings = defaultOptions.formatters.bindings
|
||
|
}
|
||
|
if (!allFormatters.level) {
|
||
|
allFormatters.level = defaultOptions.formatters.level
|
||
|
}
|
||
|
|
||
|
const stringifiers = redact ? redaction(redact, stringify) : {}
|
||
|
const formatOpts = redact
|
||
|
? { stringify: stringifiers[redactFmtSym] }
|
||
|
: { stringify }
|
||
|
const end = '}' + (crlf ? '\r\n' : '\n')
|
||
|
const coreChindings = asChindings.bind(null, {
|
||
|
[chindingsSym]: '',
|
||
|
[serializersSym]: serializers,
|
||
|
[stringifiersSym]: stringifiers,
|
||
|
[stringifySym]: stringify,
|
||
|
[formattersSym]: allFormatters
|
||
|
})
|
||
|
|
||
|
let chindings = ''
|
||
|
if (base !== null) {
|
||
|
if (name === undefined) {
|
||
|
chindings = coreChindings(base)
|
||
|
} else {
|
||
|
chindings = coreChindings(Object.assign({}, base, { name }))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const time = (timestamp instanceof Function)
|
||
|
? timestamp
|
||
|
: (timestamp ? epochTime : nullTime)
|
||
|
const timeSliceIndex = time().indexOf(':') + 1
|
||
|
|
||
|
if (useOnlyCustomLevels && !customLevels) throw Error('customLevels is required if useOnlyCustomLevels is set true')
|
||
|
if (mixin && typeof mixin !== 'function') throw Error(`Unknown mixin type "${typeof mixin}" - expected "function"`)
|
||
|
|
||
|
assertDefaultLevelFound(level, customLevels, useOnlyCustomLevels)
|
||
|
const levels = mappings(customLevels, useOnlyCustomLevels)
|
||
|
|
||
|
Object.assign(instance, {
|
||
|
levels,
|
||
|
[useOnlyCustomLevelsSym]: useOnlyCustomLevels,
|
||
|
[streamSym]: stream,
|
||
|
[timeSym]: time,
|
||
|
[timeSliceIndexSym]: timeSliceIndex,
|
||
|
[stringifySym]: stringify,
|
||
|
[stringifiersSym]: stringifiers,
|
||
|
[endSym]: end,
|
||
|
[formatOptsSym]: formatOpts,
|
||
|
[messageKeySym]: messageKey,
|
||
|
[nestedKeySym]: nestedKey,
|
||
|
[serializersSym]: serializers,
|
||
|
[mixinSym]: mixin,
|
||
|
[mixinMergeStrategySym]: mixinMergeStrategy,
|
||
|
[chindingsSym]: chindings,
|
||
|
[formattersSym]: allFormatters,
|
||
|
[hooksSym]: hooks,
|
||
|
silent: noop
|
||
|
})
|
||
|
|
||
|
Object.setPrototypeOf(instance, proto())
|
||
|
|
||
|
genLsCache(instance)
|
||
|
|
||
|
instance[setLevelSym](level)
|
||
|
|
||
|
return instance
|
||
|
}
|
||
|
|
||
|
function labelsFormatter (label, number) {
|
||
|
return { level: label }
|
||
|
}
|
||
|
|
||
|
function levelNameFormatter (name) {
|
||
|
return function (label, number) {
|
||
|
return { [name]: number }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function levelNameLabelFormatter (name) {
|
||
|
return function (label, number) {
|
||
|
return { [name]: label }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = pino
|
||
|
|
||
|
module.exports.extreme = (dest = process.stdout.fd) => {
|
||
|
process.emitWarning(
|
||
|
'The pino.extreme() option is deprecated and will be removed in v7. Use pino.destination({ sync: false }) instead.',
|
||
|
{ code: 'extreme_deprecation' }
|
||
|
)
|
||
|
return buildSafeSonicBoom({ dest, minLength: 4096, sync: false })
|
||
|
}
|
||
|
|
||
|
module.exports.destination = (dest = process.stdout.fd) => {
|
||
|
if (typeof dest === 'object') {
|
||
|
dest.dest = dest.dest || process.stdout.fd
|
||
|
return buildSafeSonicBoom(dest)
|
||
|
} else {
|
||
|
return buildSafeSonicBoom({ dest, minLength: 0, sync: true })
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports.final = final
|
||
|
module.exports.levels = mappings()
|
||
|
module.exports.stdSerializers = serializers
|
||
|
module.exports.stdTimeFunctions = Object.assign({}, time)
|
||
|
module.exports.symbols = symbols
|
||
|
module.exports.version = version
|
||
|
|
||
|
// Enables default and name export with TypeScript and Babel
|
||
|
module.exports.default = pino
|
||
|
module.exports.pino = pino
|