From c0080556c8f8501d39e695a9ccd6308faf9f5287 Mon Sep 17 00:00:00 2001 From: Jacob Page Date: Wed, 13 Mar 2024 17:25:03 -0700 Subject: [PATCH] Support field customization Support customization of fields on a per-request basis --- packages/ecs-morgan-format/index.d.ts | 3 +++ packages/ecs-morgan-format/index.js | 2 ++ packages/ecs-morgan-format/test/basic.test.js | 23 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/packages/ecs-morgan-format/index.d.ts b/packages/ecs-morgan-format/index.d.ts index 3ca96a8..33cd253 100644 --- a/packages/ecs-morgan-format/index.d.ts +++ b/packages/ecs-morgan-format/index.d.ts @@ -1,3 +1,4 @@ +import type { IncomingMessage, ServerResponse } from 'http'; import type { FormatFn } from "morgan"; interface Config { @@ -42,6 +43,8 @@ interface Config { /** Specify "event.dataset" field. Defaults `${serviceName}`. */ eventDataset?: string; + /** Callback for custom modification of the fields */ + logHook: (event: { record: any, req: IncomingMessage, res: ServerResponse }) => void; } declare function ecsFormat(config?: Config): FormatFn; diff --git a/packages/ecs-morgan-format/index.js b/packages/ecs-morgan-format/index.js index b3d2da7..e4e402a 100644 --- a/packages/ecs-morgan-format/index.js +++ b/packages/ecs-morgan-format/index.js @@ -175,6 +175,8 @@ function ecsFormat (opts) { formatHttpRequest(ecsFields, req) formatHttpResponse(ecsFields, res) + opts.logHook && opts.logHook({ record: ecsFields, req, res }) + return stringify(ecsFields) } } diff --git a/packages/ecs-morgan-format/test/basic.test.js b/packages/ecs-morgan-format/test/basic.test.js index 090986e..dc1c1f3 100644 --- a/packages/ecs-morgan-format/test/basic.test.js +++ b/packages/ecs-morgan-format/test/basic.test.js @@ -235,3 +235,26 @@ test('can configure correlation fields', t => { t.end() }) }) + +test('can provide custom fields', t => { + t.plan(2) + + const stream = split().on('data', line => { + const rec = JSON.parse(line) + t.equal(rec.labels.custom, 'customValue') + }) + const logger = morgan( + ecsFormat({ + logHook ({ record, req, res }) { + record.labels = record.labels || {} + record.labels.custom = 'customValue' + } + }), + { stream } + ) + + makeExpressServerAndRequest(logger, '/', {}, null, function (err) { + t.error(err) + t.end() + }) +})