Comparing version 8.0.1 to 8.1.0
@@ -35,2 +35,5 @@ // Project: https://github.com/pinojs/pino-http#readme | ||
customErrorMessage?: ((req: IncomingMessage, res: ServerResponse, error: Error) => string) | undefined; | ||
customReceivedObject?: ((req: IncomingMessage, res: ServerResponse, val?: any) => any) | undefined; | ||
customSuccessObject?: ((req: IncomingMessage, res: ServerResponse, val: any) => any) | undefined; | ||
customErrorObject?: ((req: IncomingMessage, res: ServerResponse, error: Error, val: any) => string) | undefined; | ||
customAttributeKeys?: CustomAttributeKeys | undefined; | ||
@@ -37,0 +40,0 @@ wrapSerializers?: boolean | undefined; |
@@ -67,5 +67,11 @@ 'use strict' | ||
const receivedMessage = opts.customReceivedMessage && typeof opts.customReceivedMessage === 'function' ? opts.customReceivedMessage : undefined | ||
const successMessage = opts.customSuccessMessage || function (req, res) { return res.writableEnded ? 'request completed' : 'request aborted' } | ||
const errorMessage = opts.customErrorMessage || function () { return 'request errored' } | ||
const onRequestReceivedObject = getFunctionOrDefault(opts.customReceivedObject, undefined) | ||
const receivedMessage = getFunctionOrDefault(opts.customReceivedMessage, undefined) | ||
const onRequestSuccessObject = getFunctionOrDefault(opts.customSuccessObject, defaultSuccessfulRequestObjectProvider) | ||
const successMessage = getFunctionOrDefault(opts.customSuccessMessage, defaultSuccessfulRequestMessageProvider) | ||
const onRequestErrorObject = getFunctionOrDefault(opts.customErrorObject, defaultFailedRequestObjectProvider) | ||
const errorMessage = getFunctionOrDefault(opts.customErrorMessage, defaultFailedRequestMessageProvider) | ||
delete opts.customSuccessfulMessage | ||
@@ -110,14 +116,21 @@ delete opts.customErroredMessage | ||
log[level]({ | ||
[resKey]: this, | ||
[errKey]: error, | ||
[responseTimeKey]: responseTime | ||
}, errorMessage(req, this, error)) | ||
log[level]( | ||
onRequestErrorObject(req, this, error, { | ||
[resKey]: this, | ||
[errKey]: error, | ||
[responseTimeKey]: responseTime | ||
}), | ||
errorMessage(req, this, error) | ||
) | ||
return | ||
} | ||
log[level]({ | ||
[resKey]: this, | ||
[responseTimeKey]: responseTime | ||
}, successMessage(req, this)) | ||
log[level]( | ||
onRequestSuccessObject(req, this, { | ||
[resKey]: this, | ||
[responseTimeKey]: responseTime | ||
}), | ||
successMessage(req, this) | ||
) | ||
} | ||
@@ -152,5 +165,10 @@ | ||
if (shouldLogSuccess) { | ||
if (receivedMessage !== undefined) { | ||
const shouldLogReceived = receivedMessage !== undefined || onRequestReceivedObject !== undefined | ||
if (shouldLogReceived) { | ||
const level = getLogLevelFromCustomLogLevel(customLogLevel, useLevel, res, undefined, req) | ||
req.log[level](receivedMessage(req, res)) | ||
const receivedObjectResult = onRequestReceivedObject !== undefined ? onRequestReceivedObject(req, res, undefined) : {} | ||
const receivedStringResult = receivedMessage !== undefined ? receivedMessage(req, res) : undefined | ||
req.log[level](receivedObjectResult, receivedStringResult) | ||
} | ||
@@ -202,2 +220,26 @@ | ||
function getFunctionOrDefault (value, defaultValue) { | ||
if (value && typeof value === 'function') { | ||
return value | ||
} | ||
return defaultValue | ||
} | ||
function defaultSuccessfulRequestObjectProvider (req, res, successObject) { | ||
return successObject | ||
} | ||
function defaultFailedRequestObjectProvider (req, res, error, errorObject) { | ||
return errorObject | ||
} | ||
function defaultFailedRequestMessageProvider () { | ||
return 'request errored' | ||
} | ||
function defaultSuccessfulRequestMessageProvider (req, res) { | ||
return res.writableEnded ? 'request completed' : 'request aborted' | ||
} | ||
module.exports = pinoLogger | ||
@@ -204,0 +246,0 @@ module.exports.stdSerializers = { |
{ | ||
"name": "pino-http", | ||
"version": "8.0.1", | ||
"version": "8.1.0", | ||
"description": "High-speed HTTP logger for Node.js", | ||
@@ -11,7 +11,7 @@ "main": "logger.js", | ||
"pino": "^8.0.0", | ||
"pino-std-serializers": "^5.0.0", | ||
"pino-std-serializers": "^6.0.0", | ||
"process-warning": "^2.0.0" | ||
}, | ||
"devDependencies": { | ||
"@types/node": "^17.0.0", | ||
"@types/node": "^18.0.0", | ||
"autocannon": "^7.3.0", | ||
@@ -18,0 +18,0 @@ "coveralls": "^3.0.0", |
@@ -104,4 +104,7 @@ # pino-http [![Build Status](https://img.shields.io/github/workflow/status/pinojs/pino-http/CI)](https://github.com/pinojs/pino-http/actions) | ||
* `customReceivedMessage`: set to a `function (req, res) => { /* returns message string */ }` This function will be invoked at each request received, setting "msg" property to returned string. If not set, nothing value will be used. | ||
* `customReceivedObject`: set to a `function (req, res, loggableObject) => { /* returns loggable object */ }` This function will be invoked at each request received, replacing the base loggable received object. When set, it is up to the reponsibility of the caller to merge with the `loggableObject` parameter. If not set, default value will be used. | ||
* `customSuccessMessage`: set to a `function (req, res) => { /* returns message string */ }` This function will be invoked at each successful response, setting "msg" property to returned string. If not set, default value will be used. | ||
* `customSuccessObject`: set to a `function (req, res, loggableObject) => { /* returns loggable object */ }` This function will be invoked at each successful response, replacing the base loggable success object. When set, it is up to the reponsibility of the caller to merge with the `loggableObject` parameter. If not set, default value will be used. | ||
* `customErrorMessage`: set to a `function (req, res, err) => { /* returns message string */ }` This function will be invoked at each failed response, setting "msg" property to returned string. If not set, default value will be used. | ||
* `customErrorObject`: set to a `function (req, res, err, loggableObject) => { /* returns message string */ }` This function will be invoked at each failed response, the base loggable error object. When set, it is up to the reponsibility of the caller to merge with the `loggableObject` parameter. If not set, default value will be used. | ||
* `customAttributeKeys`: allows the log object attributes added by `pino-http` to be given custom keys. Accepts an object of format `{ [original]: [override] }`. Attributes available for override are `req`, `res`, `err`, `responseTime` and, when using quietReqLogger, `reqId`. | ||
@@ -201,2 +204,49 @@ * `wrapSerializers`: when `false`, custom serializers will be passed the raw value directly. Defaults to `true`. | ||
##### Structured Object Hooks | ||
It is possible to override the default structured object with your own. The hook is provided with the | ||
pino-http base object so that you can merge in your own keys. | ||
This is useful in scenarios where you want to augment core pino-http logger object with your own event | ||
labels. | ||
> If you simply want to change the message which is logged then check out the custom[Received|Error|Success]Message | ||
> hooks e.g. customReceivedMessage | ||
```js | ||
const logger = require('pino-http')({ | ||
//... remaining config omitted for brevity | ||
customReceivedObject: (req, res, val) => { | ||
return { | ||
category: 'ApplicationEvent', | ||
eventCode: 'REQUEST_RECEIVED' | ||
}; | ||
}, | ||
customSuccessObject: (req, res, val) => { | ||
return { | ||
...val, | ||
category: 'ApplicationEvent', | ||
eventCode: | ||
res.statusCode < 300 | ||
? 'REQUEST_PROCESSED' | ||
: 'REQUEST_FAILED' | ||
}; | ||
}, | ||
customErrorObject: (req, res, error, val) => { | ||
const store = storage.getStore(); | ||
const formattedBaggage = convertBaggageToObject(store?.baggage); | ||
return { | ||
...val, | ||
category: 'ApplicationEvent', | ||
eventCode: 'REQUEST_FAILED' | ||
}; | ||
} | ||
// ...remaining config omitted for brevity | ||
}) | ||
``` | ||
##### PinoHttp.logger (P.Logger) | ||
@@ -203,0 +253,0 @@ |
@@ -832,2 +832,21 @@ 'use strict' | ||
test('uses the custom successObject callback if passed in as an option', function (t) { | ||
const dest = split(JSON.parse) | ||
const logger = pinoHttp({ | ||
customSuccessObject: function (req, res, val) { | ||
return { ...val, label: req.method + ' customSuccessObject' } | ||
} | ||
}, dest) | ||
setup(t, logger, function (err, server) { | ||
t.error(err) | ||
doGet(server) | ||
}) | ||
dest.on('data', function (line) { | ||
t.equal(line.label, 'GET customSuccessObject') | ||
t.end() | ||
}) | ||
}) | ||
test('uses the custom receivedMessage callback if passed in as an option', function (t) { | ||
@@ -856,2 +875,53 @@ const dest = split(JSON.parse) | ||
test('uses the custom receivedObject callback if passed in as an option', function (t) { | ||
const dest = split(JSON.parse) | ||
const logger = pinoHttp({ | ||
customReceivedObject: function (req, val) { | ||
return { label: req.method + ' customReceivedObject' } | ||
} | ||
}, dest) | ||
setup(t, logger, function (err, server) { | ||
t.error(err) | ||
doGet(server) | ||
}) | ||
dest.on('data', function (line) { | ||
if (line.label === undefined) { | ||
return | ||
} | ||
t.equal(line.label, 'GET customReceivedObject') | ||
t.end() | ||
}) | ||
}) | ||
test('uses the custom receivedObject + receivedMessage callback if passed in as an option', function (t) { | ||
const dest = split(JSON.parse) | ||
const logger = pinoHttp({ | ||
customReceivedMessage: function (_req, _res) { | ||
return DEFAULT_REQUEST_RECEIVED_MSG | ||
}, | ||
customReceivedObject: function (req, val) { | ||
return { label: req.method + ' customReceivedObject' } | ||
} | ||
}, dest) | ||
setup(t, logger, function (err, server) { | ||
t.error(err) | ||
doGet(server) | ||
}) | ||
dest.on('data', function (line) { | ||
if (line.label === undefined && line.msg !== undefined) { | ||
return | ||
} | ||
t.equal(line.msg, DEFAULT_REQUEST_RECEIVED_MSG) | ||
t.equal(line.label, 'GET customReceivedObject') | ||
t.end() | ||
}) | ||
}) | ||
test('receve receivedMessage before successMessage', function (t) { | ||
@@ -899,2 +969,21 @@ t.plan(3) | ||
test('uses the custom errorObject callback if passed in as an option', function (t) { | ||
const dest = split(JSON.parse) | ||
const logger = pinoHttp({ | ||
customErrorObject: function (req, res, err, val) { | ||
return { ...val, label: 'customErrorObject ' + req.method + ' ' + err.toString() } | ||
} | ||
}, dest) | ||
setup(t, logger, function (err, server) { | ||
t.error(err) | ||
doGet(server, ERROR_URL) | ||
}) | ||
dest.on('data', function (line) { | ||
t.equal(line.label.indexOf('customErrorObject GET'), 0) | ||
t.end() | ||
}) | ||
}) | ||
test('receve receivedMessage before errorMessage', function (t) { | ||
@@ -901,0 +990,0 @@ t.plan(3) |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
71734
1675
451
- Removedpino-std-serializers@5.6.0(transitive)
Updatedpino-std-serializers@^6.0.0