Skip to content

Commit 87e50d5

Browse files
committed
refactor(logger): update enabled checks to use property access for log levels
1 parent 57f29b2 commit 87e50d5

File tree

3 files changed

+27
-68
lines changed

3 files changed

+27
-68
lines changed

doc/api/logger.md

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,7 @@ added: REPLACEME
278278
Each log method (`trace`, `debug`, `info`, `warn`, `error`, `fatal`) has an
279279
`enabled` property that indicates whether that level is enabled for this logger.
280280

281-
This is the recommended way to check if a level is enabled before performing
282-
expensive computations:
281+
Use this to check if a level is enabled before performing expensive computations:
283282

284283
```js
285284
if (logger.debug.enabled) {
@@ -291,28 +290,12 @@ if (logger.debug.enabled) {
291290
// logger.debg.enabled → TypeError: Cannot read properties of undefined
292291
```
293292

294-
### `logger.enabled(level)`
295-
296-
<!-- YAML
297-
added: REPLACEME
298-
-->
299-
300-
* `level` {string} The log level to check.
301-
* Returns: {boolean} `true` if the level is enabled, `false` otherwise.
302-
303-
Checks if a specific log level is enabled for this logger. For most use cases,
304-
prefer using [`logger.<level>.enabled`][] instead, as it catches typos at
305-
runtime.
293+
For dynamic level checks, use property access:
306294

307295
```js
308-
// Prefer this:
309-
if (logger.debug.enabled) {
310-
logger.debug('message');
311-
}
312-
313-
// Over this (typos won't throw):
314-
if (logger.enabled('debug')) {
315-
logger.debug('message');
296+
const level = config.logLevel; // 'info', 'debug', etc.
297+
if (logger[level]?.enabled) {
298+
logger[level]('Dynamic log message');
316299
}
317300
```
318301
@@ -351,32 +334,29 @@ consumer.attach();
351334
// Consumer now receives all log records at 'info' level and above
352335
```
353336
354-
### `consumer.enabled(level)`
337+
### `consumer.<level>.enabled`
355338
356339
<!-- YAML
357340
added: REPLACEME
358341
-->
359342
360-
* `level` {string} The log level to check (e.g., `'debug'`, `'info'`, `'warn'`,
361-
`'error'`, `'fatal'`).
362-
* Returns: {boolean} `true` if the level is enabled, `false` otherwise.
363-
364-
Checks if a specific log level is enabled for this consumer.
343+
* {boolean} `true` if the level is enabled, `false` otherwise.
365344
366-
This method returns `false` for unknown log levels without throwing an error.
367-
Log levels are case-sensitive and must be one of the predefined levels:
368-
`'trace'`, `'debug'`, `'info'`, `'warn'`, `'error'`, `'fatal'`.
345+
Each log level (`trace`, `debug`, `info`, `warn`, `error`, `fatal`) has an
346+
`enabled` property that indicates whether that level is enabled for this
347+
consumer.
369348
370349
```js
371350
const { LogConsumer } = require('node:logger');
372351

373352
const consumer = new LogConsumer({ level: 'info' });
374353

375-
console.log(consumer.enabled('debug')); // false (below threshold)
376-
console.log(consumer.enabled('info')); // true
377-
console.log(consumer.enabled('error')); // true
378-
console.log(consumer.enabled('DEBUG')); // false (unknown level - case sensitive)
379-
console.log(consumer.enabled('unknown')); // false (unknown level)
354+
console.log(consumer.debug.enabled); // false (below threshold)
355+
console.log(consumer.info.enabled); // true
356+
console.log(consumer.error.enabled); // true
357+
358+
// Typos will throw a TypeError (safer than silent failure)
359+
// consumer.debg.enabled → TypeError: Cannot read properties of undefined
380360
```
381361
382362
### `consumer.handle(record)`

lib/logger.js

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -93,24 +93,12 @@ class LogConsumer {
9393
}
9494
}
9595

96-
/**
97-
* Check if a level would be consumed
98-
* @param {string} level
99-
* @returns {boolean}
100-
*/
101-
enabled(level) {
102-
if (!ObjectHasOwn(LEVELS, level)) {
103-
return false;
104-
}
105-
return LEVELS[level] >= this.#levelValue;
106-
}
107-
10896
/**
10997
* Attach this consumer to log channels
11098
*/
11199
attach() {
112100
for (const level of LEVEL_NAMES) {
113-
if (this.enabled(level)) {
101+
if (this[level].enabled) {
114102
channels[level].subscribe(this.handle.bind(this));
115103
}
116104
}
@@ -363,15 +351,6 @@ class Logger {
363351
return fn;
364352
}
365353

366-
/**
367-
* Check if a level would be logged
368-
* @param {string} level - Log level to check
369-
* @returns {boolean} True if enabled, false otherwise
370-
*/
371-
enabled(level) {
372-
return LEVELS[level] >= this.#levelValue;
373-
}
374-
375354
/**
376355
* Create a child logger with additional context
377356
* @param {object} bindings - Context to add to all child logs

test/parallel/test-log-basic.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ describe('Logger', () => {
7373
describe('level filtering', () => {
7474
it('should filter logs based on configured level', () => {
7575
const logger = new Logger({ level: 'warn' });
76-
assert.strictEqual(logger.enabled('trace'), false);
77-
assert.strictEqual(logger.enabled('debug'), false);
78-
assert.strictEqual(logger.enabled('info'), false);
79-
assert.strictEqual(logger.enabled('warn'), true);
80-
assert.strictEqual(logger.enabled('error'), true);
81-
assert.strictEqual(logger.enabled('fatal'), true);
76+
assert.strictEqual(logger.trace.enabled, false);
77+
assert.strictEqual(logger.debug.enabled, false);
78+
assert.strictEqual(logger.info.enabled, false);
79+
assert.strictEqual(logger.warn.enabled, true);
80+
assert.strictEqual(logger.error.enabled, true);
81+
assert.strictEqual(logger.fatal.enabled, true);
8282
});
8383
});
8484

@@ -138,8 +138,8 @@ describe('child logger', () => {
138138

139139
assert(childLogger instanceof Logger);
140140
assert.notStrictEqual(childLogger, logger);
141-
assert.strictEqual(childLogger.enabled('info'), true);
142-
assert.strictEqual(childLogger.enabled('debug'), false);
141+
assert.strictEqual(childLogger.info.enabled, true);
142+
assert.strictEqual(childLogger.debug.enabled, false);
143143
});
144144

145145
it('should support nested child loggers', () => {
@@ -157,8 +157,8 @@ describe('child logger', () => {
157157
const logger = new Logger({ level: 'info' });
158158
const childLogger = logger.child({ requestId: 'abc' }, { level: 'debug' });
159159

160-
assert.strictEqual(logger.enabled('debug'), false);
161-
assert.strictEqual(childLogger.enabled('debug'), true);
160+
assert.strictEqual(logger.debug.enabled, false);
161+
assert.strictEqual(childLogger.debug.enabled, true);
162162
});
163163
});
164164

0 commit comments

Comments
 (0)