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() + }) +})