From 33deb62684a5b46e52e38c73af865ed30006a470 Mon Sep 17 00:00:00 2001 From: Michael Shimmins <1013281+shimms@users.noreply.github.com> Date: Wed, 14 Aug 2024 20:55:39 +1000 Subject: [PATCH] include default meta in `addMeta` overwrite method --- docs/README.md | 38 +++++++++++++++++++++++++++++++++- docs/index.html | 43 ++++++++++++++++++++------------------- examples/nodejs/index2.ts | 25 ++++++++++++++++++++++- package-lock.json | 10 ++------- package.json | 2 +- src/BaseLogger.ts | 17 +++++++++++++++- src/interfaces.ts | 3 ++- 7 files changed, 104 insertions(+), 34 deletions(-) diff --git a/docs/README.md b/docs/README.md index c63af52..c5e2566 100644 --- a/docs/README.md +++ b/docs/README.md @@ -657,8 +657,10 @@ For every log: toLogObj: (args: unknown[], clonesLogObj?: LogObj): unknown => { // convert the log attributes to a LogObj and return it }, - addMeta: (logObj: any, logLevelId: number, logLevelName: string) => { + addMeta: (logObj: any, logLevelId: number, logLevelName: string, defaultMeta?: IMeta) => { // add meta information to the LogObj and return it + // defaultMeta is populated with the runtime's default meta if + // `settings.includeDefaultMetaInAddMeta` is set to true, otherwise is undefined } }, @@ -695,6 +697,40 @@ For `JSON` logs (no formatting happens here): }); ``` +#### Adding custom values to `_meta` + +In many instances it is desireable to add additional information to the `_meta` property, such as a request/correlation id +to help group logs from the one request cycle together. + +The `addMeta` overwrite method allows you to either extend the base runtime's default meta, or replace it entirely with your +own meta. + +To extend it with your own values, set the `includeDefaultMetaInAddMeta` setting to `true`. Once set to true, the `defaultMeta` +attribute fo the `addMeta` method will include the runtime's meta that you can extend: + +```typescript + interface IMetaWithRequest extends IMeta { + requestId: string + }; + + const logger = new Logger({ + includeDefaultMetaInAddMeta: true, + type: 'json', + metaProperty: "_meta", + overwrite: { + addMeta: (logObj: any, logLevelId: number, logLevelName: string, defaultMeta?: IMeta) => { + const meta = (defaultMeta || {}) as IMetaWithRequest; + meta.requestId = "0000-aaaaa-bbbbb-1111"; + + return { + ...logObj, + _meta: meta, + }; + } + }, + }); +``` + ### Defining and accessing `logObj` As described in "Lifecycle of a log message", every log message goes through some lifecycle steps and becomes an object representation of the log with the name `logObj`. A default logObj can be passed to the `tslog` constructor and will be cloned and merged into the log message. This makes `tslog` >= 4 highly configurable and easy to integrate into any 3rd party service. diff --git a/docs/index.html b/docs/index.html index f63d662..04dd4a7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,21 +1,22 @@ - - - - - tslog - Extensible TypeScript Logger for Node.js and Browser. - - - - - - -
- - - - + + + + + Document + + + + + + +
+ + + + + diff --git a/examples/nodejs/index2.ts b/examples/nodejs/index2.ts index a712fe7..288a230 100644 --- a/examples/nodejs/index2.ts +++ b/examples/nodejs/index2.ts @@ -1,4 +1,4 @@ -import { Logger, BaseLogger } from "../../src/index.js"; +import { Logger, BaseLogger, ILogObj, ILogObjMeta, IMeta } from "../../src/index.js"; const defaultLogObject: { name: string; @@ -130,3 +130,26 @@ jsonLogger.debug(undefined); //jsonLogger.debug('*', undefined); console.log("###############"); logger.debug(new URL("https://www.test.de")); + +interface IRequestMeta extends IMeta { + requestId: string; +} + +const newLogger = new Logger({ + type: "json", + metaProperty: "_meta", + overwrite: { + addMeta: (logObj: ILogObj, logLevelId: number, logLevelName: string, defaultMeta?: IMeta): ILogObj & ILogObjMeta => { + const meta = (defaultMeta || {}) as IRequestMeta; + meta.requestId = "0000-aaaaa-bbbbb-1111"; + + return { + ...logObj, + _meta: meta, + }; + }, + includeDefaultMetaInAddMeta: true, + }, +}); + +newLogger.info("Testing with metadata"); diff --git a/package-lock.json b/package-lock.json index efc06cf..cbb8ee3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tslog", - "version": "4.9.3", + "version": "4.9.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "tslog", - "version": "4.9.3", + "version": "4.9.4", "license": "MIT", "devDependencies": { "@jest/types": "^28.1.3", @@ -15104,12 +15104,6 @@ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", diff --git a/package.json b/package.json index 9a9b834..ed06827 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tslog", - "version": "4.9.3", + "version": "4.9.4", "description": "Extensible TypeScript Logger for Node.js and Browser.", "author": "Eugene (https://fullstack.build)", "license": "MIT", diff --git a/src/BaseLogger.ts b/src/BaseLogger.ts index c5cc026..952fcf8 100644 --- a/src/BaseLogger.ts +++ b/src/BaseLogger.ts @@ -68,6 +68,7 @@ export class BaseLogger { mask: settings?.overwrite?.mask, toLogObj: settings?.overwrite?.toLogObj, addMeta: settings?.overwrite?.addMeta, + includeDefaultMetaInAddMeta: settings?.overwrite?.includeDefaultMetaInAddMeta ?? false, addPlaceholders: settings?.overwrite?.addPlaceholders, formatMeta: settings?.overwrite?.formatMeta, formatLogObj: settings?.overwrite?.formatLogObj, @@ -101,7 +102,21 @@ export class BaseLogger { this.settings.overwrite?.toLogObj != null ? this.settings.overwrite?.toLogObj(maskedArgs, thisLogObj) : this._toLogObj(maskedArgs, thisLogObj); const logObjWithMeta: LogObj & ILogObjMeta = this.settings.overwrite?.addMeta != null - ? this.settings.overwrite?.addMeta(logObj, logLevelId, logLevelName) + ? this.settings.overwrite?.addMeta( + logObj, + logLevelId, + logLevelName, + this.settings.overwrite?.includeDefaultMetaInAddMeta ?? false + ? this.runtime.getMeta( + logLevelId, + logLevelName, + this.stackDepthLevel, + this.settings.hideLogPositionForProduction, + this.settings.name, + this.settings.parentNames + ) + : ({} as IMeta) + ) : this._addMetaToLogObj(logObj, logLevelId, logLevelName); // overwrite no matter what, should work for any type (pretty, json, ...) diff --git a/src/interfaces.ts b/src/interfaces.ts index a0f25a8..359cb63 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -60,7 +60,8 @@ export interface ISettingsParam { addPlaceholders?: (logObjMeta: IMeta, placeholderValues: Record) => void; mask?: (args: unknown[]) => unknown[]; toLogObj?: (args: unknown[], clonesLogObj?: LogObj) => LogObj; - addMeta?: (logObj: LogObj, logLevelId: number, logLevelName: string) => LogObj & ILogObjMeta; + addMeta?: (logObj: LogObj, logLevelId: number, logLevelName: string, defaultMeta?: IMeta) => LogObj & ILogObjMeta; + includeDefaultMetaInAddMeta?: boolean; formatMeta?: (meta?: IMeta) => string; formatLogObj?: (maskedArgs: unknown[], settings: ISettings) => { args: unknown[]; errors: string[] }; transportFormatted?: (logMetaMarkup: string, logArgs: unknown[], logErrors: string[], settings: ISettings) => void;