|  |  |  |  | # API
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * [pino() => logger](#export) | 
					
						
							|  |  |  |  |   * [options](#options) | 
					
						
							|  |  |  |  |   * [destination](#destination) | 
					
						
							|  |  |  |  |   * [destination\[Symbol.for('pino.metadata')\]](#metadata) | 
					
						
							|  |  |  |  | * [Logger Instance](#logger) | 
					
						
							|  |  |  |  |   * [logger.trace()](#trace) | 
					
						
							|  |  |  |  |   * [logger.debug()](#debug) | 
					
						
							|  |  |  |  |   * [logger.info()](#info) | 
					
						
							|  |  |  |  |   * [logger.warn()](#warn) | 
					
						
							|  |  |  |  |   * [logger.error()](#error) | 
					
						
							|  |  |  |  |   * [logger.fatal()](#fatal) | 
					
						
							|  |  |  |  |   * [logger.silent()](#silent) | 
					
						
							|  |  |  |  |   * [logger.child()](#child) | 
					
						
							|  |  |  |  |   * [logger.bindings()](#bindings) | 
					
						
							|  |  |  |  |   * [logger.flush()](#flush) | 
					
						
							|  |  |  |  |   * [logger.level](#logger-level) | 
					
						
							|  |  |  |  |   * [logger.isLevelEnabled()](#islevelenabled) | 
					
						
							|  |  |  |  |   * [logger.levels](#levels) | 
					
						
							|  |  |  |  |   * [logger\[Symbol.for('pino.serializers')\]](#serializers) | 
					
						
							|  |  |  |  |   * [Event: 'level-change'](#level-change) | 
					
						
							|  |  |  |  |   * [logger.version](#version) | 
					
						
							|  |  |  |  | * [Statics](#statics) | 
					
						
							|  |  |  |  |   * [pino.destination()](#pino-destination) | 
					
						
							|  |  |  |  |   * [pino.final()](#pino-final) | 
					
						
							|  |  |  |  |   * [pino.stdSerializers](#pino-stdserializers) | 
					
						
							|  |  |  |  |   * [pino.stdTimeFunctions](#pino-stdtimefunctions) | 
					
						
							|  |  |  |  |   * [pino.symbols](#pino-symbols) | 
					
						
							|  |  |  |  |   * [pino.version](#pino-version) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="export"></a> | 
					
						
							|  |  |  |  | ## `pino([options], [destination]) => logger`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The exported `pino` function takes two optional arguments, | 
					
						
							|  |  |  |  | [`options`](#options) and [`destination`](#destination) and | 
					
						
							|  |  |  |  | returns a [logger instance](#logger). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=options></a> | 
					
						
							|  |  |  |  | ### `options` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `name` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `undefined` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The name of the logger. When set adds a `name` field to every JSON line logged. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `level` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `'info'` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | One of `'fatal'`, `'error'`, `'warn'`, `'info`', `'debug'`, `'trace'` or `'silent'`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Additional levels can be added to the instance via the `customLevels` option. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`customLevels` option](#opt-customlevels) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=opt-customlevels></a> | 
					
						
							|  |  |  |  | #### `customLevels` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `undefined` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Use this option to define additional logging levels. | 
					
						
							|  |  |  |  | The keys of the object correspond the namespace of the log level, | 
					
						
							|  |  |  |  | and the values should be the numerical value of the level. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const logger = pino({ | 
					
						
							|  |  |  |  |   customLevels: { | 
					
						
							|  |  |  |  |     foo: 35 | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | logger.foo('hi') | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=opt-useOnlyCustomLevels></a> | 
					
						
							|  |  |  |  | #### `useOnlyCustomLevels` (Boolean)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `false` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Use this option to only use defined `customLevels` and omit Pino's levels. | 
					
						
							|  |  |  |  | Logger's default `level` must be changed to a value in `customLevels` in order to use `useOnlyCustomLevels` | 
					
						
							|  |  |  |  | Warning: this option may not be supported by downstream transports. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const logger = pino({ | 
					
						
							|  |  |  |  |   customLevels: { | 
					
						
							|  |  |  |  |     foo: 35 | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  |   useOnlyCustomLevels: true, | 
					
						
							|  |  |  |  |   level: 'foo' | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | logger.foo('hi') | 
					
						
							|  |  |  |  | logger.info('hello') // Will throw an error saying info in not found in logger object | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="opt-mixin"></a> | 
					
						
							|  |  |  |  | #### `mixin` (Function):
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `undefined` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If provided, the `mixin` function is called each time one of the active | 
					
						
							|  |  |  |  | logging methods is called. The first and only parameter is the value `mergeObject` or an empty object. The function must synchronously return an | 
					
						
							|  |  |  |  | object. The properties of the returned object will be added to the | 
					
						
							|  |  |  |  | logged JSON. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | let n = 0 | 
					
						
							|  |  |  |  | const logger = pino({ | 
					
						
							|  |  |  |  |   mixin () { | 
					
						
							|  |  |  |  |     return { line: ++n } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | logger.info('hello') | 
					
						
							|  |  |  |  | // {"level":30,"time":1573664685466,"pid":78742,"hostname":"x","line":1,"msg":"hello"} | 
					
						
							|  |  |  |  | logger.info('world') | 
					
						
							|  |  |  |  | // {"level":30,"time":1573664685469,"pid":78742,"hostname":"x","line":2,"msg":"world"} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The result of `mixin()` is supposed to be a _new_ object. For performance reason, the object returned by `mixin()` will be mutated by pino. | 
					
						
							|  |  |  |  | In the following example, passing `mergingObject` argument to the first `info` call will mutate the global `mixin` object by default | 
					
						
							|  |  |  |  | (* See [`mixinMergeStrategy` option](#opt-mixin-merge-strategy)): | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const mixin = { | 
					
						
							|  |  |  |  |     appName: 'My app' | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const logger = pino({ | 
					
						
							|  |  |  |  |     mixin() { | 
					
						
							|  |  |  |  |         return mixin; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | logger.info({ | 
					
						
							|  |  |  |  |     description: 'Ok' | 
					
						
							|  |  |  |  | }, 'Message 1') | 
					
						
							|  |  |  |  | // {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","appName":"My app","description":"Ok" "msg":"Message 1"} | 
					
						
							|  |  |  |  | logger.info('Message 2') | 
					
						
							|  |  |  |  | // {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","appName":"My app","description":"Ok","msg":"Message 2"} | 
					
						
							|  |  |  |  | // Note: the second log contains "description":"Ok" text, even if it was not provided. | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If the `mixin` feature is being used merely to add static metadata to each log message, | 
					
						
							|  |  |  |  | then a [child logger ⇗](/docs/child-loggers.md) should be used instead. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="opt-mixin-merge-strategy"></a> | 
					
						
							|  |  |  |  | #### `mixinMergeStrategy` (Function):
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `undefined` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If provided, the `mixinMergeStrategy` function is called each time one of the active | 
					
						
							|  |  |  |  | logging methods is called. The first parameter is the value `mergeObject` or an empty object, | 
					
						
							|  |  |  |  | the second parameter is the value resulting from `mixin()` (* See [`mixin` option](#opt-mixin) or an empty object. | 
					
						
							|  |  |  |  | The function must synchronously return an object. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | // Default strategy, `mergeObject` has priority | 
					
						
							|  |  |  |  | const logger = pino({ | 
					
						
							|  |  |  |  |     mixin() { | 
					
						
							|  |  |  |  |         return { tag: 'docker' } | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     // mixinMergeStrategy(mergeObject, mixinObject) { | 
					
						
							|  |  |  |  |     //     return Object.assign(mixinMeta, mergeObject) | 
					
						
							|  |  |  |  |     // } | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | logger.info({ | 
					
						
							|  |  |  |  |   tag: 'local' | 
					
						
							|  |  |  |  | }, 'Message') | 
					
						
							|  |  |  |  | // {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","tag":"local","msg":"Message"} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | // Custom mutable strategy, `mixin` has priority | 
					
						
							|  |  |  |  | const logger = pino({ | 
					
						
							|  |  |  |  |     mixin() { | 
					
						
							|  |  |  |  |         return { tag: 'k8s' } | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     mixinMergeStrategy(mergeObject, mixinObject) { | 
					
						
							|  |  |  |  |         return Object.assign(mergeObject, mixinObject) | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | logger.info({ | 
					
						
							|  |  |  |  |     tag: 'local' | 
					
						
							|  |  |  |  | }, 'Message') | 
					
						
							|  |  |  |  | // {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","tag":"k8s","msg":"Message"} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | // Custom immutable strategy, `mixin` has priority | 
					
						
							|  |  |  |  | const logger = pino({ | 
					
						
							|  |  |  |  |     mixin() { | 
					
						
							|  |  |  |  |         return { tag: 'k8s' } | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     mixinMergeStrategy(mergeObject, mixinObject) { | 
					
						
							|  |  |  |  |         return Object.assign({}, mergeObject, mixinObject) | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | logger.info({ | 
					
						
							|  |  |  |  |     tag: 'local' | 
					
						
							|  |  |  |  | }, 'Message') | 
					
						
							|  |  |  |  | // {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","tag":"k8s","msg":"Message"} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="opt-redact"></a> | 
					
						
							|  |  |  |  | #### `redact` (Array | Object):
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `undefined` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | As an array, the `redact` option specifies paths that should | 
					
						
							|  |  |  |  | have their values redacted from any log output. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Each path must be a string using a syntax which corresponds to JavaScript dot and bracket notation. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If an object is supplied, three options can be specified: | 
					
						
							|  |  |  |  |   * `paths` (array): Required. An array of paths. See [redaction - Path Syntax ⇗](/docs/redaction.md#paths) for specifics. | 
					
						
							|  |  |  |  |   * `censor` (String|Function|Undefined): Optional. When supplied as a String the `censor` option will overwrite keys which are to be redacted. When set to `undefined` the key will be removed entirely from the object. | 
					
						
							|  |  |  |  |     The `censor` option may also be a mapping function. The (synchronous) mapping function has the signature `(value, path) => redactedValue` and is called with the unredacted `value` and `path` to the key being redacted, as an array. For example given a redaction path of `a.b.c` the `path` argument would be `['a', 'b', 'c']`. The value returned from the mapping function becomes the applied censor value. Default: `'[Redacted]'` | 
					
						
							|  |  |  |  |     value synchronously. | 
					
						
							|  |  |  |  |     Default: `'[Redacted]'` | 
					
						
							|  |  |  |  |   * `remove` (Boolean): Optional. Instead of censoring the value, remove both the key and the value. Default: `false` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | **WARNING**: Never allow user input to define redacted paths. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See the [redaction ⇗](/docs/redaction.md) documentation. | 
					
						
							|  |  |  |  | * See [fast-redact#caveat ⇗](https://github.com/davidmarkclements/fast-redact#caveat) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=opt-hooks></a> | 
					
						
							|  |  |  |  | #### `hooks` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | An object mapping to hook functions. Hook functions allow for customizing | 
					
						
							|  |  |  |  | internal logger operations. Hook functions ***must*** be synchronous functions. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="logmethod"></a> | 
					
						
							|  |  |  |  | ##### `logMethod`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Allows for manipulating the parameters passed to logger methods. The signature | 
					
						
							|  |  |  |  | for this hook is `logMethod (args, method, level) {}`, where `args` is an array | 
					
						
							|  |  |  |  | of the arguments that were passed to the log method and `method` is the log | 
					
						
							|  |  |  |  | method itself, `level` is the log level itself. This hook ***must*** invoke the | 
					
						
							|  |  |  |  | `method` function by using apply, like so: `method.apply(this, newArgumentsArray)`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | For example, Pino expects a binding object to be the first parameter with an | 
					
						
							|  |  |  |  | optional string message as the second parameter. Using this hook the parameters | 
					
						
							|  |  |  |  | can be flipped: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const hooks = { | 
					
						
							|  |  |  |  |   logMethod (inputArgs, method, level) { | 
					
						
							|  |  |  |  |     if (inputArgs.length >= 2) { | 
					
						
							|  |  |  |  |       const arg1 = inputArgs.shift() | 
					
						
							|  |  |  |  |       const arg2 = inputArgs.shift() | 
					
						
							|  |  |  |  |       return method.apply(this, [arg2, arg1, ...inputArgs]) | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     return method.apply(this, inputArgs) | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=opt-formatters></a> | 
					
						
							|  |  |  |  | #### `formatters` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | An object containing functions for formatting the shape of the log lines. | 
					
						
							|  |  |  |  | These functions should return a JSONifiable object and | 
					
						
							|  |  |  |  | should never throw. These functions allow for full customization of | 
					
						
							|  |  |  |  | the resulting log lines. For example, they can be used to change | 
					
						
							|  |  |  |  | the level key name or to enrich the default metadata. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### `level`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Changes the shape of the log level. The default shape is `{ level: number }`. | 
					
						
							|  |  |  |  | The function takes two arguments, the label of the level (e.g. `'info'`) | 
					
						
							|  |  |  |  | and the numeric value (e.g. `30`). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const formatters = { | 
					
						
							|  |  |  |  |   level (label, number) { | 
					
						
							|  |  |  |  |     return { level: number } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### `bindings`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Changes the shape of the bindings. The default shape is `{ pid, hostname }`. | 
					
						
							|  |  |  |  | The function takes a single argument, the bindings object. It will | 
					
						
							|  |  |  |  | be called every time a child logger is created. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const formatters = { | 
					
						
							|  |  |  |  |   bindings (bindings) { | 
					
						
							|  |  |  |  |     return { pid: bindings.pid, hostname: bindings.hostname } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### `log`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Changes the shape of the log object. This function will be called every time | 
					
						
							|  |  |  |  | one of the log methods (such as `.info`) is called. All arguments passed to the | 
					
						
							|  |  |  |  | log method, except the message, will be pass to this function. By default it does | 
					
						
							|  |  |  |  | not change the shape of the log object. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const formatters = { | 
					
						
							|  |  |  |  |   log (object) { | 
					
						
							|  |  |  |  |     return object | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=opt-serializers></a> | 
					
						
							|  |  |  |  | #### `serializers` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `{err: pino.stdSerializers.err}` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | An object containing functions for custom serialization of objects. | 
					
						
							|  |  |  |  | These functions should return an JSONifiable object and they | 
					
						
							|  |  |  |  | should never throw. When logging an object, each top-level property | 
					
						
							|  |  |  |  | matching the exact key of a serializer will be serialized using the defined serializer. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [pino.stdSerializers](#pino-stdserializers) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### `serializers[Symbol.for('pino.*')]` (Function) - DEPRECATED
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Use `formatters.log` instead. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `base` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `{pid: process.pid, hostname: os.hostname}` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Key-value object added as child logger to each log line. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Set to `undefined` to avoid adding `pid`, `hostname` properties to each log. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `enabled` (Boolean)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `true` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Set to `false` to disable logging. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `crlf` (Boolean)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `false` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Set to `true` to logs newline delimited JSON with `\r\n` instead of `\n`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=opt-timestamp></a> | 
					
						
							|  |  |  |  | #### `timestamp` (Boolean | Function)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `true` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Enables or disables the inclusion of a timestamp in the | 
					
						
							|  |  |  |  | log message. If a function is supplied, it must synchronously return a partial JSON string | 
					
						
							|  |  |  |  | representation of the time, e.g. `,"time":1493426328206` (which is the default). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If set to `false`, no timestamp will be included in the output. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | See [stdTimeFunctions](#pino-stdtimefunctions) for a set of available functions | 
					
						
							|  |  |  |  | for passing in as a value for this option. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Example: | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | timestamp: () => `,"time":"${new Date(Date.now()).toISOString()}"` | 
					
						
							|  |  |  |  | // which is equivalent to: | 
					
						
							|  |  |  |  | // timestamp: stdTimeFunctions.isoTime | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | **Caution**: attempting to format time in-process will significantly impact logging performance. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=opt-messagekey></a> | 
					
						
							|  |  |  |  | #### `messageKey` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `'msg'` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The string key for the 'message' in the JSON object. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=opt-nestedkey></a> | 
					
						
							|  |  |  |  | #### `nestedKey` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `null` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If there's a chance that objects being logged have properties that conflict with those from pino itself (`level`, `timestamp`, `pid`, etc) | 
					
						
							|  |  |  |  | and duplicate keys in your log records are undesirable, pino can be configured with a `nestedKey` option that causes any `object`s that are logged | 
					
						
							|  |  |  |  | to be placed under a key whose name is the value of `nestedKey`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | This way, when searching something like Kibana for values, one can consistently search under the configured `nestedKey` value instead of the root log record keys. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | For example, | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const logger = require('pino')({ | 
					
						
							|  |  |  |  |   nestedKey: 'payload' | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const thing = { level: 'hi', time: 'never', foo: 'bar'} // has pino-conflicting properties! | 
					
						
							|  |  |  |  | logger.info(thing) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // logs the following: | 
					
						
							|  |  |  |  | // {"level":30,"time":1578357790020,"pid":91736,"hostname":"x","payload":{"level":"hi","time":"never","foo":"bar"}} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | In this way, logged objects' properties don't conflict with pino's standard logging properties, | 
					
						
							|  |  |  |  | and searching for logged objects can start from a consistent path. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=prettyPrint></a> | 
					
						
							|  |  |  |  | #### `prettyPrint` (Boolean | Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `false` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Enables pretty printing log logs. This is intended for non-production | 
					
						
							|  |  |  |  | configurations. This may be set to a configuration object as outlined in the | 
					
						
							|  |  |  |  | [`pino-pretty` documentation](https://github.com/pinojs/pino-pretty). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The options object may additionally contain a `prettifier` property to define | 
					
						
							|  |  |  |  | which prettifier module to use. When not present, `prettifier` defaults to | 
					
						
							|  |  |  |  | `'pino-pretty'`. Regardless of the value, the specified prettifier module | 
					
						
							|  |  |  |  | must be installed as a separate dependency: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```sh | 
					
						
							|  |  |  |  | npm install pino-pretty | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="useLevelLabels"></a> | 
					
						
							|  |  |  |  | #### `useLevelLabels` (Boolean) - DEPRECATED
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Use `formatters.level` instead. This will be removed in v7. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="changeLevelName"></a> | 
					
						
							|  |  |  |  | #### `changeLevelName` (String) - DEPRECATED
 | 
					
						
							|  |  |  |  | Use `formatters.level` instead. This will be removed in v7. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="levelKey"></a> | 
					
						
							|  |  |  |  | #### `levelKey` (String) - DEPRECATED
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Use `formatters.level` instead. This will be removed in v7. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `browser` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Browser only, may have `asObject` and `write` keys. This option is separately | 
					
						
							|  |  |  |  | documented in the [Browser API ⇗](/docs/browser.md) documentation. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [Browser API ⇗](/docs/browser.md) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="destination"></a> | 
					
						
							|  |  |  |  | ### `destination` (SonicBoom | WritableStream | String | Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `pino.destination(1)` (STDOUT) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `destination` parameter, at a minimum must be an object with a `write` method. | 
					
						
							|  |  |  |  | An ordinary Node.js `stream` can be passed as the destination (such as the result | 
					
						
							|  |  |  |  | of `fs.createWriteStream`) but for peak log writing performance it is strongly | 
					
						
							|  |  |  |  | recommended to use `pino.destination` to create the destination stream. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | // pino.destination(1) by default | 
					
						
							|  |  |  |  | const stdoutLogger = require('pino')() | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // destination param may be in first position when no options: | 
					
						
							|  |  |  |  | const fileLogger = require('pino')( pino.destination('/log/path')) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // use the stderr file handle to log to stderr: | 
					
						
							|  |  |  |  | const opts = {name: 'my-logger'} | 
					
						
							|  |  |  |  | const stderrLogger = require('pino')(opts, pino.destination(2)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // automatic wrapping in pino.destination | 
					
						
							|  |  |  |  | const fileLogger = require('pino')('/log/path') | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // Asynchronous logging | 
					
						
							|  |  |  |  | const fileLogger = pino(pino.destination({ dest: '/log/path', sync: false })) | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | However, there are some special instances where `pino.destination` is not used as the default: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | + When something, e.g a process manager, has monkey-patched `process.stdout.write`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | In these cases `process.stdout` is used instead. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`pino.destination`](#pino-destination) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="metadata"></a> | 
					
						
							|  |  |  |  | #### `destination[Symbol.for('pino.metadata')]`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Default: `false` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Using the global symbol `Symbol.for('pino.metadata')` as a key on the `destination` parameter and | 
					
						
							|  |  |  |  | setting the key it to `true`, indicates that the following properties should be | 
					
						
							|  |  |  |  | set on the `destination` object after each log line is written: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * the last logging level as `destination.lastLevel` | 
					
						
							|  |  |  |  | * the last logging message as `destination.lastMsg` | 
					
						
							|  |  |  |  | * the last logging object as `destination.lastObj` | 
					
						
							|  |  |  |  | * the last time as `destination.lastTime`, which will be the partial string returned | 
					
						
							|  |  |  |  |   by the time function. | 
					
						
							|  |  |  |  | * the last logger instance as `destination.lastLogger` (to support child | 
					
						
							|  |  |  |  |   loggers) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | For a full reference for using `Symbol.for('pino.metadata')`, see the [`pino-multi-stream` ⇗](https://github.com/pinojs/pino-multi-stream) | 
					
						
							|  |  |  |  | module. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The following is a succinct usage example: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const dest = pino.destination('/dev/null') | 
					
						
							|  |  |  |  | dest[Symbol.for('pino.metadata')] = true | 
					
						
							|  |  |  |  | const logger = pino(dest) | 
					
						
							|  |  |  |  | logger.info({a: 1}, 'hi') | 
					
						
							|  |  |  |  | const { lastMsg, lastLevel, lastObj, lastTime} = dest | 
					
						
							|  |  |  |  | console.log( | 
					
						
							|  |  |  |  |   'Logged message "%s" at level %d with object %o at time %s', | 
					
						
							|  |  |  |  |   lastMsg, lastLevel, lastObj, lastTime | 
					
						
							|  |  |  |  | ) // Logged message "hi" at level 30 with object { a: 1 } at time 1531590545089 | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`pino-multi-stream` ⇗](https://github.com/pinojs/pino-multi-stream) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="logger"></a> | 
					
						
							|  |  |  |  | ## Logger Instance
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The logger instance is the object returned by the main exported | 
					
						
							|  |  |  |  | [`pino`](#export) function. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The primary purpose of the logger instance is to provide logging methods. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The default logging methods are `trace`, `debug`, `info`, `warn`, `error`, and `fatal`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Each logging method has the following signature: | 
					
						
							|  |  |  |  | `([mergingObject], [message], [...interpolationValues])`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The parameters are explained below using the `logger.info` method but the same applies to all logging methods. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### Logging Method Parameters
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id=mergingobject></a> | 
					
						
							|  |  |  |  | #### `mergingObject` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | An object can optionally be supplied as the first parameter. Each enumerable key and value | 
					
						
							|  |  |  |  | of the `mergingObject` is copied in to the JSON log line. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | logger.info({MIX: {IN: true}}) | 
					
						
							|  |  |  |  | // {"level":30,"time":1531254555820,"pid":55956,"hostname":"x","MIX":{"IN":true}} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="message"></a> | 
					
						
							|  |  |  |  | #### `message` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A `message` string can optionally be supplied as the first parameter, or | 
					
						
							|  |  |  |  | as the second parameter after supplying a `mergingObject`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | By default, the contents of the `message` parameter will be merged into the | 
					
						
							|  |  |  |  | JSON log line under the `msg` key: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | logger.info('hello world') | 
					
						
							|  |  |  |  | // {"level":30,"time":1531257112193,"msg":"hello world","pid":55956,"hostname":"x"} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `message` parameter takes precedence over the `mergedObject`. | 
					
						
							|  |  |  |  | That is, if a `mergedObject` contains a `msg` property, and a `message` parameter | 
					
						
							|  |  |  |  | is supplied in addition, the `msg` property in the output log will be the value of | 
					
						
							|  |  |  |  | the `message` parameter not the value of the `msg` property on the `mergedObject`. | 
					
						
							|  |  |  |  | See [Avoid Message Conflict](/docs/help.md#avoid-message-conflict) for information | 
					
						
							|  |  |  |  | on how to overcome this limitation. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `messageKey` option can be used at instantiation time to change the namespace | 
					
						
							|  |  |  |  | from `msg` to another string as preferred. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `message` string may contain a printf style string with support for | 
					
						
							|  |  |  |  | the following placeholders: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * `%s` – string placeholder | 
					
						
							|  |  |  |  | * `%d` – digit placeholder | 
					
						
							|  |  |  |  | * `%O`, `%o` and `%j` – object placeholder | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Values supplied as additional arguments to the logger method will | 
					
						
							|  |  |  |  | then be interpolated accordingly. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`messageKey` pino option](#opt-messagekey) | 
					
						
							|  |  |  |  | * See [`...interpolationValues` log method parameter](#interpolationvalues) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="interpolationvalues"></a> | 
					
						
							|  |  |  |  | #### `...interpolationValues` (Any)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | All arguments supplied after `message` are serialized and interpolated according | 
					
						
							|  |  |  |  | to any supplied printf-style placeholders (`%s`, `%d`, `%o`|`%O`|`%j`) to form | 
					
						
							|  |  |  |  | the final output `msg` value for the JSON log line. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | logger.info('%o hello %s', {worldly: 1}, 'world') | 
					
						
							|  |  |  |  | // {"level":30,"time":1531257826880,"msg":"{\"worldly\":1} hello world","pid":55956,"hostname":"x"} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Since pino v6, we do not automatically concatenate and cast to string | 
					
						
							|  |  |  |  | consecutive parameters: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | logger.info('hello', 'world') | 
					
						
							|  |  |  |  | // {"level":30,"time":1531257618044,"msg":"hello","pid":55956,"hostname":"x"} | 
					
						
							|  |  |  |  | // world is missing | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | However, it's possible to inject a hook to modify this behavior: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const pinoOptions = { | 
					
						
							|  |  |  |  |   hooks: { logMethod } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | function logMethod (args, method) { | 
					
						
							|  |  |  |  |   if (args.length === 2) { | 
					
						
							|  |  |  |  |     args[0] = `${args[0]} %j` | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   method.apply(this, args) | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const logger = pino(pinoOptions) | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`message` log method parameter](#message) | 
					
						
							|  |  |  |  | * See [`logMethod` hook](#logmethod) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="error-serialization"></a> | 
					
						
							|  |  |  |  | #### Errors
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Errors can be supplied as either the first parameter or if already using `mergingObject` then as the `err` property on the `mergingObject`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | > ## Note
 | 
					
						
							|  |  |  |  | > This section describes the default configuration. The error serializer can be
 | 
					
						
							|  |  |  |  | > mapped to a different key using the [`serializers`](#opt-serializers) option.
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | logger.info(new Error("test")) | 
					
						
							|  |  |  |  | // {"level":30,"time":1531257618044,"msg":"test","stack":"...","type":"Error","pid":55956,"hostname":"x"} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | logger.info({ err: new Error("test"), otherkey: 123 }, "some text") | 
					
						
							|  |  |  |  | // {"level":30,"time":1531257618044,"err":{"msg": "test", "stack":"...","type":"Error"},"msg":"some text","pid":55956,"hostname":"x","otherkey":123} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="trace"></a> | 
					
						
							|  |  |  |  | ### `logger.trace([mergingObject], [message], [...interpolationValues])`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Write a `'trace'` level log, if the configured [`level`](#level) allows for it. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`mergingObject` log method parameter](#mergingobject) | 
					
						
							|  |  |  |  | * See [`message` log method parameter](#message) | 
					
						
							|  |  |  |  | * See [`...interpolationValues` log method parameter](#interpolationvalues) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="debug"></a> | 
					
						
							|  |  |  |  | ### `logger.debug([mergingObject], [message], [...interpolationValues])`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Write a `'debug'` level log, if the configured `level` allows for it. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`mergingObject` log method parameter](#mergingobject) | 
					
						
							|  |  |  |  | * See [`message` log method parameter](#message) | 
					
						
							|  |  |  |  | * See [`...interpolationValues` log method parameter](#interpolationvalues) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="info"></a> | 
					
						
							|  |  |  |  | ### `logger.info([mergingObject], [message], [...interpolationValues])`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Write an `'info'` level log, if the configured `level` allows for it. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`mergingObject` log method parameter](#mergingobject) | 
					
						
							|  |  |  |  | * See [`message` log method parameter](#message) | 
					
						
							|  |  |  |  | * See [`...interpolationValues` log method parameter](#interpolationvalues) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="warn"></a> | 
					
						
							|  |  |  |  | ### `logger.warn([mergingObject], [message], [...interpolationValues])`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Write a `'warn'` level log, if the configured `level` allows for it. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`mergingObject` log method parameter](#mergingobject) | 
					
						
							|  |  |  |  | * See [`message` log method parameter](#message) | 
					
						
							|  |  |  |  | * See [`...interpolationValues` log method parameter](#interpolationvalues) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="error"></a> | 
					
						
							|  |  |  |  | ### `logger.error([mergingObject], [message], [...interpolationValues])`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Write a `'error'` level log, if the configured `level` allows for it. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`mergingObject` log method parameter](#mergingobject) | 
					
						
							|  |  |  |  | * See [`message` log method parameter](#message) | 
					
						
							|  |  |  |  | * See [`...interpolationValues` log method parameter](#interpolationvalues) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="fatal"></a> | 
					
						
							|  |  |  |  | ### `logger.fatal([mergingObject], [message], [...interpolationValues])`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Write a `'fatal'` level log, if the configured `level` allows for it. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Since `'fatal'` level messages are intended to be logged just prior to the process exiting the `fatal` | 
					
						
							|  |  |  |  | method will always sync flush the destination. | 
					
						
							|  |  |  |  | Therefore it's important not to misuse `fatal` since | 
					
						
							|  |  |  |  | it will cause performance overhead if used for any | 
					
						
							|  |  |  |  | other purpose than writing final log messages before | 
					
						
							|  |  |  |  | the process crashes or exits. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`mergingObject` log method parameter](#mergingobject) | 
					
						
							|  |  |  |  | * See [`message` log method parameter](#message) | 
					
						
							|  |  |  |  | * See [`...interpolationValues` log method parameter](#interpolationvalues) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="silent"><a> | 
					
						
							|  |  |  |  | ### `logger.silent()`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Noop function. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="child"></a> | 
					
						
							|  |  |  |  | ### `logger.child(bindings, [options]) => logger`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `logger.child` method allows for the creation of stateful loggers, | 
					
						
							|  |  |  |  | where key-value pairs can be pinned to a logger causing them to be output | 
					
						
							|  |  |  |  | on every log line. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Child loggers use the same output stream as the parent and inherit | 
					
						
							|  |  |  |  | the current log level of the parent at the time they are spawned. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The log level of a child is mutable. It can be set independently | 
					
						
							|  |  |  |  | of the parent either by setting the [`level`](#level) accessor after creating | 
					
						
							|  |  |  |  | the child logger or using the reserved [`bindings.level`](#bindingslevel-string) key. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `bindings` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | An object of key-value pairs to include in every log line output | 
					
						
							|  |  |  |  | via the returned child logger. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const child = logger.child({ MIX: {IN: 'always'} }) | 
					
						
							|  |  |  |  | child.info('hello') | 
					
						
							|  |  |  |  | // {"level":30,"time":1531258616689,"msg":"hello","pid":64849,"hostname":"x","MIX":{"IN":"always"}} | 
					
						
							|  |  |  |  | child.info('child!') | 
					
						
							|  |  |  |  | // {"level":30,"time":1531258617401,"msg":"child!","pid":64849,"hostname":"x","MIX":{"IN":"always"}} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `bindings` object may contain any key except for reserved configuration keys `level` and `serializers`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### `bindings.level` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | If a `level` property is present in the `bindings` object passed to `logger.child` | 
					
						
							|  |  |  |  | it will override the child logger level. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const logger = pino() | 
					
						
							|  |  |  |  | logger.debug('nope') // will not log, since default level is info | 
					
						
							|  |  |  |  | const child = logger.child({foo: 'bar', level: 'debug'}) | 
					
						
							|  |  |  |  | child.debug('debug!') // will log as the `level` property set the level to debug | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### `bindings.serializers` (Object) - DEPRECATED
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Use `options.serializers` instead. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `options` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Options for child logger. These options will override the parent logger options. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### `options.redact` (Array | Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Setting `options.redact` to an array or object will override the parent `redact` options. To remove `redact` options inherited from the parent logger set this value as an empty array (`[]`). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const logger = require('pino')({ redact: ['hello'] }) | 
					
						
							|  |  |  |  | logger.info({ hello: 'world' }) | 
					
						
							|  |  |  |  | // {"level":30,"time":1625794363403,"pid":67930,"hostname":"x","hello":"[Redacted]"} | 
					
						
							|  |  |  |  | const child = logger.child({ foo: 'bar' }, { redact: ['foo'] }) | 
					
						
							|  |  |  |  | logger.info({ hello: 'world' }) | 
					
						
							|  |  |  |  | // {"level":30,"time":1625794553558,"pid":67930,"hostname":"x","hello":"world", "foo": "[Redacted]" } | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`redact` option](#opt-redact) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### `options.serializers` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Child loggers inherit the [serializers](#opt-serializers) from the parent logger. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Setting the `serializers` key of the `options` object will override | 
					
						
							|  |  |  |  | any configured parent serializers. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const logger = require('pino')() | 
					
						
							|  |  |  |  | logger.info({test: 'will appear'}) | 
					
						
							|  |  |  |  | // {"level":30,"time":1531259759482,"pid":67930,"hostname":"x","test":"will appear"} | 
					
						
							|  |  |  |  | const child = logger.child({}, {serializers: {test: () => `child-only serializer`}}) | 
					
						
							|  |  |  |  | child.info({test: 'will be overwritten'}) | 
					
						
							|  |  |  |  | // {"level":30,"time":1531259784008,"pid":67930,"hostname":"x","test":"child-only serializer"} | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`serializers` option](#opt-serializers) | 
					
						
							|  |  |  |  | * See [pino.stdSerializers](#pino-stdSerializers) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="bindings"></a> | 
					
						
							|  |  |  |  | ### `logger.bindings()`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Returns an object containing all the current bindings, cloned from the ones passed in via `logger.child()`. | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const child = logger.child({ foo: 'bar' }) | 
					
						
							|  |  |  |  | console.log(child.bindings()) | 
					
						
							|  |  |  |  | // { foo: 'bar' } | 
					
						
							|  |  |  |  | const anotherChild = child.child({ MIX: { IN: 'always' } }) | 
					
						
							|  |  |  |  | console.log(anotherChild.bindings()) | 
					
						
							|  |  |  |  | // { foo: 'bar', MIX: { IN: 'always' } } | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="flush"></a> | 
					
						
							|  |  |  |  | ### `logger.flush()`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Flushes the content of the buffer when using `pino.destination({ | 
					
						
							|  |  |  |  | sync: false })`. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | This is an asynchronous, fire and forget, operation. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The use case is primarily for asynchronous logging, which may buffer | 
					
						
							|  |  |  |  | log lines while others are being written. The `logger.flush` method can be | 
					
						
							|  |  |  |  | used to flush the logs | 
					
						
							|  |  |  |  | on a long interval, say ten seconds. Such a strategy can provide an | 
					
						
							|  |  |  |  | optimum balance between extremely efficient logging at high demand periods | 
					
						
							|  |  |  |  | and safer logging at low demand periods. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`destination` parameter](#destination) | 
					
						
							|  |  |  |  | * See [Asynchronous Logging ⇗](/docs/asynchronous.md) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="logger-level"></a> | 
					
						
							|  |  |  |  | ### `logger.level` (String) [Getter/Setter]
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Set this property to the desired logging level. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The core levels and their values are as follows: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | |            |       |       |      |      |       |       |          | | 
					
						
							|  |  |  |  | |:-----------|-------|-------|------|------|-------|-------|---------:| | 
					
						
							|  |  |  |  | | **Level:** | trace | debug | info | warn | error | fatal | silent   | | 
					
						
							|  |  |  |  | | **Value:** | 10    | 20    | 30   | 40   | 50    | 60    | Infinity | | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The logging level is a *minimum* level based on the associated value of that level. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | For instance if `logger.level` is `info` *(30)* then `info` *(30)*, `warn` *(40)*, `error` *(50)* and `fatal` *(60)* log methods will be enabled but the `trace` *(10)* and `debug` *(20)* methods, being less than 30, will not. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `silent` logging level is a specialized level which will disable all logging, | 
					
						
							|  |  |  |  | the `silent` log method is a noop function. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="islevelenabled"></a> | 
					
						
							|  |  |  |  | ### `logger.isLevelEnabled(level)`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A utility method for determining if a given log level will write to the destination. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `level` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The given level to check against: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | if (logger.isLevelEnabled('debug')) logger.debug('conditional log') | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `levelLabel` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Defines the method name of the new level. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`logger.level`](#level) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `levelValue` (Number)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Defines the associated minimum threshold value for the level, and | 
					
						
							|  |  |  |  | therefore where it sits in order of priority among other levels. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`logger.level`](#level) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="levelVal"></a> | 
					
						
							|  |  |  |  | ### `logger.levelVal` (Number)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Supplies the integer value for the current logging level. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | if (logger.levelVal === 30) { | 
					
						
							|  |  |  |  |   console.log('logger level is `info`') | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="levels"></a> | 
					
						
							|  |  |  |  | ### `logger.levels` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Levels are mapped to values to determine the minimum threshold that a | 
					
						
							|  |  |  |  | logging method should be enabled at (see [`logger.level`](#level)). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `logger.levels` property holds the mappings between levels and values, | 
					
						
							|  |  |  |  | and vice versa. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```sh | 
					
						
							|  |  |  |  | $ node -p "require('pino')().levels" | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | { labels: | 
					
						
							|  |  |  |  |    { '10': 'trace', | 
					
						
							|  |  |  |  |      '20': 'debug', | 
					
						
							|  |  |  |  |      '30': 'info', | 
					
						
							|  |  |  |  |      '40': 'warn', | 
					
						
							|  |  |  |  |      '50': 'error', | 
					
						
							|  |  |  |  |      '60': 'fatal' }, | 
					
						
							|  |  |  |  |   values: | 
					
						
							|  |  |  |  |    { fatal: 60, error: 50, warn: 40, info: 30, debug: 20, trace: 10 } } | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`logger.level`](#level) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="serializers"></a> | 
					
						
							|  |  |  |  | ### logger\[Symbol.for('pino.serializers')\]
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Returns the serializers as applied to the current logger instance. If a child logger did not | 
					
						
							|  |  |  |  | register it's own serializer upon instantiation the serializers of the parent will be returned. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="level-change"></a> | 
					
						
							|  |  |  |  | ### Event: 'level-change'
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The logger instance is also an [`EventEmitter ⇗`](https://nodejs.org/dist/latest/docs/api/events.html#events_class_eventemitter) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A listener function can be attached to a logger via the `level-change` event | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The listener is passed four arguments: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * `levelLabel` – the new level string, e.g `trace` | 
					
						
							|  |  |  |  | * `levelValue` – the new level number, e.g `10` | 
					
						
							|  |  |  |  | * `previousLevelLabel` – the prior level string, e.g `info` | 
					
						
							|  |  |  |  | * `previousLevelValue` – the prior level numbebr, e.g `30` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const logger = require('pino')() | 
					
						
							|  |  |  |  | logger.on('level-change', (lvl, val, prevLvl, prevVal) => { | 
					
						
							|  |  |  |  |   console.log('%s (%d) was changed to %s (%d)', prevLvl, prevVal, lvl, val) | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | logger.level = 'trace' // trigger event | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Please note that due to a [known bug](https://github.com/pinojs/pino/issues/1006), every `logger.child()` call will | 
					
						
							|  |  |  |  | fire a `level-change` event. These events can be ignored by writing an event handler like: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const logger = require('pino')() | 
					
						
							|  |  |  |  | logger.on('level-change', function (lvl, val, prevLvl, prevVal) { | 
					
						
							|  |  |  |  |   if (logger !== this) { | 
					
						
							|  |  |  |  |     return | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   console.log('%s (%d) was changed to %s (%d)', prevLvl, prevVal, lvl, val) | 
					
						
							|  |  |  |  | }) | 
					
						
							|  |  |  |  | logger.child({}); // trigger an event by creating a child instance, notice no console.log | 
					
						
							|  |  |  |  | logger.level = 'trace' // trigger event using actual value change, notice console.log | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="version"></a> | 
					
						
							|  |  |  |  | ### `logger.version` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Exposes the Pino package version. Also available on the exported `pino` function. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`pino.version`](#pino-version) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ## Statics
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="pino-destination"></a> | 
					
						
							|  |  |  |  | ### `pino.destination([opts]) => SonicBoom`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Create a Pino Destination instance: a stream-like object with | 
					
						
							|  |  |  |  | significantly more throughput (over 30%) than a standard Node.js stream. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | const pino = require('pino') | 
					
						
							|  |  |  |  | const logger = pino(pino.destination('./my-file')) | 
					
						
							|  |  |  |  | const logger2 = pino(pino.destination()) | 
					
						
							|  |  |  |  | const logger3 = pino(pino.destination({ | 
					
						
							|  |  |  |  |   dest: './my-file', | 
					
						
							|  |  |  |  |   minLength: 4096, // Buffer before writing | 
					
						
							|  |  |  |  |   sync: false // Asynchronous logging | 
					
						
							|  |  |  |  | })) | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `pino.destination` method may be passed a file path or a numerical file descriptor. | 
					
						
							|  |  |  |  | By default, `pino.destination` will use `process.stdout.fd` (1) as the file descriptor. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | `pino.destination` is implemented on [`sonic-boom` ⇗](https://github.com/mcollina/sonic-boom). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | A `pino.destination` instance can also be used to reopen closed files | 
					
						
							|  |  |  |  | (for example, for some log rotation scenarios), see [Reopening log files](/docs/help.md#reopening). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`destination` parameter](#destination) | 
					
						
							|  |  |  |  | * See [`sonic-boom` ⇗](https://github.com/mcollina/sonic-boom) | 
					
						
							|  |  |  |  | * See [Reopening log files](/docs/help.md#reopening) | 
					
						
							|  |  |  |  | * See [Asynchronous Logging ⇗](/docs/asynchronous.md) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="pino-final"></a> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### `pino.final(logger, [handler]) => Function | FinalLogger`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `pino.final` method can be used to acquire a final logger instance | 
					
						
							|  |  |  |  | or create an exit listener function. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `finalLogger` is a specialist logger that synchronously flushes | 
					
						
							|  |  |  |  | on every write. This is important to guarantee final log writes, | 
					
						
							|  |  |  |  | when using `pino.destination({ sync: false })` target. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Since final log writes cannot be guaranteed with normal Node.js streams, | 
					
						
							|  |  |  |  | if the `destination` parameter of the `logger` supplied to `pino.final` | 
					
						
							|  |  |  |  | is a Node.js stream `pino.final` will throw. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The use of `pino.final` with `pino.destination` is not needed, as | 
					
						
							|  |  |  |  | `pino.destination` writes things synchronously. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `pino.final(logger, handler) => Function`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | In this case the `pino.final` method supplies an exit listener function that can be | 
					
						
							|  |  |  |  | supplied to process exit events such as `exit`, `uncaughtException`, | 
					
						
							|  |  |  |  | `SIGHUP` and so on. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The exit listener function will call the supplied `handler` function | 
					
						
							|  |  |  |  | with an error object (or else `null`), a `finalLogger` instance followed | 
					
						
							|  |  |  |  | by any additional arguments the `handler` may be called with. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | process.on('uncaughtException', pino.final(logger, (err, finalLogger) => { | 
					
						
							|  |  |  |  |   finalLogger.error(err, 'uncaughtException') | 
					
						
							|  |  |  |  |   process.exit(1) | 
					
						
							|  |  |  |  | })) | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### `pino.final(logger) => FinalLogger`
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | In this case the `pino.final` method returns a finalLogger instance. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```js | 
					
						
							|  |  |  |  | var finalLogger = pino.final(logger) | 
					
						
							|  |  |  |  | finalLogger.info('exiting...') | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`destination` parameter](#destination) | 
					
						
							|  |  |  |  | * See [Exit logging help](/docs/help.md#exit-logging) | 
					
						
							|  |  |  |  | * See [Asynchronous logging ⇗](/docs/asynchronous.md) | 
					
						
							|  |  |  |  | * See [Log loss prevention ⇗](/docs/asynchronous.md#log-loss-prevention) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="pino-stdserializers"></a> | 
					
						
							|  |  |  |  | ### `pino.stdSerializers` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `pino.stdSerializers` object provides functions for serializing objects common to many projects. The standard serializers are directly imported from [pino-std-serializers](https://github.com/pinojs/pino-std-serializers). | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [pino-std-serializers ⇗](https://github.com/pinojs/pino-std-serializers) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="pino-stdtimefunctions"></a> | 
					
						
							|  |  |  |  | ### `pino.stdTimeFunctions` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The [`timestamp`](#opt-timestamp) option can accept a function which determines the | 
					
						
							|  |  |  |  | `timestamp` value in a log line. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `pino.stdTimeFunctions` object provides a very small set of common functions for generating the | 
					
						
							|  |  |  |  | `timestamp` property. These consist of the following | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * `pino.stdTimeFunctions.epochTime`: Milliseconds since Unix epoch (Default) | 
					
						
							|  |  |  |  | * `pino.stdTimeFunctions.unixTime`: Seconds since Unix epoch | 
					
						
							|  |  |  |  | * `pino.stdTimeFunctions.nullTime`: Clears timestamp property (Used when `timestamp: false`) | 
					
						
							|  |  |  |  | * `pino.stdTimeFunctions.isoTime`: ISO 8601-formatted time in UTC | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`timestamp` option](#opt-timestamp) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="pino-symbols"></a> | 
					
						
							|  |  |  |  | ### `pino.symbols` (Object)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | For integration purposes with ecosystem and third party libraries `pino.symbols` | 
					
						
							|  |  |  |  | exposes the symbols used to hold non-public state and methods on the logger instance. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Access to the symbols allows logger state to be adjusted, and methods to be overridden or | 
					
						
							|  |  |  |  | proxied for performant integration where necessary. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | The `pino.symbols` object is intended for library implementers and shouldn't be utilized | 
					
						
							|  |  |  |  | for general use. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a id="pino-version"></a> | 
					
						
							|  |  |  |  | ### `pino.version` (String)
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Exposes the Pino package version. Also available on the logger instance. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * See [`logger.version`](#version) |