You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					200 lines
				
				6.2 KiB
			
		
		
			
		
	
	
					200 lines
				
				6.2 KiB
			| 
											3 years ago
										 | # Browser API
 | ||
|  | 
 | ||
|  | Pino is compatible with [`browserify`](https://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 | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | }) | ||
|  | ``` |