README
pino-trace
Trace all async operations performantly with pino
the fast logger
About
pino-trace
uses async-tracer to hook into async operations (via the native async_wrap
binding) and output logs in an optimal way that's compatible
with and supportive of pino's log format.
Supports
Node v4 to v6
Usage
trace
level
Logger at By default, pino-trace
logs operations at the trace
level:
var pino = require('pino')
var trace = require('pino-trace')
var logger = pino({level: 'trace'})
trace(logger)
info
level
Tracer at Alternatively, we can keep pino
at the info
level and tell pino-trace
to log at that the info
level
var pino = require('pino')
var trace = require('pino-trace')
var logger = pino()
trace(logger, {level: 'info'})
Turning Tracing on Dynamically
pino-trace
will respond to changes in log level
var pino = require('pino')
var trace = require('pino-trace')
var logger = pino()
trace(logger)
// some time later:
logger.level = 'trace'
// now ops will be logged
logger.level = 'info'
// ops stop being captured and logged
Child loggers
Child loggers are supported:
var pino = require('pino')
var trace = require('pino-trace')
var logger = pino().child({bound: 'data'})
logger.level = 'trace'
trace(logger) // all trace events will have `bound` field
Shorthand
pino-trace
returns the passed in logger instance, allowing for a shorthand:
var logger = require('pino-trace')(require('pino')())
API
require('pino-trace') => (Pino: logger, opts) => logger
Opts
[default: 'trace'] ' levelString
or Number
'
Set the log level at which traced operations are recorded at. If a string, then a relevant pino log level. If a number, then a corresponding pino log level value.
[default: stacksfalse
] Boolean
or Number
If true
then include an array of call sites in
each init
log. The stack array takes the following form:
["functionName:fileName:lineNum:colNum"]
If set to a number, (from 1 to Infinity) stacks
will also
determine the maximum amount of frames to capture for the log (defaults to Infinity
if true
).
[default: contextsfalse
] Boolean
Supply the operations context in the pre
and post
logs.
The context is an exposed C object that holds state for the async op.
Ecosystem Integration
pino-trace
is compatible with express-pino-logger
, restify-pino-logger
, koa-pino-logger
, and rill-pino-logger
middleware.
In each case, simply pass the middleware into pino-trace
:
var pino = require('express-pino-logger')
var trace = require('pino-trace')
var app = express()
app.use(trace(pino({level: 'trace'})))
Benchmarks
Overhead of using pino-trace
is about 25%.
npm run benchmark
With tracing
Running 10s test @ http://localhost:3000
10 connections with 10 pipelining factor
Stat Avg Stdev Max
Latency (ms) 0.23 0.75 37
Req/Sec 33652.37 2340.03 35039
Bytes/Sec 3.74 MB 249.94 kB 3.93 MB
Without tracing
Running 10s test @ http://localhost:3000
10 connections with 10 pipelining factor
Stat Avg Stdev Max
Latency (ms) 0.13 0.42 34
Req/Sec 45682.91 1310.58 46335
Bytes/Sec 5.06 MB 150.72 kB 5.24 MB
Overhead of turning on tracing with async_wrap
is around 8%, so the net overhead is 17%, mostly
this is the cost of writing to a stream.
Test
npm test
test/index.js ....................................... 61/61
total ............................................... 61/61
61 passing (445.565ms)
ok
-----------|----------|----------|----------|----------|----------------|
File | % Stmts | % Branch | % Funcs | % Lines |Uncovered Lines |
-----------|----------|----------|----------|----------|----------------|
__root__/ | 100 | 100 | 100 | 100 | |
index.js | 100 | 100 | 100 | 100 | |
-----------|----------|----------|----------|----------|----------------|
All files | 100 | 100 | 100 | 100 | |
-----------|----------|----------|----------|----------|----------------|
License
MIT
Acknowledgements
Sponsored by nearForm