From b7ddd1eeba44f6a4a0f7de13e5c5c7ee39dbf720 Mon Sep 17 00:00:00 2001 From: mhatipog Date: Wed, 14 Oct 2026 01:15:11 +0200 Subject: [PATCH 1/2] fix: preserve falsy logstash messages and timestamps --- logstash.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/logstash.js b/logstash.js index 3493733..e56a516 100644 --- a/logstash.js +++ b/logstash.js @@ -13,12 +13,12 @@ const jsonStringify = require('safe-stable-stringify'); */ module.exports = format(info => { const logstash = {}; - if (info.message) { + if (info.message !== undefined) { logstash['@message'] = info.message; delete info.message; } - if (info.timestamp) { + if (info.timestamp !== undefined) { logstash['@timestamp'] = info.timestamp; delete info.timestamp; } From d8ab65bbb2db6555a129f6a52bfedd3bdd829c95 Mon Sep 17 00:00:00 2001 From: mhatipog Date: Wed, 14 Oct 2026 01:15:19 +0200 Subject: [PATCH 2/2] test: cover empty messages and epoch timestamps --- test/logstash.test.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/logstash.test.js b/test/logstash.test.js index 1248ade..9522609 100644 --- a/test/logstash.test.js +++ b/test/logstash.test.js @@ -42,4 +42,22 @@ describe('logstash', () => { })); } )); + + it('preserves empty messages and zero timestamps', helpers.assumeFormatted( + logstash(), + { level: 'info', message: '', timestamp: 0, context: 'example' }, + info => { + assume(info.message).equals(undefined); + assume(info.timestamp).equals(undefined); + assume(info[MESSAGE]).equals(JSON.stringify({ + '@message': '', + '@timestamp': 0, + '@fields': { + level: 'info', + context: 'example' + } + })); + } + )); + });