@dotcom-reliability-kit/logger
Advanced tools
Comparing version 0.1.0 to 0.1.1
declare const _exports: { | ||
"__#1@#logLevel": Logger.LogLevel; | ||
"__#1@#baseLogData": any; | ||
"__#1@#transforms": Logger.LogTransform[]; | ||
"__#1@#logTransport": Logger.LogTransport; | ||
@@ -5,0 +6,0 @@ "__#1@#deprecatedMethodTracker": string[]; |
@@ -26,3 +26,3 @@ export = Logger; | ||
declare namespace Logger { | ||
export { exports as default, LogLevel, LogData, LoggerOptions, PrivateLoggerOptions, LogTransport, LogLevelInfo }; | ||
export { exports as default, LogLevel, LogData, LoggerOptions, PrivateLoggerOptions, LogTransform, LogTransport, LogLevelInfo }; | ||
} | ||
@@ -43,2 +43,3 @@ type LogLevel = "silly" | "data" | "debug" | "verbose" | "info" | "warn" | "error" | "fatal"; | ||
logLevel?: LogLevel | undefined; | ||
transforms?: LogTransform[] | undefined; | ||
withTimestamps?: boolean | undefined; | ||
@@ -50,4 +51,9 @@ }; | ||
declare namespace exports { | ||
export { exports as default, LogLevel, LogData, LoggerOptions, PrivateLoggerOptions, LogTransport, LogLevelInfo }; | ||
export { exports as default, LogLevel, LogData, LoggerOptions, PrivateLoggerOptions, LogTransform, LogTransport, LogLevelInfo }; | ||
} | ||
type LogTransform = (logData: { | ||
[x: string]: any; | ||
}) => { | ||
[x: string]: any; | ||
}; | ||
type LogLevelInfo = { | ||
@@ -54,0 +60,0 @@ logLevel: LogLevel; |
@@ -20,2 +20,4 @@ const pino = require('pino').default; | ||
* beneath this will be ignored. | ||
* @property {Array<LogTransform>} [transforms = []] | ||
* Transforms to apply to logs before sending. | ||
* @property {boolean} [withTimestamps = true] | ||
@@ -32,2 +34,10 @@ * Whether to send the timestamp that each log method was called. | ||
/** | ||
* @callback LogTransform | ||
* @param {Object<string, any>} logData | ||
* The log data to transform. | ||
* @returns {Object<string, any>} | ||
* Returns the transformed log data. | ||
*/ | ||
/** | ||
* @typedef {object} LogTransport | ||
@@ -92,2 +102,7 @@ * @property {string} [level] | ||
/** | ||
* @type {Array<LogTransform>} | ||
*/ | ||
#transforms = []; | ||
/** | ||
* @type {LogTransport} | ||
@@ -126,2 +141,17 @@ */ | ||
// Default and set the transforms option | ||
if (options.transforms) { | ||
if ( | ||
!Array.isArray(options.transforms) || | ||
!options.transforms.every( | ||
(transform) => typeof transform === 'function' | ||
) | ||
) { | ||
throw new TypeError( | ||
'The `transforms` option must be an array of functions' | ||
); | ||
} | ||
this.#transforms = options.transforms; | ||
} | ||
// Default and set the timestamps option. | ||
@@ -190,3 +220,4 @@ const withTimestamps = options.withTimestamps !== false; | ||
baseLogData: Object.assign({}, this.#baseLogData, baseLogData), | ||
logLevel: this.#logLevel | ||
logLevel: this.#logLevel, | ||
transforms: this.#transforms | ||
}); | ||
@@ -276,4 +307,13 @@ } | ||
// Transform the log data | ||
let transformedLogData = structuredClone(sanitizedLogData); | ||
if (this.#transforms.length) { | ||
transformedLogData = this.#transforms.reduce( | ||
(logData, transform) => transform(logData), | ||
transformedLogData | ||
); | ||
} | ||
// Send the log | ||
this.transport[logLevel](sanitizedLogData); | ||
this.transport[logLevel](transformedLogData); | ||
@@ -280,0 +320,0 @@ // If the log level is deprecated, then log a warning about that |
{ | ||
"name": "@dotcom-reliability-kit/logger", | ||
"version": "0.1.0", | ||
"version": "0.1.1", | ||
"description": "A simple and fast logger based on Pino, with FT preferences baked in", | ||
@@ -5,0 +5,0 @@ "repository": { |
@@ -15,2 +15,3 @@ | ||
* [`options.logLevel`](#optionsloglevel) | ||
* [`options.transforms`](#optionstransforms) | ||
* [`options.withTimestamps`](#optionswithtimestamps) | ||
@@ -148,2 +149,41 @@ * [`logger.log()` and shortcut methods](#loggerlog-and-shortcut-methods) | ||
#### `options.transforms` | ||
An array of functions which are called on log data before logs are output. This allows you to apply transformations to the final log object before it's sent. | ||
Each log transform must be a function which accepts a single object argument and returns an object. Expressed as TypeScript types: | ||
```ts | ||
type LogData = {[x: string]: any}; | ||
type Tranform = (logData: LogData) => LogData | ||
``` | ||
You can pass as many transforms as you need, though you must consider performance – each function will be called on every log that's sent. | ||
```js | ||
function uppercaseProperties(logData) { | ||
const entries = Object.entries(logData).map(([property, value]) => { | ||
return [property.toUpperCase(), value]; | ||
}); | ||
return Object.fromEntries(entries); | ||
} | ||
const logger = new Logger({ | ||
transforms: [ | ||
uppercaseProperties | ||
] | ||
}); | ||
logger.info({ | ||
time: 1234567890, | ||
message: 'Hello World' | ||
}); | ||
// Outputs: | ||
// { | ||
// "LEVEL": "info", | ||
// "MESSAGE": "This is a log", | ||
// "TIME": 1234567890 | ||
// } | ||
``` | ||
#### `options.withTimestamps` | ||
@@ -150,0 +190,0 @@ |
Sorry, the diff of this file is not supported yet
35392
553
475