update
This commit is contained in:
parent
d9becc67b6
commit
9308795b8b
964 changed files with 104265 additions and 16 deletions
868
node_modules/pino/docs/api.md
generated
vendored
Normal file
868
node_modules/pino/docs/api.md
generated
vendored
Normal file
|
@ -0,0 +1,868 @@
|
|||
# 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.child()](#child)
|
||||
* [logger.bindings()](#bindings)
|
||||
* [logger.flush()](#flush)
|
||||
* [logger.level](#level)
|
||||
* [logger.isLevelEnabled()](#islevelenabled)
|
||||
* [logger.levels](#levels)
|
||||
* [logger\[Symbol.for('pino.serializers')\]](#serializers)
|
||||
* [Event: 'level-change'](#level-change)
|
||||
* [logger.version](#version)
|
||||
* [logger.LOG_VERSION](#log_version)
|
||||
* [Statics](#statics)
|
||||
* [pino.destination()](#pino-destination)
|
||||
* [pino.extreme()](#pino-extreme)
|
||||
* [pino.final()](#pino-final)
|
||||
* [pino.stdSerializers](#pino-stdserializers)
|
||||
* [pino.stdTimeFunctions](#pino-stdtimefunctions)
|
||||
* [pino.symbols](#pino-symbols)
|
||||
* [pino.version](#pino-version)
|
||||
* [pino.LOG_VERSION](#pino-LOG_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
|
||||
```
|
||||
|
||||
#### `mixin` (Function):
|
||||
|
||||
Default: `undefined`
|
||||
|
||||
If provided, the `mixin` function is called each time one of the active
|
||||
logging methods is called. 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","v":1}
|
||||
logger.info('world')
|
||||
// {"level":30,"time":1573664685469,"pid":78742,"hostname":"x","line":2,"msg":"world","v":1}
|
||||
```
|
||||
|
||||
#### `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 the key will be removed entirely from the object.
|
||||
The `censor` option may also be a mapping function. The (synchronous) mapping function is called with the unredacted value. 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 ⇗](http://github.com/davidmarkclements/fast-redact#caveat)
|
||||
|
||||
<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)
|
||||
|
||||
Default: `undefined`
|
||||
|
||||
The `serializers` object may contain a key which is the global symbol: `Symbol.for('pino.*')`.
|
||||
This will act upon the complete log object rather than corresponding to a particular key.
|
||||
|
||||
#### `base` (Object)
|
||||
|
||||
Default: `{pid: process.pid, hostname: os.hostname}`
|
||||
|
||||
Key-value object added as child logger to each log line.
|
||||
|
||||
Set to `null` to avoid adding `pid`, `hostname` and `name` 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 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.
|
||||
|
||||
**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`, `v`, `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"},"v":1}
|
||||
```
|
||||
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)
|
||||
|
||||
Default: `false`
|
||||
|
||||
Enables printing of level labels instead of level values in the printed logs.
|
||||
Warning: this option may not be supported by downstream transports.
|
||||
|
||||
<a id="changeLevelName"></a>
|
||||
#### `changeLevelName` (String) - DEPRECATED
|
||||
Use `levelKey` instead. This will be removed in v7.
|
||||
|
||||
<a id="levelKey"></a>
|
||||
#### `levelKey` (String)
|
||||
|
||||
Default: `'level'`
|
||||
|
||||
Changes the property `level` to any string value you pass in:
|
||||
```js
|
||||
const logger = pino({
|
||||
levelKey: 'priority'
|
||||
})
|
||||
logger.info('hello world')
|
||||
// {"priority":30,"time":1531257112193,"msg":"hello world","pid":55956,"hostname":"x","v":1}
|
||||
```
|
||||
|
||||
#### `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)
|
||||
|
||||
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` or `pino.extreme` 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')
|
||||
```
|
||||
|
||||
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)
|
||||
* See [`pino.extreme`](#pino-extreme)
|
||||
|
||||
<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},"v":1}
|
||||
```
|
||||
|
||||
<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","v":1}
|
||||
```
|
||||
|
||||
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`.
|
||||
|
||||
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`)
|
||||
or else concatenated together with the `message` string to form the final
|
||||
output `msg` value for the JSON log line.
|
||||
|
||||
```js
|
||||
logger.info('hello', 'world')
|
||||
// {"level":30,"time":1531257618044,"msg":"hello world","pid":55956,"hostname":"x","v":1}
|
||||
```
|
||||
|
||||
```js
|
||||
logger.info('hello', {worldly: 1})
|
||||
// {"level":30,"time":1531257797727,"msg":"hello {\"worldly\":1}","pid":55956,"hostname":"x","v":1}
|
||||
```
|
||||
|
||||
```js
|
||||
logger.info('%o hello', {worldly: 1})
|
||||
// {"level":30,"time":1531257826880,"msg":"{\"worldly\":1} hello","pid":55956,"hostname":"x","v":1}
|
||||
```
|
||||
|
||||
* See [`message` log method parameter](#message)
|
||||
|
||||
<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="child"></a>
|
||||
### `logger.child(bindings) => 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"},"v":1}
|
||||
child.info('child!')
|
||||
// {"level":30,"time":1531258617401,"msg":"child!","pid":64849,"hostname":"x","MIX":{"IN":"always"},"v":1}
|
||||
```
|
||||
|
||||
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)
|
||||
|
||||
Child loggers inherit the [serializers](#opt-serializers) from the parent logger.
|
||||
|
||||
Setting the `serializers` key of the `bindings` 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","v":1}
|
||||
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","v":1}
|
||||
```
|
||||
|
||||
* 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 a `pino.extreme` destination.
|
||||
|
||||
This is an asynchronous, fire and forget, operation.
|
||||
|
||||
The use case is primarily for Extreme mode logging, which may hold up to
|
||||
4KiB of logs. The `logger.flush` method can be used to flush the logs
|
||||
on an long interval, say ten seconds. Such a strategy can provide an
|
||||
optimium balance between extremely efficient logging at high demand periods
|
||||
and safer logging at low demand periods.
|
||||
|
||||
* See [`pino.extreme`](#pino-extreme)
|
||||
* See [`destination` parameter](#destination)
|
||||
* See [Extreme mode ⇗](/docs/extreme.md)
|
||||
|
||||
<a id="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,
|
||||
there is no `silent` log method.
|
||||
|
||||
<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)', lvl, val, prevLvl, prevVal)
|
||||
})
|
||||
logger.level = 'trace' // trigger event
|
||||
```
|
||||
|
||||
<a id="version"></a>
|
||||
### `logger.version` (String)
|
||||
|
||||
Exposes the Pino package version. Also available on the exported `pino` function.
|
||||
|
||||
* See [`pino.version`](#pino-version)
|
||||
|
||||
<a id="log_version"></a>
|
||||
### `logger.LOG_VERSION` (Number)
|
||||
|
||||
Holds the current log format version as output in the `v` property of each log record.
|
||||
Also available on the exported `pino` function.
|
||||
|
||||
* See [`pino.LOG_VERSION`](#pino-LOG_VERSION)
|
||||
|
||||
## Statics
|
||||
|
||||
<a id="pino-destination"></a>
|
||||
### `pino.destination([target]) => 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())
|
||||
```
|
||||
|
||||
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)
|
||||
|
||||
<a id="pino-extreme"></a>
|
||||
### `pino.extreme([target]) => SonicBoom`
|
||||
|
||||
Create an extreme mode destination. This yields an additional 60% performance boost.
|
||||
There are trade-offs that should be understood before usage.
|
||||
|
||||
```js
|
||||
const pino = require('pino')
|
||||
const logger = pino(pino.extreme('./my-file'))
|
||||
const logger2 = pino(pino.extreme())
|
||||
```
|
||||
|
||||
The `pino.extreme` method may be passed a file path or a numerical file descriptor.
|
||||
By default, `pino.extreme` will use `process.stdout.fd` (1) as the file descriptor.
|
||||
|
||||
`pino.extreme` is implemented with the [`sonic-boom` ⇗](https://github.com/mcollina/sonic-boom)
|
||||
module.
|
||||
|
||||
A `pino.extreme` instance can also be used to reopen closed files
|
||||
(for example, for some log rotation scenarios), see [Reopening log files](/docs/help.md#reopening).
|
||||
|
||||
On AWS Lambda we recommend to call `extreme.flushSync()` at the end
|
||||
of each function execution to avoid losing data.
|
||||
|
||||
* See [`destination` parameter](#destination)
|
||||
* See [`sonic-boom` ⇗](https://github.com/mcollina/sonic-boom)
|
||||
* See [Extreme mode ⇗](/docs/extreme.md)
|
||||
* See [Reopening log files](/docs/help.md#reopening)
|
||||
|
||||
<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,
|
||||
both when using `pino.extreme` 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 [Extreme mode ⇗](/docs/extreme.md)
|
||||
* See [Log loss prevention ⇗](/docs/extreme.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)
|
||||
|
||||
<a id="pino-log_version"></a>
|
||||
### `pino.LOG_VERSION` (Number)
|
||||
|
||||
Holds the current log format version as output in the `v` property of each log record. Also available on the logger instance.
|
||||
|
||||
* See [`logger.LOG_VERSION`](#log_version)
|
58
node_modules/pino/docs/benchmarks.md
generated
vendored
Normal file
58
node_modules/pino/docs/benchmarks.md
generated
vendored
Normal file
|
@ -0,0 +1,58 @@
|
|||
# Benchmarks
|
||||
|
||||
`pino.info('hello world')`:
|
||||
|
||||
```
|
||||
BASIC benchmark averages
|
||||
Bunyan average: 549.042ms
|
||||
Winston average: 467.873ms
|
||||
Bole average: 201.529ms
|
||||
Debug average: 253.724ms
|
||||
LogLevel average: 282.653ms
|
||||
Pino average: 188.956ms
|
||||
PinoExtreme average: 108.809ms
|
||||
```
|
||||
|
||||
`pino.info({'hello': 'world'})`:
|
||||
|
||||
```
|
||||
OBJECT benchmark averages
|
||||
BunyanObj average: 564.363ms
|
||||
WinstonObj average: 464.824ms
|
||||
BoleObj average: 230.220ms
|
||||
LogLevelObject average: 474.857ms
|
||||
PinoObj average: 201.442ms
|
||||
PinoUnsafeObj average: 202.687ms
|
||||
PinoExtremeObj average: 108.689ms
|
||||
PinoUnsafeExtremeObj average: 106.718ms
|
||||
```
|
||||
|
||||
`pino.info(aBigDeeplyNestedObject)`:
|
||||
|
||||
```
|
||||
DEEPOBJECT benchmark averages
|
||||
BunyanDeepObj average: 5293.279ms
|
||||
WinstonDeepObj average: 9020.292ms
|
||||
BoleDeepObj average: 9169.043ms
|
||||
LogLevelDeepObj average: 15260.917ms
|
||||
PinoDeepObj average: 8467.807ms
|
||||
PinoUnsafeDeepObj average: 6159.227ms
|
||||
PinoExtremeDeepObj average: 8354.557ms
|
||||
PinoUnsafeExtremeDeepObj average: 6214.073ms
|
||||
```
|
||||
|
||||
`pino.info('hello %s %j %d', 'world', {obj: true}, 4, {another: 'obj'})`:
|
||||
|
||||
```
|
||||
BunyanInterpolateExtra average: 778.408ms
|
||||
WinstonInterpolateExtra average: 627.956ms
|
||||
BoleInterpolateExtra average: 429.757ms
|
||||
PinoInterpolateExtra average: 316.043ms
|
||||
PinoUnsafeInterpolateExtra average: 316.809ms
|
||||
PinoExtremeInterpolateExtra average: 218.468ms
|
||||
PinoUnsafeExtremeInterpolateExtra average: 215.040ms
|
||||
```
|
||||
|
||||
For a fair comparison, [LogLevel](http://npm.im/loglevel) was extended
|
||||
to include a timestamp and [bole](http://npm.im/bole) had
|
||||
`fastTime` mode switched on.
|
199
node_modules/pino/docs/browser.md
generated
vendored
Normal file
199
node_modules/pino/docs/browser.md
generated
vendored
Normal file
|
@ -0,0 +1,199 @@
|
|||
# Browser API
|
||||
|
||||
Pino is compatible with [`browserify`](http://npm.im/browserify) for browser side usage:
|
||||
|
||||
This can be useful with isomorphic/universal JavaScript code.
|
||||
|
||||
By default, in the browser,
|
||||
`pino` uses corresponding [Log4j](https://en.wikipedia.org/wiki/Log4j) `console` methods (`console.error`, `console.warn`, `console.info`, `console.debug`, `console.trace`) and uses `console.error` for any `fatal` level logs.
|
||||
|
||||
## Options
|
||||
|
||||
Pino can be passed a `browser` object in the options object,
|
||||
which can have the following properties:
|
||||
|
||||
### `asObject` (Boolean)
|
||||
|
||||
```js
|
||||
const pino = require('pino')({browser: {asObject: true}})
|
||||
```
|
||||
|
||||
The `asObject` option will create a pino-like log object instead of
|
||||
passing all arguments to a console method, for instance:
|
||||
|
||||
```js
|
||||
pino.info('hi') // creates and logs {msg: 'hi', level: 30, time: <ts>}
|
||||
```
|
||||
|
||||
When `write` is set, `asObject` will always be `true`.
|
||||
|
||||
### `write` (Function | Object)
|
||||
|
||||
Instead of passing log messages to `console.log` they can be passed to
|
||||
a supplied function.
|
||||
|
||||
If `write` is set to a single function, all logging objects are passed
|
||||
to this function.
|
||||
|
||||
```js
|
||||
const pino = require('pino')({
|
||||
browser: {
|
||||
write: (o) => {
|
||||
// do something with o
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
If `write` is an object, it can have methods that correspond to the
|
||||
levels. When a message is logged at a given level, the corresponding
|
||||
method is called. If a method isn't present, the logging falls back
|
||||
to using the `console`.
|
||||
|
||||
|
||||
```js
|
||||
const pino = require('pino')({
|
||||
browser: {
|
||||
write: {
|
||||
info: function (o) {
|
||||
//process info log object
|
||||
},
|
||||
error: function (o) {
|
||||
//process error log object
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### `serialize`: (Boolean | Array)
|
||||
|
||||
The serializers provided to `pino` are ignored by default in the browser, including
|
||||
the standard serializers provided with Pino. Since the default destination for log
|
||||
messages is the console, values such as `Error` objects are enhanced for inspection,
|
||||
which they otherwise wouldn't be if the Error serializer was enabled.
|
||||
|
||||
We can turn all serializers on,
|
||||
|
||||
```js
|
||||
const pino = require('pino')({
|
||||
browser: {
|
||||
serialize: true
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
Or we can selectively enable them via an array:
|
||||
|
||||
```js
|
||||
const pino = require('pino')({
|
||||
serializers: {
|
||||
custom: myCustomSerializer,
|
||||
another: anotherSerializer
|
||||
},
|
||||
browser: {
|
||||
serialize: ['custom']
|
||||
}
|
||||
})
|
||||
// following will apply myCustomSerializer to the custom property,
|
||||
// but will not apply anotherSerializer to another key
|
||||
pino.info({custom: 'a', another: 'b'})
|
||||
```
|
||||
|
||||
When `serialize` is `true` the standard error serializer is also enabled (see https://github.com/pinojs/pino/blob/master/docs/api.md#stdSerializers).
|
||||
This is a global serializer which will apply to any `Error` objects passed to the logger methods.
|
||||
|
||||
If `serialize` is an array the standard error serializer is also automatically enabled, it can
|
||||
be explicitly disabled by including a string in the serialize array: `!stdSerializers.err`, like so:
|
||||
|
||||
```js
|
||||
const pino = require('pino')({
|
||||
serializers: {
|
||||
custom: myCustomSerializer,
|
||||
another: anotherSerializer
|
||||
},
|
||||
browser: {
|
||||
serialize: ['!stdSerializers.err', 'custom'] //will not serialize Errors, will serialize `custom` keys
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
The `serialize` array also applies to any child logger serializers (see https://github.com/pinojs/pino/blob/master/docs/api.md#discussion-2
|
||||
for how to set child-bound serializers).
|
||||
|
||||
Unlike server pino the serializers apply to every object passed to the logger method,
|
||||
if the `asObject` option is `true`, this results in the serializers applying to the
|
||||
first object (as in server pino).
|
||||
|
||||
For more info on serializers see https://github.com/pinojs/pino/blob/master/docs/api.md#parameters.
|
||||
|
||||
### `transmit` (Object)
|
||||
|
||||
An object with `send` and `level` properties.
|
||||
|
||||
The `transmit.level` property specifies the minimum level (inclusive) of when the `send` function
|
||||
should be called, if not supplied the `send` function be called based on the main logging `level`
|
||||
(set via `options.level`, defaulting to `info`).
|
||||
|
||||
The `transmit` object must have a `send` function which will be called after
|
||||
writing the log message. The `send` function is passed the level of the log
|
||||
message and a `logEvent` object.
|
||||
|
||||
The `logEvent` object is a data structure representing a log message, it represents
|
||||
the arguments passed to a logger statement, the level
|
||||
at which they were logged and the hierarchy of child bindings.
|
||||
|
||||
The `logEvent` format is structured like so:
|
||||
|
||||
```js
|
||||
{
|
||||
ts = Number,
|
||||
messages = Array,
|
||||
bindings = Array,
|
||||
level: { label = String, value = Number}
|
||||
}
|
||||
```
|
||||
|
||||
The `ts` property is a unix epoch timestamp in milliseconds, the time is taken from the moment the
|
||||
logger method is called.
|
||||
|
||||
The `messages` array is all arguments passed to logger method, (for instance `logger.info('a', 'b', 'c')`
|
||||
would result in `messages` array `['a', 'b', 'c']`).
|
||||
|
||||
The `bindings` array represents each child logger (if any), and the relevant bindings.
|
||||
For instance given `logger.child({a: 1}).child({b: 2}).info({c: 3})`, the bindings array
|
||||
would hold `[{a: 1}, {b: 2}]` and the `messages` array would be `[{c: 3}]`. The `bindings`
|
||||
are ordered according to their position in the child logger hierarchy, with the lowest index
|
||||
being the top of the hierarchy.
|
||||
|
||||
By default serializers are not applied to log output in the browser, but they will *always* be
|
||||
applied to `messages` and `bindings` in the `logEvent` object. This allows us to ensure a consistent
|
||||
format for all values between server and client.
|
||||
|
||||
The `level` holds the label (for instance `info`), and the corresponding numerical value
|
||||
(for instance `30`). This could be important in cases where client side level values and
|
||||
labels differ from server side.
|
||||
|
||||
The point of the `send` function is to remotely record log messages:
|
||||
|
||||
```js
|
||||
const pino = require('pino')({
|
||||
browser: {
|
||||
transmit: {
|
||||
level: 'warn',
|
||||
send: function (level, logEvent) {
|
||||
if (level === 'warn') {
|
||||
// maybe send the logEvent to a separate endpoint
|
||||
// or maybe analyse the messages further before sending
|
||||
}
|
||||
// we could also use the `logEvent.level.value` property to determine
|
||||
// numerical value
|
||||
if (logEvent.level.value >= 50) { // covers error and fatal
|
||||
|
||||
// send the logEvent somewhere
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
95
node_modules/pino/docs/child-loggers.md
generated
vendored
Normal file
95
node_modules/pino/docs/child-loggers.md
generated
vendored
Normal file
|
@ -0,0 +1,95 @@
|
|||
# Child loggers
|
||||
|
||||
Let's assume we want to have `"module":"foo"` added to every log within a
|
||||
module `foo.js`.
|
||||
|
||||
To accomplish this, simply use a child logger:
|
||||
|
||||
```js
|
||||
'use strict'
|
||||
// imports a pino logger instance of `require('pino')()`
|
||||
const parentLogger = require('./lib/logger')
|
||||
const log = parentLogger.child({module: 'foo'})
|
||||
|
||||
function doSomething () {
|
||||
log.info('doSomething invoked')
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
doSomething
|
||||
}
|
||||
```
|
||||
|
||||
## Cost of child logging
|
||||
|
||||
Child logger creation is fast:
|
||||
|
||||
```
|
||||
benchBunyanCreation*10000: 564.514ms
|
||||
benchBoleCreation*10000: 283.276ms
|
||||
benchPinoCreation*10000: 258.745ms
|
||||
benchPinoExtremeCreation*10000: 150.506ms
|
||||
```
|
||||
|
||||
Logging through a child logger has little performance penalty:
|
||||
|
||||
```
|
||||
benchBunyanChild*10000: 556.275ms
|
||||
benchBoleChild*10000: 288.124ms
|
||||
benchPinoChild*10000: 231.695ms
|
||||
benchPinoExtremeChild*10000: 122.117ms
|
||||
```
|
||||
|
||||
Logging via the child logger of a child logger also has negligible overhead:
|
||||
|
||||
```
|
||||
benchBunyanChildChild*10000: 559.082ms
|
||||
benchPinoChildChild*10000: 229.264ms
|
||||
benchPinoExtremeChildChild*10000: 127.753ms
|
||||
```
|
||||
|
||||
## Duplicate keys caveat
|
||||
|
||||
It's possible for naming conflicts to arise between child loggers and
|
||||
children of child loggers.
|
||||
|
||||
This isn't as bad as it sounds, even if the same keys between
|
||||
parent and child loggers are used, Pino resolves the conflict in the sanest way.
|
||||
|
||||
For example, consider the following:
|
||||
|
||||
```js
|
||||
const pino = require('pino')
|
||||
pino(pino.destination('./my-log'))
|
||||
.child({a: 'property'})
|
||||
.child({a: 'prop'})
|
||||
.info('howdy')
|
||||
```
|
||||
|
||||
```sh
|
||||
$ cat my-log
|
||||
{"pid":95469,"hostname":"MacBook-Pro-3.home","level":30,"msg":"howdy","time":1459534114473,"a":"property","a":"prop","v":1}
|
||||
```
|
||||
|
||||
Notice how there's two key's named `a` in the JSON output. The sub-childs properties
|
||||
appear after the parent child properties.
|
||||
|
||||
At some point the logs will most likely be processed (for instance with a [transport](transports.md)),
|
||||
and this generally involves parsing. `JSON.parse` will return an object where the conflicting
|
||||
namespace holds the final value assigned to it:
|
||||
|
||||
```sh
|
||||
$ cat my-log | node -e "process.stdin.once('data', (line) => console.log(JSON.stringify(JSON.parse(line))))"
|
||||
{"pid":95469,"hostname":"MacBook-Pro-3.home","level":30,"msg":"howdy","time":"2016-04-01T18:08:34.473Z","a":"prop","v":1}
|
||||
```
|
||||
|
||||
Ultimately the conflict is resolved by taking the last value, which aligns with Bunyans child logging
|
||||
behavior.
|
||||
|
||||
There may be cases where this edge case becomes problematic if a JSON parser with alternative behavior
|
||||
is used to process the logs. It's recommended to be conscious of namespace conflicts with child loggers,
|
||||
in light of an expected log processing approach.
|
||||
|
||||
One of Pino's performance tricks is to avoid building objects and stringifying
|
||||
them, so we're building strings instead. This is why duplicate keys between
|
||||
parents and children will end up in log output.
|
72
node_modules/pino/docs/ecosystem.md
generated
vendored
Normal file
72
node_modules/pino/docs/ecosystem.md
generated
vendored
Normal file
|
@ -0,0 +1,72 @@
|
|||
# Pino Ecosystem
|
||||
|
||||
This is a list of ecosystem modules that integrate with `pino`.
|
||||
|
||||
Modules listed under [Core](#core) are maintained by the Pino team. Modules
|
||||
listed under [Community](#community) are maintained by independent community
|
||||
members.
|
||||
|
||||
Please send a PR to add new modules!
|
||||
|
||||
<a id="core"></a>
|
||||
## Core
|
||||
|
||||
+ [`express-pino-logger`](https://github.com/pinojs/express-pino-logger): use
|
||||
Pino to log requests within [express](https://expressjs.com/).
|
||||
+ [`koa-pino-logger`](https://github.com/pinojs/koa-pino-logger): use Pino to
|
||||
log requests within [Koa](http://koajs.com/).
|
||||
+ [`pino-arborsculpture`](https://github.com/pinojs/pino-arborsculpture): change
|
||||
log levels at runtime.
|
||||
+ [`pino-caller`](https://github.com/pinojs/pino-caller): add callsite to the log line.
|
||||
+ [`pino-clf`](https://github.com/pinojs/pino-clf): reformat Pino logs into
|
||||
Common Log Format.
|
||||
+ [`pino-debug`](https://github.com/pinojs/pino-debug): use Pino to interpret
|
||||
[`debug`](https://npm.im/debug) logs.
|
||||
+ [`pino-elasticsearch`](https://github.com/pinojs/pino-elasticsearch): send
|
||||
Pino logs to an Elasticsearch instance.
|
||||
+ [`pino-eventhub`](https://github.com/pinojs/pino-eventhub): send Pino logs
|
||||
to an [Event Hub](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-what-is-event-hubs).
|
||||
+ [`pino-filter`](https://github.com/pinojs/pino-filter): filter Pino logs in
|
||||
the same fashion as the [`debug`](https://npm.im/debug) module.
|
||||
+ [`pino-gelf`](https://github.com/pinojs/pino-gelf): reformat Pino logs into
|
||||
GELF format for Graylog.
|
||||
+ [`pino-hapi`](https://github.com/pinojs/hapi-pino): use Pino as the logger
|
||||
for [Hapi](https://hapijs.com/).
|
||||
+ [`pino-http`](https://github.com/pinojs/pino-http): easily use Pino to log
|
||||
requests with the core `http` module.
|
||||
+ [`pino-http-print`](https://github.com/pinojs/pino-http-print): reformat Pino
|
||||
logs into traditional [HTTPD](https://httpd.apache.org/) style request logs.
|
||||
+ [`pino-multi-stream`](https://github.com/pinojs/pino-multi-stream): send
|
||||
logs to multiple destination streams (slow!).
|
||||
+ [`pino-mongodb`](https://github.com/pinojs/pino-mongodb): store Pino logs
|
||||
in a MongoDB database.
|
||||
+ [`pino-noir`](https://github.com/pinojs/pino-noir): redact sensitive information
|
||||
in logs.
|
||||
+ [`pino-pretty`](https://github.com/pinojs/pino-pretty): basic prettifier to
|
||||
make log lines human readable.
|
||||
+ [`pino-socket`](https://github.com/pinojs/pino-socket): send logs to TCP or UDP
|
||||
destinations.
|
||||
+ [`pino-std-serializers`](https://github.com/pinojs/pino-std-serializers): the
|
||||
core object serializers used within Pino.
|
||||
+ [`pino-syslog`](https://github.com/pinojs/pino-syslog): reformat Pino logs
|
||||
to standard syslog format.
|
||||
+ [`pino-tee`](https://github.com/pinojs/pino-tee): pipe Pino logs into files
|
||||
based upon log levels.
|
||||
+ [`pino-toke`](https://github.com/pinojs/pino-toke): reformat Pino logs
|
||||
according to a given format string.
|
||||
+ [`restify-pino-logger`](https://github.com/pinojs/restify-pino-logger): use
|
||||
Pino to log requests within [restify](http://restify.com/).
|
||||
+ [`rill-pino-logger`](https://github.com/pinojs/rill-pino-logger): use Pino as
|
||||
the logger for the [Rill framework](https://rill.site/).
|
||||
|
||||
<a id="community"></a>
|
||||
## Community
|
||||
|
||||
+ [`pino-colada`](https://github.com/lrlna/pino-colada): cute ndjson formatter for pino.
|
||||
+ [`pino-fluentd`](https://github.com/davidedantonio/pino-fluentd): send Pino logs to Elasticsearch,
|
||||
MongoDB and many [others](https://www.fluentd.org/dataoutputs) via Fluentd.
|
||||
+ [`pino-pretty-min`](https://github.com/unjello/pino-pretty-min): a minimal
|
||||
prettifier inspired by the [logrus](https://github.com/sirupsen/logrus) logger.
|
||||
+ [`pino-rotating-file`](https://github.com/homeaway/pino-rotating-file): a hapi-pino log transport for splitting logs into separate, automatically rotating files.
|
||||
+ [`cls-proxify`](https://github.com/keenondrums/cls-proxify): integration of pino and [CLS](https://github.com/jeff-lewis/cls-hooked). Useful for creating dynamically configured child loggers (e.g. with added trace ID) for each request.
|
||||
|
95
node_modules/pino/docs/extreme.md
generated
vendored
Normal file
95
node_modules/pino/docs/extreme.md
generated
vendored
Normal file
|
@ -0,0 +1,95 @@
|
|||
# Extreme Mode
|
||||
|
||||
In essence, extreme mode enables even faster performance by Pino.
|
||||
|
||||
In Pino's standard mode of operation log messages are directly written to the
|
||||
output stream as the messages are generated. Extreme mode works by buffering
|
||||
log messages and writing them in larger chunks.
|
||||
|
||||
## Caveats
|
||||
|
||||
This has a couple of important caveats:
|
||||
|
||||
* 4KB of spare RAM will be needed for logging
|
||||
* As opposed to the default mode, there is not a one-to-one relationship between
|
||||
calls to logging methods (e.g. `logger.info`) and writes to a log file
|
||||
* There is a possibility of the most recently buffered log messages being lost
|
||||
(up to 4KB of logs)
|
||||
* For instance, a power cut will mean up to 4KB of buffered logs will be lost
|
||||
|
||||
So in summary, only use extreme mode when performing an extreme amount of
|
||||
logging and it is acceptable to potentially lose the most recent logs.
|
||||
|
||||
* Pino will register handlers for the following process events/signals so that
|
||||
Pino can flush the extreme mode buffer:
|
||||
|
||||
+ `beforeExit`
|
||||
+ `exit`
|
||||
+ `uncaughtException`
|
||||
+ `SIGHUP`
|
||||
+ `SIGINT`
|
||||
+ `SIGQUIT`
|
||||
+ `SIGTERM`
|
||||
|
||||
In all of these cases, except `SIGHUP`, the process is in a state that it
|
||||
*must* terminate. Thus, if an `onTerminated` function isn't registered when
|
||||
constructing a Pino instance (see [pino#constructor](api.md#constructor)),
|
||||
then Pino will invoke `process.exit(0)` when no error has occurred, or
|
||||
`process.exit(1)` otherwise. If an `onTerminated` function is supplied, it
|
||||
is the responsibility of the `onTerminated` function to manually exit the process.
|
||||
|
||||
In the case of `SIGHUP`, we will look to see if any other handlers are
|
||||
registered for the event. If not, we will proceed as we do with all other
|
||||
signals. If there are more handlers registered than just our own, we will
|
||||
simply flush the extreme mode buffer.
|
||||
|
||||
## Usage
|
||||
|
||||
The `pino.extreme()` method will provide an Extreme Mode destination.
|
||||
|
||||
```js
|
||||
const pino = require('pino')
|
||||
const dest = pino.extreme() // logs to stdout with no args
|
||||
const logger = pino(dest)
|
||||
```
|
||||
|
||||
<a id='log-loss-prevention'></a>
|
||||
## Log loss prevention
|
||||
|
||||
The following strategy can be used to minimize log loss:
|
||||
|
||||
```js
|
||||
const pino = require('pino')
|
||||
const dest = pino.extreme() // no arguments
|
||||
const logger = pino(dest)
|
||||
|
||||
// asynchronously flush every 10 seconds to keep the buffer empty
|
||||
// in periods of low activity
|
||||
setInterval(function () {
|
||||
logger.flush()
|
||||
}, 10000).unref()
|
||||
|
||||
// use pino.final to create a special logger that
|
||||
// guarantees final tick writes
|
||||
const handler = pino.final(logger, (err, finalLogger, evt) => {
|
||||
finalLogger.info(`${evt} caught`)
|
||||
if (err) finalLogger.error(err, 'error caused exit')
|
||||
process.exit(err ? 1 : 0)
|
||||
})
|
||||
// catch all the ways node might exit
|
||||
process.on('beforeExit', () => handler(null, 'beforeExit'))
|
||||
process.on('exit', () => handler(null, 'exit'))
|
||||
process.on('uncaughtException', (err) => handler(err, 'uncaughtException'))
|
||||
process.on('SIGINT', () => handler(null, 'SIGINT'))
|
||||
process.on('SIGQUIT', () => handler(null, 'SIGQUIT'))
|
||||
process.on('SIGTERM', () => handler(null, 'SIGTERM'))
|
||||
```
|
||||
|
||||
An extreme destination is an instance of
|
||||
[`SonicBoom`](https://github.com/mcollina/sonic-boom) with `4096`
|
||||
buffering.
|
||||
|
||||
|
||||
* See [`pino.extreme` api](/docs/api.md#pino-extreme)
|
||||
* See [`pino.final` api](/docs/api.md#pino-final)
|
||||
* See [`destination` parameter](/docs/api.md#destination)
|
215
node_modules/pino/docs/help.md
generated
vendored
Normal file
215
node_modules/pino/docs/help.md
generated
vendored
Normal file
|
@ -0,0 +1,215 @@
|
|||
# Help
|
||||
|
||||
* [Exit logging](#exit-logging)
|
||||
* [Log rotation](#rotate)
|
||||
* [Reopening log files](#reopening)
|
||||
* [Saving to multiple files](#multiple)
|
||||
* [Log filtering](#filter-logs)
|
||||
* [Transports and systemd](#transport-systemd)
|
||||
* [Duplicate keys](#dupe-keys)
|
||||
* [Log levels as labels instead of numbers](#level-string)
|
||||
* [Pino with `debug`](#debug)
|
||||
* [Unicode and Windows terminal](#windows)
|
||||
|
||||
<a id="exit-logging"></a>
|
||||
## Exit logging
|
||||
|
||||
When a Node process crashes from uncaught exception, exits due to a signal,
|
||||
or exits of it's own accord we may want to write some final logs – particularly
|
||||
in cases of error.
|
||||
|
||||
Writing to a Node.js stream on exit is not necessarily guaranteed, and naively writing
|
||||
to an Extreme Mode logger on exit will definitely lead to lost logs.
|
||||
|
||||
To write logs in an exit handler, create the handler with [`pino.final`](/docs/api.md#pino-final):
|
||||
|
||||
```js
|
||||
process.on('uncaughtException', pino.final(logger, (err, finalLogger) => {
|
||||
finalLogger.error(err, 'uncaughtException')
|
||||
process.exit(1)
|
||||
}))
|
||||
|
||||
process.on('unhandledRejection', pino.final(logger, (err, finalLogger) => {
|
||||
finalLogger.error(err, 'unhandledRejection')
|
||||
process.exit(1)
|
||||
}))
|
||||
```
|
||||
|
||||
The `finalLogger` is a special logger instance that will synchronously and reliably
|
||||
flush every log line. This is important in exit handlers, since no more asynchronous
|
||||
activity may be scheduled.
|
||||
|
||||
<a id="rotate"></a>
|
||||
## Log rotation
|
||||
|
||||
Use a separate tool for log rotation:
|
||||
We recommend [logrotate](https://github.com/logrotate/logrotate).
|
||||
Consider we output our logs to `/var/log/myapp.log` like so:
|
||||
|
||||
```
|
||||
$ node server.js > /var/log/myapp.log
|
||||
```
|
||||
|
||||
We would rotate our log files with logrotate, by adding the following to `/etc/logrotate.d/myapp`:
|
||||
|
||||
```
|
||||
/var/log/myapp.log {
|
||||
su root
|
||||
daily
|
||||
rotate 7
|
||||
delaycompress
|
||||
compress
|
||||
notifempty
|
||||
missingok
|
||||
copytruncate
|
||||
}
|
||||
```
|
||||
|
||||
The `copytruncate` configuration has a very slight possibility of lost log lines due
|
||||
to a gap between copying and truncating - the truncate may occur after additional lines
|
||||
have been written. To perform log rotation without `copytruncate`, see the [Reopening log files](#reopening)
|
||||
help.
|
||||
|
||||
<a id="reopening"></a>
|
||||
## Reopening log files
|
||||
|
||||
In cases where a log rotation tool doesn't offer a copy-truncate capabilities,
|
||||
or where using them is deemed inappropriate `pino.destination` and `pino.extreme`
|
||||
destinations are able to reopen file paths after a file has been moved away.
|
||||
|
||||
One way to use this is to set up a `SIGUSR2` or `SIGHUP` signal handler that
|
||||
reopens the log file destination, making sure to write the process PID out
|
||||
somewhere so the log rotation tool knows where to send the signal.
|
||||
|
||||
```js
|
||||
// write the process pid to a well known location for later
|
||||
const fs = require('fs')
|
||||
fs.writeFileSync('/var/run/myapp.pid', process.pid)
|
||||
|
||||
const dest = pino.destination('/log/file') // pino.extreme will also work
|
||||
const logger = require('pino')(dest)
|
||||
process.on('SIGHUP', () => dest.reopen())
|
||||
```
|
||||
|
||||
The log rotation tool can then be configured to send this signal to the process
|
||||
after a log rotation event has occurred.
|
||||
|
||||
Given a similar scenario as in the [Log rotation](#rotate) section a basic
|
||||
`logrotate` config that aligns with this strategy would look similar to the following:
|
||||
|
||||
```
|
||||
/var/log/myapp.log {
|
||||
su root
|
||||
daily
|
||||
rotate 7
|
||||
delaycompress
|
||||
compress
|
||||
notifempty
|
||||
missingok
|
||||
postrotate
|
||||
kill -HUP `cat /var/run/myapp.pid`
|
||||
endscript
|
||||
}
|
||||
```
|
||||
|
||||
<a id="multiple"></a>
|
||||
## Saving to multiple files
|
||||
|
||||
Let's assume we want to store all error messages to a separate log file.
|
||||
|
||||
Install [pino-tee](http://npm.im/pino-tee) with:
|
||||
|
||||
```bash
|
||||
npm i pino-tee -g
|
||||
```
|
||||
|
||||
The following writes the log output of `app.js` to `./all-logs`, while
|
||||
writing only warnings and errors to `./warn-log:
|
||||
|
||||
```bash
|
||||
node app.js | pino-tee warn ./warn-logs > ./all-logs
|
||||
```
|
||||
|
||||
<a id="filter-logs"></a>
|
||||
## Log Filtering
|
||||
The Pino philosophy advocates common, pre-existing, system utilities.
|
||||
|
||||
Some recommendations in line with this philosophy are:
|
||||
|
||||
1. Use [`grep`](https://linux.die.net/man/1/grep):
|
||||
```sh
|
||||
$ # View all "INFO" level logs
|
||||
$ node app.js | grep '"level":30'
|
||||
```
|
||||
1. Use [`jq`](https://stedolan.github.io/jq/):
|
||||
```sh
|
||||
$ # View all "ERROR" level logs
|
||||
$ node app.js | jq 'select(.level == 50)'
|
||||
```
|
||||
|
||||
<a id="transport-systemd"></a>
|
||||
## Transports and systemd
|
||||
`systemd` makes it complicated to use pipes in services. One method for overcoming
|
||||
this challenge is to use a subshell:
|
||||
|
||||
```
|
||||
ExecStart=/bin/sh -c '/path/to/node app.js | pino-transport'
|
||||
```
|
||||
|
||||
<a id="dupe-keys"></a>
|
||||
## How Pino handles duplicate keys
|
||||
|
||||
Duplicate keys are possibly when a child logger logs an object with a key that
|
||||
collides with a key in the child loggers bindings.
|
||||
|
||||
See the [child logger duplicate keys caveat](/docs/child-loggers.md#duplicate-keys-caveat)
|
||||
for information on this is handled.
|
||||
|
||||
<a id="level-string"></a>
|
||||
## Log levels as labels instead of numbers
|
||||
Pino log lines are meant to be parseable. Thus, Pino's default mode of operation
|
||||
is to print the level value instead of the string name. However, while it is
|
||||
possible to set the `useLevelLabels` option, we recommend using one of these
|
||||
options instead if you are able:
|
||||
|
||||
1. If the only change desired is the name then a transport can be used. One such
|
||||
transport is [`pino-text-level-transport`](https://npm.im/pino-text-level-transport).
|
||||
1. Use a prettifier like [`pino-pretty`](https://npm.im/pino-pretty) to make
|
||||
the logs human friendly.
|
||||
|
||||
<a id="debug"></a>
|
||||
## Pino with `debug`
|
||||
|
||||
The popular [`debug`](http://npm.im/debug) is used in many modules across the ecosystem.
|
||||
|
||||
The [`pino-debug`](http://github.com/pinojs/pino-debug) module
|
||||
can capture calls to `debug` loggers and run them
|
||||
through `pino` instead. This results in a 10x (20x in extreme mode)
|
||||
performance improvement - even though `pino-debug` is logging additional
|
||||
data and wrapping it in JSON.
|
||||
|
||||
To quickly enable this install [`pino-debug`](http://github.com/pinojs/pino-debug)
|
||||
and preload it with the `-r` flag, enabling any `debug` logs with the
|
||||
`DEBUG` environment variable:
|
||||
|
||||
```sh
|
||||
$ npm i pino-debug
|
||||
$ DEBUG=* node -r pino-debug app.js
|
||||
```
|
||||
|
||||
[`pino-debug`](http://github.com/pinojs/pino-debug) also offers fine grain control to map specific `debug`
|
||||
namespaces to `pino` log levels. See [`pino-debug`](http://github.com/pinojs/pino-debug)
|
||||
for more.
|
||||
|
||||
<a id="windows"></a>
|
||||
## Unicode and Windows terminal
|
||||
|
||||
Pino uses [sonic-boom](https://github.com/mcollina/sonic-boom) to speed
|
||||
up logging. Internally, it uses [`fs.write`](https://nodejs.org/dist/latest-v10.x/docs/api/fs.html#fs_fs_write_fd_string_position_encoding_callback) to write log lines directly to a file
|
||||
descriptor. On Windows, unicode output is not handled properly in the
|
||||
terminal (both `cmd.exe` and powershell), and as such the output could
|
||||
be visualized incorrectly if the log lines include utf8 characters. It
|
||||
is possible to configure the terminal to visualize those characters
|
||||
correctly with the use of [`chcp`](https://ss64.com/nt/chcp.html) by
|
||||
executing in the terminal `chcp 65001`. This is a known limitation of
|
||||
Node.js.
|
167
node_modules/pino/docs/legacy.md
generated
vendored
Normal file
167
node_modules/pino/docs/legacy.md
generated
vendored
Normal file
|
@ -0,0 +1,167 @@
|
|||
# Legacy
|
||||
|
||||
## Legacy Node Support
|
||||
|
||||
### Node v4
|
||||
|
||||
Node v4 is supported on the [Pino v4](#pino-v4-documentation) line.
|
||||
|
||||
### Node v0.10-v0.12
|
||||
|
||||
Node v0.10 or Node v0.12 is supported on the [Pino v2](#pino-v2-documentation) line.
|
||||
|
||||
## Documentation
|
||||
|
||||
### Pino v4 Documentation
|
||||
|
||||
<https://github.com/pinojs/pino/tree/v4.x.x/docs>
|
||||
|
||||
### Pino v3 Documentation
|
||||
|
||||
<https://github.com/pinojs/pino/tree/v3.x.x/docs>
|
||||
|
||||
### Pino v2 Documentation
|
||||
|
||||
<https://github.com/pinojs/pino/tree/v2.x.x/docs>
|
||||
|
||||
## Migration
|
||||
|
||||
### Pino v4 to to Pino v5
|
||||
|
||||
#### Logging Destination
|
||||
|
||||
In Pino v4 the destination could be set by passing a stream as the
|
||||
second parameter to the exported `pino` function. This is still the
|
||||
case in v5. However it's strongly recommended to use `pino.destination`
|
||||
which will write logs ~30% faster.
|
||||
|
||||
##### v4
|
||||
|
||||
```js
|
||||
const stdoutLogger = require('pino')()
|
||||
const stderrLogger = require('pino')(process.stderr)
|
||||
const fileLogger = require('pino')(fs.createWriteStream('/log/path'))
|
||||
```
|
||||
|
||||
##### v5
|
||||
|
||||
```js
|
||||
const stdoutLogger = require('pino')() // pino.destination by default
|
||||
const stderrLogger = require('pino')(pino.destination(2))
|
||||
const fileLogger = require('pino')(pino.destination('/log/path'))
|
||||
```
|
||||
|
||||
Note: This is not a breaking change, `WritableStream` instances are still
|
||||
supported, but are slower than `pino.destination` which
|
||||
uses the high speed [`sonic-boom` ⇗](https://github.com/mcollina/sonic-boom) library.
|
||||
|
||||
* See [`destination` parameter](/docs/api.md#destination)
|
||||
|
||||
#### Extreme Mode
|
||||
|
||||
The `extreme` setting does not exist as an option in Pino v5, instead use
|
||||
a `pino.extreme` destination.
|
||||
|
||||
##### v4
|
||||
|
||||
```js
|
||||
const stdoutLogger = require('pino')({extreme: true})
|
||||
const stderrLogger = require('pino')({extreme: true}, process.stderr)
|
||||
const fileLogger = require('pino')({extreme: true}, fs.createWriteStream('/log/path'))
|
||||
```
|
||||
|
||||
##### v5
|
||||
|
||||
```js
|
||||
const stdoutLogger = require('pino')(pino.extreme())
|
||||
const stderrLogger = require('pino')(pino.extreme(2))
|
||||
const fileLogger = require('pino')(pino.extreme('/log/path'))
|
||||
```
|
||||
|
||||
* See [pino.extreme](/docs/api.md#pino-extreme)
|
||||
* See [Extreme mode ⇗](/docs/extreme.md)
|
||||
|
||||
|
||||
#### Pino CLI is now pino-pretty CLI
|
||||
|
||||
The Pino CLI is provided with Pino v4 for basic log prettification.
|
||||
|
||||
From Pino v5 the CLI is installed separately with `pino-pretty`.
|
||||
|
||||
##### v4
|
||||
```sh
|
||||
$ npm install -g pino
|
||||
$ node app.js | pino
|
||||
```
|
||||
|
||||
##### v5
|
||||
```sh
|
||||
$ npm install -g pino-pretty
|
||||
$ node app.js | pino-pretty
|
||||
```
|
||||
|
||||
* See [Pretty Printing documentation](/docs/pretty.md)
|
||||
|
||||
#### Programmatic Pretty Printing
|
||||
|
||||
The [`pino.pretty()`](https://github.com/pinojs/pino/blob/v4.x.x/docs/API.md#prettyoptions)
|
||||
method has also been removed from Pino v5.
|
||||
|
||||
##### v4
|
||||
|
||||
```js
|
||||
var pino = require('pino')
|
||||
var pretty = pino.pretty()
|
||||
pretty.pipe(process.stdout)
|
||||
```
|
||||
|
||||
##### v5
|
||||
|
||||
Instead use the `prettyPrint` option (also available in v4):
|
||||
|
||||
```js
|
||||
const logger = require('pino')({
|
||||
prettyPrint: process.env.NODE_ENV !== 'production'
|
||||
})
|
||||
```
|
||||
|
||||
In v5 the `pretty-print` module must be installed to use the `prettyPrint` option:
|
||||
|
||||
```sh
|
||||
npm install --save-dev pino-pretty
|
||||
```
|
||||
|
||||
* See [prettyPrint option](/docs/api.md#prettyPrint)
|
||||
* See [Pretty Printing documentation](/docs/pretty.md)
|
||||
|
||||
#### Slowtime
|
||||
|
||||
In Pino v4 a `slowtime` option was supplied, which allowed for full ISO dates
|
||||
in the timestamps instead of milliseconds since the Epoch. In Pino v5 this
|
||||
has been completely removed, along with the `pino.stdTimeFunctions.slowTime`
|
||||
function. In order to achieve the equivalent in v5, a custom
|
||||
time function should be supplied:
|
||||
|
||||
##### v4
|
||||
|
||||
```js
|
||||
const pino = require('pino')
|
||||
const logger = pino({slowtime: true})
|
||||
// following avoids deprecation warning in v4:
|
||||
const loggerAlt = pino({timestamp: pino.stdTimeFunctions.slowTime})
|
||||
```
|
||||
|
||||
##### v5
|
||||
|
||||
```js
|
||||
const logger = require('pino')({
|
||||
timestamp: () => ',"time":"' + (new Date()).toISOString() + '"'
|
||||
})
|
||||
```
|
||||
|
||||
The practice of creating ISO dates in-process for logging purposes is strongly
|
||||
recommended against. Instead consider post-processing the logs or using a transport
|
||||
to convert the timestamps.
|
||||
|
||||
|
||||
* See [timestamp option](/docs/api.md#timestamp)
|
93
node_modules/pino/docs/pretty.md
generated
vendored
Normal file
93
node_modules/pino/docs/pretty.md
generated
vendored
Normal file
|
@ -0,0 +1,93 @@
|
|||
# Pretty Printing
|
||||
|
||||
By default, Pino log lines are newline delimited JSON (NDJSON). This is perfect
|
||||
for production usage and long term storage. It's not so great for development
|
||||
environments. Thus, Pino logs can be prettified by using a Pino prettifier
|
||||
module like [`pino-pretty`][pp]:
|
||||
|
||||
```sh
|
||||
$ cat app.log | pino-pretty
|
||||
```
|
||||
|
||||
For almost all situations, this is the recommended way to prettify logs. The
|
||||
programmatic API, described in the next section, is primarily for integration
|
||||
purposes with other CLI based prettifiers.
|
||||
|
||||
## Prettifier API
|
||||
|
||||
Pino prettifier modules are extra modules that provide a CLI for parsing NDJSON
|
||||
log lines piped via `stdin` and expose an API which conforms to the Pino
|
||||
[metadata streams](api.md#metadata) API.
|
||||
|
||||
The API requires modules provide a factory function which returns a prettifier
|
||||
function. This prettifier function must accept either a string of NDJSON or
|
||||
a Pino log object. A psuedo-example of such a prettifier is:
|
||||
|
||||
The uninitialized Pino instance is passed as `this` into prettifier factory function,
|
||||
so it can be accessed via closure by the returned prettifier function.
|
||||
|
||||
```js
|
||||
module.exports = function myPrettifier (options) {
|
||||
// `this` is bound to the pino instance
|
||||
// Deal with whatever options are supplied.
|
||||
return function prettifier (inputData) {
|
||||
let logObject
|
||||
if (typeof inputData === 'string') {
|
||||
const parsedData = someJsonParser(inputData)
|
||||
logObject = (isPinoLog(parsedData)) ? parsedData : undefined
|
||||
} else if (isObject(inputData) && isPinoLog(inputData)) {
|
||||
logObject = inputData
|
||||
}
|
||||
if (!logObject) return inputData
|
||||
// implement prettification
|
||||
}
|
||||
|
||||
function isObject (input) {
|
||||
return Object.prototype.toString.apply(input) === '[object Object]'
|
||||
}
|
||||
|
||||
function isPinoLog (log) {
|
||||
return log && (log.hasOwnProperty('v') && log.v === 1)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The reference implementation of such a module is the [`pino-pretty`][pp] module.
|
||||
To learn more about creating a custom prettifier module, refer to the
|
||||
`pino-pretty` source code.
|
||||
|
||||
Note: if the prettifier returns `undefined`, instead of a formatted line, nothing
|
||||
will be written to the destination stream.
|
||||
|
||||
### API Example
|
||||
|
||||
> #### NOTE:
|
||||
> For general usage, it is highly recommended that logs are piped into
|
||||
> the prettifier instead. Prettified logs are not easily parsed and cannot
|
||||
> be easily investigated at a later date.
|
||||
|
||||
1. Install a prettifier module as a separate dependency, e.g. `npm install pino-pretty`.
|
||||
1. Instantiate the logger with pretty printing enabled:
|
||||
```js
|
||||
const pino = require('pino')
|
||||
const log = pino({
|
||||
prettyPrint: {
|
||||
levelFirst: true
|
||||
},
|
||||
prettifier: require('pino-pretty')
|
||||
})
|
||||
```
|
||||
Note: the default prettifier module is `pino-pretty`, so the preceding
|
||||
example could be:
|
||||
```js
|
||||
const pino = require('pino')
|
||||
const log = pino({
|
||||
prettyPrint: {
|
||||
levelFirst: true
|
||||
}
|
||||
})
|
||||
```
|
||||
See the [`pino-pretty` documentation][pp] for more information on the options
|
||||
that can be passed via `prettyPrint`.
|
||||
|
||||
[pp]: https://github.com/pinojs/pino-pretty
|
133
node_modules/pino/docs/redaction.md
generated
vendored
Normal file
133
node_modules/pino/docs/redaction.md
generated
vendored
Normal file
|
@ -0,0 +1,133 @@
|
|||
# Redaction
|
||||
|
||||
> Redaction is not supported in the browser [#670](https://github.com/pinojs/pino/issues/670)
|
||||
|
||||
To redact sensitive information, supply paths to keys that hold sensitive data
|
||||
using the `redact` option:
|
||||
|
||||
```js
|
||||
const logger = require('.')({
|
||||
redact: ['key', 'path.to.key', 'stuff.thats[*].secret']
|
||||
})
|
||||
|
||||
logger.info({
|
||||
key: 'will be redacted',
|
||||
path: {
|
||||
to: {key: 'sensitive', another: 'thing'}
|
||||
},
|
||||
stuff: {
|
||||
thats: [
|
||||
{secret: 'will be redacted', logme: 'will be logged'},
|
||||
{secret: 'as will this', logme: 'as will this'}
|
||||
]
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
This will output:
|
||||
|
||||
```JSON
|
||||
{"level":30,"time":1527777350011,"pid":3186,"hostname":"Davids-MacBook-Pro-3.local","key":"[Redacted]","path":{"to":{"key":"[Redacted]","another":"thing"}},"stuff":{"thats":[{"secret":"[Redacted]","logme":"will be logged"},{"secret":"[Redacted]","logme":"as will this"}]},"v":1}
|
||||
```
|
||||
|
||||
The `redact` option can take an array (as shown in the above example) or
|
||||
an object. This allows control over *how* information is redacted.
|
||||
|
||||
For instance, setting the censor:
|
||||
|
||||
```js
|
||||
const logger = require('.')({
|
||||
redact: {
|
||||
paths: ['key', 'path.to.key', 'stuff.thats[*].secret'],
|
||||
censor: '**GDPR COMPLIANT**'
|
||||
}
|
||||
})
|
||||
|
||||
logger.info({
|
||||
key: 'will be redacted',
|
||||
path: {
|
||||
to: {key: 'sensitive', another: 'thing'}
|
||||
},
|
||||
stuff: {
|
||||
thats: [
|
||||
{secret: 'will be redacted', logme: 'will be logged'},
|
||||
{secret: 'as will this', logme: 'as will this'}
|
||||
]
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
This will output:
|
||||
|
||||
```JSON
|
||||
{"level":30,"time":1527778563934,"pid":3847,"hostname":"Davids-MacBook-Pro-3.local","key":"**GDPR COMPLIANT**","path":{"to":{"key":"**GDPR COMPLIANT**","another":"thing"}},"stuff":{"thats":[{"secret":"**GDPR COMPLIANT**","logme":"will be logged"},{"secret":"**GDPR COMPLIANT**","logme":"as will this"}]},"v":1}
|
||||
```
|
||||
|
||||
The `redact.remove` option also allows for the key and value to be removed from output:
|
||||
|
||||
```js
|
||||
const logger = require('.')({
|
||||
redact: {
|
||||
paths: ['key', 'path.to.key', 'stuff.thats[*].secret'],
|
||||
remove: true
|
||||
}
|
||||
})
|
||||
|
||||
logger.info({
|
||||
key: 'will be redacted',
|
||||
path: {
|
||||
to: {key: 'sensitive', another: 'thing'}
|
||||
},
|
||||
stuff: {
|
||||
thats: [
|
||||
{secret: 'will be redacted', logme: 'will be logged'},
|
||||
{secret: 'as will this', logme: 'as will this'}
|
||||
]
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
This will output
|
||||
|
||||
```JSON
|
||||
{"level":30,"time":1527782356751,"pid":5758,"hostname":"Davids-MacBook-Pro-3.local","path":{"to":{"another":"thing"}},"stuff":{"thats":[{"logme":"will be logged"},{"logme":"as will this"}]},"v":1}
|
||||
```
|
||||
|
||||
See [pino options in API](/docs/api.md#redact-array-object) for `redact` API details.
|
||||
|
||||
<a name="paths"></a>
|
||||
## Path Syntax
|
||||
|
||||
The syntax for paths supplied to the `redact` option conform to the syntax in path lookups
|
||||
in standard EcmaScript, with two additions:
|
||||
|
||||
* paths may start with bracket notation
|
||||
* paths may contain the asterisk `*` to denote a wildcard
|
||||
|
||||
By way of example, the following are all valid paths:
|
||||
|
||||
* `a.b.c`
|
||||
* `a["b-c"].d`
|
||||
* `["a-b"].c`
|
||||
* `a.b.*`
|
||||
* `a[*].b`
|
||||
|
||||
## Overhead
|
||||
|
||||
Pino's redaction functionality is built on top of [`fast-redact`](http://github.com/davidmarkclements/fast-redact)
|
||||
which adds about 2% overhead to `JSON.stringify` when using paths without wildcards.
|
||||
|
||||
When used with pino logger with a single redacted path, any overhead is within noise -
|
||||
a way to deterministically measure it's effect has not been found. This is because its not a bottleneck.
|
||||
|
||||
However, wildcard redaction does carry a non-trivial cost relative to explicitly declaring the keys
|
||||
(50% in a case where four keys are redacted across two objects). See
|
||||
the [`fast-redact` benchmarks](https://github.com/davidmarkclements/fast-redact#benchmarks) for details.
|
||||
|
||||
## Safety
|
||||
|
||||
The `redact` option is intended as an initialization time configuration option.
|
||||
It's extremely important that path strings do not originate from user input.
|
||||
The `fast-redact` module uses a VM context to syntax check the paths, user input
|
||||
should never be combined with such an approach. See the [`fast-redact` Caveat](https://github.com/davidmarkclements/fast-redact#caveat)
|
||||
and the [`fast-redact` Approach](https://github.com/davidmarkclements/fast-redact#approach) for in-depth information.
|
387
node_modules/pino/docs/transports.md
generated
vendored
Normal file
387
node_modules/pino/docs/transports.md
generated
vendored
Normal file
|
@ -0,0 +1,387 @@
|
|||
# Transports
|
||||
|
||||
A "transport" for Pino is supplementary tool which consumes Pino logs.
|
||||
|
||||
Consider the following example:
|
||||
|
||||
```js
|
||||
const split = require('split2')
|
||||
const pump = require('pump')
|
||||
const through = require('through2')
|
||||
|
||||
const myTransport = through.obj(function (chunk, enc, cb) {
|
||||
// do the necessary
|
||||
console.log(chunk)
|
||||
cb()
|
||||
})
|
||||
|
||||
pump(process.stdin, split(JSON.parse), myTransport)
|
||||
```
|
||||
|
||||
The above defines our "transport" as the file `my-transport-process.js`.
|
||||
|
||||
Logs can now be consumed using shell piping:
|
||||
|
||||
```sh
|
||||
node my-app-which-logs-stuff-to-stdout.js | node my-transport-process.js
|
||||
```
|
||||
|
||||
Ideally, a transport should consume logs in a separate process to the application,
|
||||
Using transports in the same process causes unnecessary load and slows down
|
||||
Node's single threaded event loop.
|
||||
|
||||
## In-process transports
|
||||
|
||||
> **Pino *does not* natively support in-process transports.**
|
||||
|
||||
Pino does not support in-process transports because Node processes are
|
||||
single threaded processes (ignoring some technical details). Given this
|
||||
restriction, one of the methods Pino employs to achieve its speed is to
|
||||
purposefully offload the handling of logs, and their ultimate destination, to
|
||||
external processes so that the threading capabilities of the OS can be
|
||||
used (or other CPUs).
|
||||
|
||||
One consequence of this methodology is that "error" logs do not get written to
|
||||
`stderr`. However, since Pino logs are in a parseable format, it is possible to
|
||||
use tools like [pino-tee][pino-tee] or [jq][jq] to work with the logs. For
|
||||
example, to view only logs marked as "error" logs:
|
||||
|
||||
```
|
||||
$ node an-app.js | jq 'select(.level == 50)'
|
||||
```
|
||||
|
||||
In short, the way Pino generates logs:
|
||||
|
||||
1. Reduces the impact of logging on an application to the absolute minimum.
|
||||
2. Gives greater flexibility in how logs are processed and stored.
|
||||
|
||||
Given all of the above, Pino recommends out-of-process log processing.
|
||||
|
||||
However, it is possible to wrap Pino and perform processing in-process.
|
||||
For an example of this, see [pino-multi-stream][pinoms].
|
||||
|
||||
[pino-tee]: https://npm.im/pino-tee
|
||||
[jq]: https://stedolan.github.io/jq/
|
||||
[pinoms]: https://npm.im/pino-multi-stream
|
||||
|
||||
## Known Transports
|
||||
|
||||
PR's to this document are welcome for any new transports!
|
||||
|
||||
+ [pino-applicationinsights](#pino-applicationinsights)
|
||||
+ [pino-azuretable](#pino-azuretable)
|
||||
+ [pino-cloudwatch](#pino-cloudwatch)
|
||||
+ [pino-couch](#pino-couch)
|
||||
+ [pino-datadog](#pino-datadog)
|
||||
+ [pino-elasticsearch](#pino-elasticsearch)
|
||||
+ [pino-mq](#pino-mq)
|
||||
+ [pino-mysql](#pino-mysql)
|
||||
+ [pino-papertrail](#pino-papertrail)
|
||||
+ [pino-redis](#pino-redis)
|
||||
+ [pino-sentry](#pino-sentry)
|
||||
+ [pino-socket](#pino-socket)
|
||||
+ [pino-stackdriver](#pino-stackdriver)
|
||||
+ [pino-syslog](#pino-syslog)
|
||||
+ [pino-websocket](#pino-websocket)
|
||||
+ [pino-http-send](#pino-http-send)
|
||||
|
||||
<a id="pino-applicationinsights"></a>
|
||||
### pino-applicationinsights
|
||||
The [pino-applicationinsights](https://www.npmjs.com/package/pino-applicationinsights) module is a transport that will forward logs to [Azure Application Insights](https://docs.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview).
|
||||
|
||||
Given an application `foo` that logs via pino, you would use `pino-applicationinsights` like so:
|
||||
|
||||
``` sh
|
||||
$ node foo | pino-applicationinsights --key blablabla
|
||||
```
|
||||
|
||||
For full documentation of command line switches read [readme](https://github.com/ovhemert/pino-applicationinsights#readme)
|
||||
|
||||
<a id="pino-azuretable"></a>
|
||||
### pino-azuretable
|
||||
The [pino-azuretable](https://www.npmjs.com/package/pino-azuretable) module is a transport that will forward logs to the [Azure Table Storage](https://azure.microsoft.com/en-us/services/storage/tables/).
|
||||
|
||||
Given an application `foo` that logs via pino, you would use `pino-azuretable` like so:
|
||||
|
||||
``` sh
|
||||
$ node foo | pino-azuretable --account storageaccount --key blablabla
|
||||
```
|
||||
|
||||
For full documentation of command line switches read [readme](https://github.com/ovhemert/pino-azuretable#readme)
|
||||
|
||||
<a id="pino-cloudwatch"></a>
|
||||
### pino-cloudwatch
|
||||
|
||||
[pino-cloudwatch][pino-cloudwatch] is a transport that buffers and forwards logs to [Amazon CloudWatch][].
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-cloudwatch --group my-log-group
|
||||
```
|
||||
|
||||
[pino-cloudwatch]: https://github.com/dbhowell/pino-cloudwatch
|
||||
[Amazon CloudWatch]: https://aws.amazon.com/cloudwatch/
|
||||
|
||||
<a id="pino-couch"></a>
|
||||
### pino-couch
|
||||
|
||||
[pino-couch][pino-couch] uploads each log line as a [CouchDB][CouchDB] document.
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-couch -U https://couch-server -d mylogs
|
||||
```
|
||||
|
||||
[pino-couch]: https://github.com/IBM/pino-couch
|
||||
[CouchDB]: https://couchdb.apache.org
|
||||
|
||||
<a id="pino-datadog"></a>
|
||||
### pino-datadog
|
||||
The [pino-datadog](https://www.npmjs.com/package/pino-datadog) module is a transport that will forward logs to [DataDog](https://www.datadoghq.com/) through it's API.
|
||||
|
||||
Given an application `foo` that logs via pino, you would use `pino-datadog` like so:
|
||||
|
||||
``` sh
|
||||
$ node foo | pino-datadog --key blablabla
|
||||
```
|
||||
|
||||
For full documentation of command line switches read [readme](https://github.com/ovhemert/pino-datadog#readme)
|
||||
|
||||
<a id="pino-elasticsearch"></a>
|
||||
### pino-elasticsearch
|
||||
|
||||
[pino-elasticsearch][pino-elasticsearch] uploads the log lines in bulk
|
||||
to [Elasticsearch][elasticsearch], to be displayed in [Kibana][kibana].
|
||||
|
||||
It is extremely simple to use and setup
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-elasticsearch
|
||||
```
|
||||
|
||||
Assuming Elasticsearch is running on localhost.
|
||||
|
||||
To connect to an external elasticsearch instance (recommended for production):
|
||||
|
||||
* Check that `network.host` is defined in the `elasticsearch.yml` configuration file. See [elasticsearch Network Settings documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html#common-network-settings) for more details.
|
||||
* Launch:
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-elasticsearch --node http://192.168.1.42:9200
|
||||
```
|
||||
|
||||
Assuming Elasticsearch is running on `192.168.1.42`.
|
||||
|
||||
To connect to AWS Elasticsearch:
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-elasticsearch --node https://es-url.us-east-1.es.amazonaws.com --es-version 6
|
||||
```
|
||||
|
||||
Then [create an index pattern](https://www.elastic.co/guide/en/kibana/current/setup.html) on `'pino'` (the default index key for `pino-elasticsearch`) on the Kibana instance.
|
||||
|
||||
[pino-elasticsearch]: https://github.com/pinojs/pino-elasticsearch
|
||||
[elasticsearch]: https://www.elastic.co/products/elasticsearch
|
||||
[kibana]: https://www.elastic.co/products/kibana
|
||||
|
||||
<a id="pino-mq"></a>
|
||||
### pino-mq
|
||||
|
||||
The `pino-mq` transport will take all messages received on `process.stdin` and send them over a message bus using JSON serialization.
|
||||
|
||||
This useful for:
|
||||
|
||||
* moving backpressure from application to broker
|
||||
* transforming messages pressure to another component
|
||||
|
||||
```
|
||||
node app.js | pino-mq -u "amqp://guest:guest@localhost/" -q "pino-logs"
|
||||
```
|
||||
|
||||
Alternatively a configuration file can be used:
|
||||
|
||||
```
|
||||
node app.js | pino-mq -c pino-mq.json
|
||||
```
|
||||
|
||||
A base configuration file can be initialized with:
|
||||
|
||||
```
|
||||
pino-mq -g
|
||||
```
|
||||
|
||||
For full documentation of command line switches and configuration see [the `pino-mq` readme](https://github.com/itavy/pino-mq#readme)
|
||||
|
||||
<a id="pino-papertrail"></a>
|
||||
### pino-papertrail
|
||||
pino-papertrail is a transport that will forward logs to the [papertrail](https://papertrailapp.com) log service through an UDPv4 socket.
|
||||
|
||||
Given an application `foo` that logs via pino, and a papertrail destination that collects logs on port UDP `12345` on address `bar.papertrailapp.com`, you would use `pino-papertrail`
|
||||
like so:
|
||||
|
||||
```
|
||||
node yourapp.js | pino-papertrail --host bar.papertrailapp.com --port 12345 --appname foo
|
||||
```
|
||||
|
||||
|
||||
for full documentation of command line switches read [readme](https://github.com/ovhemert/pino-papertrail#readme)
|
||||
|
||||
<a id="pino-mysql"></a>
|
||||
### pino-mysql
|
||||
|
||||
[pino-mysql][pino-mysql] loads pino logs into [MySQL][MySQL] and [MariaDB][MariaDB].
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-mysql -c db-configuration.json
|
||||
```
|
||||
|
||||
`pino-mysql` can extract and save log fields into corresponding database field
|
||||
and/or save the entire log stream as a [JSON Data Type][JSONDT].
|
||||
|
||||
For full documentation and command line switches read the [readme][pino-mysql].
|
||||
|
||||
[pino-mysql]: https://www.npmjs.com/package/pino-mysql
|
||||
[MySQL]: https://www.mysql.com/
|
||||
[MariaDB]: https://mariadb.org/
|
||||
[JSONDT]: https://dev.mysql.com/doc/refman/8.0/en/json.html
|
||||
|
||||
<a id="pino-redis"></a>
|
||||
### pino-redis
|
||||
|
||||
[pino-redis][pino-redis] loads pino logs into [Redis][Redis].
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-redis -U redis://username:password@localhost:6379
|
||||
```
|
||||
|
||||
[pino-redis]: https://github.com/buianhthang/pino-redis
|
||||
[Redis]: https://redis.io/
|
||||
|
||||
<a id="pino-sentry"></a>
|
||||
### pino-sentry
|
||||
|
||||
[pino-sentry][pino-sentry] loads pino logs into [Sentry][Sentry].
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-sentry --dsn=https://******@sentry.io/12345
|
||||
```
|
||||
|
||||
For full documentation of command line switches see the [pino-sentry readme](https://github.com/aandrewww/pino-sentry/blob/master/README.md)
|
||||
|
||||
[pino-sentry]: https://www.npmjs.com/package/pino-sentry
|
||||
[Sentry]: https://sentry.io/
|
||||
|
||||
<a id="pino-socket"></a>
|
||||
### pino-socket
|
||||
|
||||
[pino-socket][pino-socket] is a transport that will forward logs to a IPv4
|
||||
UDP or TCP socket.
|
||||
|
||||
As an example, use `socat` to fake a listener:
|
||||
|
||||
```sh
|
||||
$ socat -v udp4-recvfrom:6000,fork exec:'/bin/cat'
|
||||
```
|
||||
|
||||
Then run an application that uses `pino` for logging:
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-socket -p 6000
|
||||
```
|
||||
|
||||
Logs from the application should be observed on both consoles.
|
||||
|
||||
[pino-socket]: https://www.npmjs.com/package/pino-socket
|
||||
|
||||
#### Logstash
|
||||
|
||||
The [pino-socket][pino-socket] module can also be used to upload logs to
|
||||
[Logstash][logstash] via:
|
||||
|
||||
```
|
||||
$ node app.js | pino-socket -a 127.0.0.1 -p 5000 -m tcp
|
||||
```
|
||||
|
||||
Assuming logstash is running on the same host and configured as
|
||||
follows:
|
||||
|
||||
```
|
||||
input {
|
||||
tcp {
|
||||
port => 5000
|
||||
}
|
||||
}
|
||||
|
||||
filter {
|
||||
json {
|
||||
source => "message"
|
||||
}
|
||||
}
|
||||
|
||||
output {
|
||||
elasticsearch {
|
||||
hosts => "127.0.0.1:9200"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
See <https://www.elastic.co/guide/en/kibana/current/setup.html> to learn
|
||||
how to setup [Kibana][kibana].
|
||||
|
||||
For Docker users, see
|
||||
https://github.com/deviantony/docker-elk to setup an ELK stack.
|
||||
|
||||
<a id="pino-stackdriver"></a>
|
||||
### pino-stackdriver
|
||||
The [pino-stackdriver](https://www.npmjs.com/package/pino-stackdriver) module is a transport that will forward logs to the [Google Stackdriver](https://cloud.google.com/logging/) log service through it's API.
|
||||
|
||||
Given an application `foo` that logs via pino, a stackdriver log project `bar` and credentials in the file `/credentials.json`, you would use `pino-stackdriver`
|
||||
like so:
|
||||
|
||||
``` sh
|
||||
$ node foo | pino-stackdriver --project bar --credentials /credentials.json
|
||||
```
|
||||
|
||||
For full documentation of command line switches read [readme](https://github.com/ovhemert/pino-stackdriver#readme)
|
||||
|
||||
<a id="pino-syslog"></a>
|
||||
### pino-syslog
|
||||
|
||||
[pino-syslog][pino-syslog] is a transforming transport that converts
|
||||
`pino` NDJSON logs to [RFC3164][rfc3164] compatible log messages. The `pino-syslog` module does not
|
||||
forward the logs anywhere, it merely re-writes the messages to `stdout`. But
|
||||
when used in combination with `pino-socket` the log messages can be relayed to a syslog server:
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-syslog | pino-socket -a syslog.example.com
|
||||
```
|
||||
|
||||
Example output for the "hello world" log:
|
||||
|
||||
```
|
||||
<134>Apr 1 16:44:58 MacBook-Pro-3 none[94473]: {"pid":94473,"hostname":"MacBook-Pro-3","level":30,"msg":"hello world","time":1459529098958,"v":1}
|
||||
```
|
||||
|
||||
[pino-syslog]: https://www.npmjs.com/package/pino-syslog
|
||||
[rfc3164]: https://tools.ietf.org/html/rfc3164
|
||||
[logstash]: https://www.elastic.co/products/logstash
|
||||
|
||||
|
||||
<a id="pino-websocket"></a>
|
||||
### pino-websocket
|
||||
|
||||
[pino-websocket](https://www.npmjs.com/package/@abeai/pino-websocket) is a transport that will forward each log line to a websocket server.
|
||||
|
||||
```sh
|
||||
$ node app.js | pino-websocket -a my-websocket-server.example.com -p 3004
|
||||
```
|
||||
|
||||
For full documentation of command line switches read [readme](https://github.com/abeai/pino-webscoket#README)
|
||||
|
||||
<a id="pino-http-send"></a>
|
||||
### pino-http-send
|
||||
|
||||
[pino-http-send](https://npmjs.com/package/pino-http-send) is a configurable and low overhead
|
||||
transport that will batch logs and send to a specified URL.
|
||||
|
||||
```console
|
||||
$ node app.js | pino-http-send -u http://localhost:8080/logs
|
||||
```
|
230
node_modules/pino/docs/web.md
generated
vendored
Normal file
230
node_modules/pino/docs/web.md
generated
vendored
Normal file
|
@ -0,0 +1,230 @@
|
|||
# Web Frameworks
|
||||
|
||||
Since HTTP logging is a primary use case, Pino has first class support for the Node.js
|
||||
web framework ecosystem.
|
||||
|
||||
+ [Pino with Fastify](#fastify)
|
||||
+ [Pino with Express](#express)
|
||||
+ [Pino with Hapi](#hapi)
|
||||
+ [Pino with Restify](#restify)
|
||||
+ [Pino with Koa](#koa)
|
||||
+ [Pino with Node core `http`](#http)
|
||||
+ [Pino with Nest](#nest)
|
||||
|
||||
<a id="fastify"></a>
|
||||
## Pino with Fastify
|
||||
|
||||
The Fastify web framework comes bundled with Pino by default, simply set Fastify's
|
||||
`logger` option to `true` and use `request.log` or `reply.log` for log messages that correspond
|
||||
to each individual request:
|
||||
|
||||
```js
|
||||
const fastify = require('fastify')({
|
||||
logger: true
|
||||
})
|
||||
fastify.get('/', async (request, reply) => {
|
||||
request.log.info('something')
|
||||
return { hello: 'world' }
|
||||
})
|
||||
```
|
||||
|
||||
The `logger` option can also be set to an object, which will be passed through directly
|
||||
as the [`pino` options object](/docs/api.md#options-object).
|
||||
|
||||
See the [fastify documentation](https://www.fastify.io/docs/latest/Logging/) for more information.
|
||||
|
||||
<a id="express"></a>
|
||||
## Pino with Express
|
||||
|
||||
```sh
|
||||
npm install express-pino-logger
|
||||
```
|
||||
|
||||
```js
|
||||
const app = require('express')()
|
||||
const pino = require('express-pino-logger')()
|
||||
|
||||
app.use(pino)
|
||||
|
||||
app.get('/', function (req, res) {
|
||||
req.log.info('something')
|
||||
res.send('hello world')
|
||||
})
|
||||
|
||||
app.listen(3000)
|
||||
```
|
||||
|
||||
See the [express-pino-logger readme](http://npm.im/express-pino-logger) for more info.
|
||||
|
||||
<a id="hapi"></a>
|
||||
## Pino with Hapi
|
||||
|
||||
```sh
|
||||
npm install hapi-pino
|
||||
```
|
||||
|
||||
```js
|
||||
'use strict'
|
||||
|
||||
require('make-promises-safe')
|
||||
|
||||
const Hapi = require('hapi')
|
||||
|
||||
async function start () {
|
||||
// Create a server with a host and port
|
||||
const server = Hapi.server({
|
||||
host: 'localhost',
|
||||
port: 3000
|
||||
})
|
||||
|
||||
// Add the route
|
||||
server.route({
|
||||
method: 'GET',
|
||||
path: '/',
|
||||
handler: async function (request, h) {
|
||||
// request.log is HAPI standard way of logging
|
||||
request.log(['a', 'b'], 'Request into hello world')
|
||||
|
||||
// a pino instance can also be used, which will be faster
|
||||
request.logger.info('In handler %s', request.path)
|
||||
|
||||
return 'hello world'
|
||||
}
|
||||
})
|
||||
|
||||
await server.register({
|
||||
plugin: require('.'),
|
||||
options: {
|
||||
prettyPrint: process.env.NODE_ENV !== 'production'
|
||||
}
|
||||
})
|
||||
|
||||
// also as a decorated API
|
||||
server.logger().info('another way for accessing it')
|
||||
|
||||
// and through Hapi standard logging system
|
||||
server.log(['subsystem'], 'third way for accessing it')
|
||||
|
||||
await server.start()
|
||||
|
||||
return server
|
||||
}
|
||||
|
||||
start().catch((err) => {
|
||||
console.log(err)
|
||||
process.exit(1)
|
||||
})
|
||||
```
|
||||
|
||||
See the [hapi-pino readme](http://npm.im/hapi-pino) for more info.
|
||||
|
||||
<a id="restify"></a>
|
||||
## Pino with Restify
|
||||
|
||||
```sh
|
||||
npm install restify-pino-logger
|
||||
```
|
||||
|
||||
```js
|
||||
const server = require('restify').createServer({name: 'server'})
|
||||
const pino = require('restify-pino-logger')()
|
||||
|
||||
server.use(pino)
|
||||
|
||||
server.get('/', function (req, res) {
|
||||
req.log.info('something')
|
||||
res.send('hello world')
|
||||
})
|
||||
|
||||
server.listen(3000)
|
||||
```
|
||||
|
||||
See the [restify-pino-logger readme](http://npm.im/restify-pino-logger) for more info.
|
||||
|
||||
<a id="koa"></a>
|
||||
## Pino with Koa
|
||||
|
||||
### Koa
|
||||
|
||||
```sh
|
||||
npm install koa-pino-logger
|
||||
```
|
||||
|
||||
```js
|
||||
const Koa = require('koa')
|
||||
const app = new Koa()
|
||||
const pino = require('koa-pino-logger')()
|
||||
|
||||
app.use(pino)
|
||||
|
||||
app.use((ctx) => {
|
||||
ctx.log.info('something else')
|
||||
ctx.body = 'hello world'
|
||||
})
|
||||
|
||||
app.listen(3000)
|
||||
```
|
||||
|
||||
See the [koa-pino-logger readme](https://github.com/pinojs/koa-pino-logger) for more info.
|
||||
|
||||
<a id="http"></a>
|
||||
## Pino with Node core `http`
|
||||
|
||||
```sh
|
||||
npm install pino-http
|
||||
```
|
||||
|
||||
```js
|
||||
const http = require('http')
|
||||
const server = http.createServer(handle)
|
||||
const logger = require('pino-http')()
|
||||
|
||||
function handle (req, res) {
|
||||
logger(req, res)
|
||||
req.log.info('something else')
|
||||
res.end('hello world')
|
||||
}
|
||||
|
||||
server.listen(3000)
|
||||
```
|
||||
|
||||
See the [pino-http readme](http://npm.im/pino-http) for more info.
|
||||
|
||||
|
||||
<a id="nest"></a>
|
||||
## Pino with Nest
|
||||
|
||||
```sh
|
||||
npm install nestjs-pino
|
||||
```
|
||||
|
||||
```ts
|
||||
import { NestFactory } from '@nestjs/core'
|
||||
import { Controller, Get, Module } from '@nestjs/common'
|
||||
import { LoggerModule, Logger } from 'nestjs-pino'
|
||||
|
||||
@Controller()
|
||||
export class AppController {
|
||||
constructor(private readonly logger: Logger) {}
|
||||
|
||||
@Get()
|
||||
getHello() {
|
||||
this.logger.log('something')
|
||||
return `Hello world`
|
||||
}
|
||||
}
|
||||
|
||||
@Module({
|
||||
controllers: [AppController],
|
||||
imports: [LoggerModule.forRoot()]
|
||||
})
|
||||
class MyModule {}
|
||||
|
||||
async function bootstrap() {
|
||||
const app = await NestFactory.create(MyModule)
|
||||
await app.listen(3000)
|
||||
}
|
||||
bootstrap()
|
||||
```
|
||||
|
||||
See the [nestjs-pino readme](http://npm.im/nestjs-pino) for more info.
|
Loading…
Add table
Add a link
Reference in a new issue