Skip to content

Commit 58abe87

Browse files
authored
feat: allow creating scoped loggers (#3214)
Adds `newScope` function to loggers that creates a logger under the current context. This is ultimately to allow unambiguous cascading log prefixes of: `libp2p` -> `transport` -> `connection` -> `muxer` -> `stream` E.g. `libp2p:tcp:connection:outbound:1:yamux:stream:inbound:1`
1 parent d3d33cf commit 58abe87

File tree

3 files changed

+54
-12
lines changed

3 files changed

+54
-12
lines changed

packages/interface/src/index.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,46 @@ export interface IdentifyResult {
127127
* Logger component for libp2p
128128
*/
129129
export interface Logger {
130+
/**
131+
* Log a message
132+
*/
130133
(formatter: any, ...args: any[]): void
134+
135+
/**
136+
* Log an error message
137+
*/
131138
error(formatter: any, ...args: any[]): void
139+
140+
/**
141+
* Log a trace message
142+
*/
132143
trace(formatter: any, ...args: any[]): void
144+
145+
/**
146+
* `true` if this logger is enabled
147+
*/
133148
enabled: boolean
149+
150+
/**
151+
* Create a logger scoped below this one
152+
*
153+
* @example
154+
*
155+
* ```ts
156+
* import { defaultLogger } from '@libp2p/logger'
157+
*
158+
* const log = defaultLogger().forComponent('foo')
159+
*
160+
* log('hello')
161+
* // foo hello
162+
*
163+
* const subLog = log.newScope('bar')
164+
*
165+
* subLog('hello')
166+
* // foo:bar hello
167+
* ```
168+
*/
169+
newScope(name: string): Logger
134170
}
135171

136172
/**

packages/logger/src/index.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import { base58btc } from 'multiformats/bases/base58'
3737
import { base64 } from 'multiformats/bases/base64'
3838
import debug from 'weald'
3939
import { truncatePeerId } from './utils.js'
40-
import type { PeerId } from '@libp2p/interface'
40+
import type { PeerId, Logger, ComponentLogger } from '@libp2p/interface'
4141
import type { Multiaddr } from '@multiformats/multiaddr'
4242
import type { Key } from 'interface-datastore'
4343
import type { CID } from 'multiformats/cid'
@@ -82,16 +82,7 @@ debug.formatters.e = (v?: Error): string => {
8282
return v == null ? 'undefined' : notEmpty(v.stack) ?? notEmpty(v.message) ?? v.toString()
8383
}
8484

85-
export interface Logger {
86-
(formatter: any, ...args: any[]): void
87-
error(formatter: any, ...args: any[]): void
88-
trace(formatter: any, ...args: any[]): void
89-
enabled: boolean
90-
}
91-
92-
export interface ComponentLogger {
93-
forComponent(name: string): Logger
94-
}
85+
export type { Logger, ComponentLogger }
9586

9687
function createDisabledLogger (namespace: string): debug.Debugger {
9788
const logger = (): void => {}
@@ -205,7 +196,8 @@ export function logger (name: string): Logger {
205196

206197
return Object.assign(debug(name), {
207198
error: debug(`${name}:error`),
208-
trace
199+
trace,
200+
newScope: (scope: string) => logger(`${name}:${scope}`)
209201
})
210202
}
211203

packages/logger/test/index.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,20 @@ describe('logger', () => {
7979
expect(log).to.have.nested.property('trace.enabled').that.is.true()
8080
})
8181

82+
it('creates a sub logger', () => {
83+
debug.enable('enabled-with-trace-logger*,*:trace')
84+
85+
const log = logger('enabled-with-trace-logger')
86+
const subLog = log.newScope('sub-component')
87+
88+
expect(subLog).to.be.a('function')
89+
expect(subLog).to.have.property('enabled').that.is.true()
90+
expect(subLog).to.have.property('error').that.is.a('function')
91+
expect(subLog).to.have.nested.property('error.enabled').that.is.true()
92+
expect(subLog).to.have.property('trace').that.is.a('function')
93+
expect(subLog).to.have.nested.property('trace.enabled').that.is.true()
94+
})
95+
8296
it('has all formatters', () => {
8397
debug.enable('enabled-with-formatters')
8498

0 commit comments

Comments
 (0)