Skip to content

Commit 888cfe8

Browse files
authored
fix: Fixed queueing of logs from child loggers (#2945)
1 parent a9ba396 commit 888cfe8

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

lib/util/logger.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ Object.keys(LEVELS).forEach(function buildLevel(_level) {
9494

9595
function log(extra) {
9696
if (!this.options.configured) {
97-
this.logQueue.unshift({ level: _level, args: arguments })
97+
// queue a log line with level, args passed to logger and their respective extras
98+
this.logQueue.unshift({ level: _level, args: arguments, extra: this.extra })
9899
return
99100
}
100101

@@ -175,8 +176,9 @@ Object.keys(LEVELS).forEach(function buildLevel(_level) {
175176

176177
Logger.prototype._flushQueuedLogs = function _flushQueuedLogs() {
177178
while (this.logQueue.length) {
178-
const { level, args } = this.logQueue.shift()
179-
this[level].apply(this, args)
179+
const { level, args, extra } = this.logQueue.shift()
180+
// log an entry now that the logger has been configured
181+
this[level](extra, ...args)
180182
}
181183
}
182184

@@ -188,6 +190,7 @@ Logger.prototype.child = function child(extra) {
188190
childLogger.extra = Object.assign(Object.create(null), this.extra, extra)
189191

190192
const parent = this
193+
childLogger.logQueue = parent.logQueue
191194
childLogger.options = parent.options
192195

193196
childLogger.write = function write(level, args, _extra) {

test/unit/logger.test.js

+54
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,35 @@ const test = require('node:test')
99
const assert = require('node:assert')
1010
const path = require('node:path')
1111
const cp = require('node:child_process')
12+
const { Transform } = require('stream')
1213

1314
const tempRemoveListeners = require('../lib/temp-remove-listeners')
15+
function expectEntry(entry, msg, level, component) {
16+
assert.equal(entry.hostname, 'my-host')
17+
assert.equal(entry.name, 'test-logger')
18+
assert.equal(entry.pid, process.pid)
19+
assert.equal(entry.v, 0)
20+
assert.equal(entry.level, level)
21+
assert.equal(entry.msg, msg)
22+
if (component) {
23+
assert.equal(entry.component, component)
24+
}
25+
}
1426

1527
const Logger = require('../../lib/util/logger')
28+
function addResult(ctx, data, encoding, done) {
29+
ctx.nr.results = ctx.nr.results.concat(
30+
data.toString().split('\n').filter(Boolean).map(JSON.parse)
31+
)
32+
done()
33+
}
1634

1735
test.beforeEach((ctx) => {
1836
ctx.nr = {}
1937
ctx.nr.logger = new Logger({
2038
name: 'newrelic',
2139
level: 'trace',
40+
hostname: 'my-host',
2241
enabled: true,
2342
configured: true
2443
})
@@ -89,6 +108,41 @@ test('should flush logs when configured', (t) => {
89108
assert.ok(logger.logQueue.length === 0, 'should have 0 logs in the queue')
90109
})
91110

111+
test('should properly format logs and child logs when flushing', (t, end) => {
112+
const { logger } = t.nr
113+
t.nr.results = []
114+
logger.pipe(new Transform({
115+
transform: addResult.bind(this, t)
116+
}))
117+
logger.options.configured = false
118+
const child = logger.child({ component: 'test-child' })
119+
logger.trace('trace')
120+
logger.info('%d: %s', 1, 'a')
121+
logger.info('123', '4', '5')
122+
child.info('child-info')
123+
const e = new Error()
124+
e.name = 'Testing'
125+
e.message = 'Test message'
126+
child.trace(e, 'Test error')
127+
logger.configure({
128+
level: 'trace',
129+
enabled: true,
130+
name: 'test-logger'
131+
})
132+
child.error('Test error %d %s', 1, 'sub')
133+
process.nextTick(() => {
134+
const { results } = t.nr
135+
assert.equal(results.length, 6)
136+
expectEntry(results[0], '{"name":"Testing","message":"Test message"} Test error', 10, 'test-child')
137+
expectEntry(results[1], 'child-info', 30, 'test-child')
138+
expectEntry(results[2], '123 4 5', 30)
139+
expectEntry(results[3], '1: a', 30)
140+
expectEntry(results[4], 'trace', 10)
141+
expectEntry(results[5], 'Test error 1 sub', 50)
142+
end()
143+
})
144+
})
145+
92146
test('should fallback to default logging config when config is invalid', (t, end) => {
93147
runTestFile('disabled-with-invalid-config/disabled.js', function (error, message) {
94148
assert.equal(error, undefined)

0 commit comments

Comments
 (0)