Skip to content

Commit 0f7d63e

Browse files
feat: Logger with log levels (#1672)
* setup a custom Logger with log level support * refactor codebase for to use new Logger with log levels * disallow usage of `debug` directly / only allow usage in/through custom Logger * remove `debug` from logger
1 parent 1150ddc commit 0f7d63e

37 files changed

+306
-216
lines changed

.eslintrc.json

+9
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@
1616
],
1717
"globals": { "BigInt": true, "console": true, "WebAssembly": true },
1818
"rules": {
19+
"no-restricted-imports": [
20+
"error",
21+
{
22+
"paths": [{
23+
"name": "debug",
24+
"message": "The usage of 'debug' package directly is disallowed. Please use the custom logger from @waku/utils instead."
25+
}]
26+
}
27+
],
1928
"prettier/prettier": [
2029
"error",
2130
{

packages/core/src/lib/connection_manager.ts

+28-22
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ import {
1717
} from "@waku/interfaces";
1818
import { Libp2p, Tags } from "@waku/interfaces";
1919
import { shardInfoToPubSubTopics } from "@waku/utils";
20-
import debug from "debug";
20+
import { Logger } from "@waku/utils";
2121

2222
import { KeepAliveManager } from "./keep_alive_manager.js";
2323

24-
const log = debug("waku:connection-manager");
24+
const log = new Logger("connection-manager");
2525

2626
export const DEFAULT_MAX_BOOTSTRAP_PEERS_ALLOWED = 1;
2727
export const DEFAULT_MAX_DIAL_ATTEMPTS_FOR_PEER = 3;
@@ -128,14 +128,16 @@ export class ConnectionManager
128128
this.keepAliveManager = new KeepAliveManager(keepAliveOptions, relay);
129129

130130
this.run()
131-
.then(() => log(`Connection Manager is now running`))
132-
.catch((error) => log(`Unexpected error while running service`, error));
131+
.then(() => log.info(`Connection Manager is now running`))
132+
.catch((error) =>
133+
log.error(`Unexpected error while running service`, error)
134+
);
133135

134136
// libp2p emits `peer:discovery` events during its initialization
135137
// which means that before the ConnectionManager is initialized, some peers may have been discovered
136138
// we will dial the peers in peerStore ONCE before we start to listen to the `peer:discovery` events within the ConnectionManager
137139
this.dialPeerStorePeers().catch((error) =>
138-
log(`Unexpected error while dialing peer store peers`, error)
140+
log.error(`Unexpected error while dialing peer store peers`, error)
139141
);
140142
}
141143

@@ -153,7 +155,7 @@ export class ConnectionManager
153155
try {
154156
await Promise.all(dialPromises);
155157
} catch (error) {
156-
log(`Unexpected error while dialing peer store peers`, error);
158+
log.error(`Unexpected error while dialing peer store peers`, error);
157159
}
158160
}
159161

@@ -185,7 +187,9 @@ export class ConnectionManager
185187
let dialAttempt = 0;
186188
while (dialAttempt < this.options.maxDialAttemptsForPeer) {
187189
try {
188-
log(`Dialing peer ${peerId.toString()} on attempt ${dialAttempt + 1}`);
190+
log.info(
191+
`Dialing peer ${peerId.toString()} on attempt ${dialAttempt + 1}`
192+
);
189193
await this.libp2p.dial(peerId);
190194

191195
const tags = await this.getTagNamesForPeer(peerId);
@@ -201,10 +205,12 @@ export class ConnectionManager
201205
} catch (error) {
202206
if (error instanceof AggregateError) {
203207
// Handle AggregateError
204-
log(`Error dialing peer ${peerId.toString()} - ${error.errors}`);
208+
log.error(
209+
`Error dialing peer ${peerId.toString()} - ${error.errors}`
210+
);
205211
} else {
206212
// Handle generic error
207-
log(
213+
log.error(
208214
`Error dialing peer ${peerId.toString()} - ${
209215
(error as any).message
210216
}`
@@ -230,18 +236,18 @@ export class ConnectionManager
230236
let errorMessage;
231237
if (error instanceof AggregateError) {
232238
if (!error.errors) {
233-
log(`No errors array found for AggregateError`);
239+
log.warn(`No errors array found for AggregateError`);
234240
} else if (error.errors.length === 0) {
235-
log(`Errors array is empty for AggregateError`);
241+
log.warn(`Errors array is empty for AggregateError`);
236242
} else {
237243
errorMessage = JSON.stringify(error.errors[0]);
238244
}
239245
} else {
240246
errorMessage = error.message;
241247
}
242248

243-
log(
244-
`Deleting undialable peer ${peerId.toString()} from peer store. Error: ${errorMessage}`
249+
log.info(
250+
`Deleting undialable peer ${peerId.toString()} from peer store. Reason: ${errorMessage}`
245251
);
246252
}
247253

@@ -259,9 +265,9 @@ export class ConnectionManager
259265
try {
260266
this.keepAliveManager.stop(peerId);
261267
await this.libp2p.hangUp(peerId);
262-
log(`Dropped connection with peer ${peerId.toString()}`);
268+
log.info(`Dropped connection with peer ${peerId.toString()}`);
263269
} catch (error) {
264-
log(
270+
log.error(
265271
`Error dropping connection with peer ${peerId.toString()} - ${error}`
266272
);
267273
}
@@ -275,7 +281,7 @@ export class ConnectionManager
275281
const peerId = this.pendingPeerDialQueue.shift();
276282
if (!peerId) return;
277283
this.attemptDial(peerId).catch((error) => {
278-
log(error);
284+
log.error(error);
279285
});
280286
}
281287
}
@@ -322,7 +328,7 @@ export class ConnectionManager
322328
}
323329

324330
this.dialPeer(peerId).catch((err) => {
325-
log(`Error dialing peer ${peerId.toString()} : ${err}`);
331+
log.error(`Error dialing peer ${peerId.toString()} : ${err}`);
326332
});
327333
}
328334

@@ -336,7 +342,7 @@ export class ConnectionManager
336342
try {
337343
await this.attemptDial(peerId);
338344
} catch (error) {
339-
log(`Error dialing peer ${peerId.toString()} : ${error}`);
345+
log.error(`Error dialing peer ${peerId.toString()} : ${error}`);
340346
}
341347
})();
342348
},
@@ -404,7 +410,7 @@ export class ConnectionManager
404410
// if we're already connected to the peer, don't dial
405411
const isConnected = this.libp2p.getConnections(peerId).length > 0;
406412
if (isConnected) {
407-
log(`Already connected to peer ${peerId.toString()}. Not dialing.`);
413+
log.warn(`Already connected to peer ${peerId.toString()}. Not dialing.`);
408414
return false;
409415
}
410416

@@ -414,7 +420,7 @@ export class ConnectionManager
414420
peerId,
415421
this.libp2p.peerStore
416422
);
417-
log(
423+
log.warn(
418424
`Discovered peer ${peerId.toString()} with ShardInfo ${shardInfo} is not part of any of the configured pubsub topics (${
419425
this.configuredPubSubTopics
420426
}).
@@ -425,7 +431,7 @@ export class ConnectionManager
425431

426432
// if the peer is not dialable based on bootstrap status, don't dial
427433
if (!(await this.isPeerDialableBasedOnBootstrapStatus(peerId))) {
428-
log(
434+
log.warn(
429435
`Peer ${peerId.toString()} is not dialable based on bootstrap status. Not dialing.`
430436
);
431437
return false;
@@ -486,7 +492,7 @@ export class ConnectionManager
486492
const peer = await this.libp2p.peerStore.get(peerId);
487493
return Array.from(peer.tags.keys());
488494
} catch (error) {
489-
log(`Failed to get peer ${peerId}, error: ${error}`);
495+
log.error(`Failed to get peer ${peerId}, error: ${error}`);
490496
return [];
491497
}
492498
}

packages/core/src/lib/filter/index.ts

+18-17
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
groupByContentTopic,
2323
toAsyncIterator
2424
} from "@waku/utils";
25-
import debug from "debug";
25+
import { Logger } from "@waku/utils";
2626
import all from "it-all";
2727
import * as lp from "it-length-prefixed";
2828
import { pipe } from "it-pipe";
@@ -36,7 +36,7 @@ import {
3636
FilterSubscribeRpc
3737
} from "./filter_rpc.js";
3838

39-
const log = debug("waku:filter:v2");
39+
const log = new Logger("filter:v2");
4040

4141
type SubscriptionCallback<T extends IDecodedMessage> = {
4242
decoders: IDecoder<T>[];
@@ -108,7 +108,7 @@ class Subscription {
108108
);
109109
}
110110

111-
log(
111+
log.info(
112112
"Subscribed to peer ",
113113
this.peer.id.toString(),
114114
"for content topics",
@@ -183,9 +183,9 @@ class Subscription {
183183
);
184184
}
185185

186-
log("Ping successful");
186+
log.info("Ping successful");
187187
} catch (error) {
188-
log("Error pinging: ", error);
188+
log.error("Error pinging: ", error);
189189
throw new Error("Error pinging: " + error);
190190
}
191191
}
@@ -216,7 +216,7 @@ class Subscription {
216216
}
217217

218218
this.subscriptionCallbacks.clear();
219-
log("Unsubscribed from all content topics");
219+
log.info("Unsubscribed from all content topics");
220220
} catch (error) {
221221
throw new Error("Error unsubscribing from all content topics: " + error);
222222
}
@@ -226,7 +226,7 @@ class Subscription {
226226
const contentTopic = message.contentTopic;
227227
const subscriptionCallback = this.subscriptionCallbacks.get(contentTopic);
228228
if (!subscriptionCallback) {
229-
log("No subscription callback available for ", contentTopic);
229+
log.error("No subscription callback available for ", contentTopic);
230230
return;
231231
}
232232
await pushMessage(subscriptionCallback, this.pubsubTopic, message);
@@ -260,7 +260,7 @@ class Filter extends BaseProtocol implements IReceiver {
260260
this.pubsubTopics = options?.pubsubTopics || [DefaultPubSubTopic];
261261

262262
libp2p.handle(FilterCodecs.PUSH, this.onRequest.bind(this)).catch((e) => {
263-
log("Failed to register ", FilterCodecs.PUSH, e);
263+
log.error("Failed to register ", FilterCodecs.PUSH, e);
264264
});
265265

266266
this.activeSubscriptions = new Map();
@@ -332,7 +332,6 @@ class Filter extends BaseProtocol implements IReceiver {
332332
}
333333

334334
private onRequest(streamData: IncomingStreamData): void {
335-
log("Receiving message push");
336335
try {
337336
pipe(streamData.stream, lp.decode, async (source) => {
338337
for await (const bytes of source) {
@@ -341,12 +340,12 @@ class Filter extends BaseProtocol implements IReceiver {
341340
const { pubsubTopic, wakuMessage } = response;
342341

343342
if (!wakuMessage) {
344-
log("Received empty message");
343+
log.error("Received empty message");
345344
return;
346345
}
347346

348347
if (!pubsubTopic) {
349-
log("PubSub topic missing from push message");
348+
log.error("PubSub topic missing from push message");
350349
return;
351350
}
352351

@@ -357,22 +356,24 @@ class Filter extends BaseProtocol implements IReceiver {
357356
);
358357

359358
if (!subscription) {
360-
log(`No subscription locally registered for topic ${pubsubTopic}`);
359+
log.error(
360+
`No subscription locally registered for topic ${pubsubTopic}`
361+
);
361362
return;
362363
}
363364

364365
await subscription.processMessage(wakuMessage);
365366
}
366367
}).then(
367368
() => {
368-
log("Receiving pipe closed.");
369+
log.info("Receiving pipe closed.");
369370
},
370371
(e) => {
371-
log("Error with receiving pipe", e);
372+
log.error("Error with receiving pipe", e);
372373
}
373374
);
374375
} catch (e) {
375-
log("Error decoding message", e);
376+
log.error("Error decoding message", e);
376377
}
377378
}
378379
}
@@ -392,7 +393,7 @@ async function pushMessage<T extends IDecodedMessage>(
392393

393394
const { contentTopic } = message;
394395
if (!contentTopic) {
395-
log("Message has no content topic, skipping");
396+
log.warn("Message has no content topic, skipping");
396397
return;
397398
}
398399

@@ -407,6 +408,6 @@ async function pushMessage<T extends IDecodedMessage>(
407408

408409
await callback(decodedMessage);
409410
} catch (e) {
410-
log("Error decoding message", e);
411+
log.error("Error decoding message", e);
411412
}
412413
}

packages/core/src/lib/keep_alive_manager.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import type { PeerId } from "@libp2p/interface/peer-id";
22
import type { PeerStore } from "@libp2p/interface/peer-store";
33
import type { IRelay, PeerIdStr } from "@waku/interfaces";
44
import type { KeepAliveOptions } from "@waku/interfaces";
5+
import { Logger } from "@waku/utils";
56
import { utf8ToBytes } from "@waku/utils/bytes";
6-
import debug from "debug";
77
import type { PingService } from "libp2p/ping";
88

99
import { createEncoder } from "./message/version_0.js";
1010

1111
export const RelayPingContentTopic = "/relay-ping/1/ping/null";
12-
const log = debug("waku:keep-alive");
12+
const log = new Logger("keep-alive");
1313

1414
export class KeepAliveManager {
1515
private pingKeepAliveTimers: Map<string, ReturnType<typeof setInterval>>;
@@ -48,9 +48,9 @@ export class KeepAliveManager {
4848
// also update the peer store with the latency
4949
try {
5050
ping = await libp2pPing.ping(peerId);
51-
log(`Ping succeeded (${peerIdStr})`, ping);
51+
log.info(`Ping succeeded (${peerIdStr})`, ping);
5252
} catch (error) {
53-
log(`Ping failed for peer (${peerIdStr}).
53+
log.error(`Ping failed for peer (${peerIdStr}).
5454
Next ping will be attempted in ${pingPeriodSecs} seconds.
5555
`);
5656
return;
@@ -63,10 +63,10 @@ export class KeepAliveManager {
6363
}
6464
});
6565
} catch (e) {
66-
log("Failed to update ping", e);
66+
log.error("Failed to update ping", e);
6767
}
6868
} catch (e) {
69-
log(`Ping failed (${peerIdStr})`, e);
69+
log.error(`Ping failed (${peerIdStr})`, e);
7070
}
7171
})();
7272
}, pingPeriodSecs * 1000);
@@ -128,10 +128,10 @@ export class KeepAliveManager {
128128
ephemeral: true
129129
});
130130
const interval = setInterval(() => {
131-
log("Sending Waku Relay ping message");
131+
log.info("Sending Waku Relay ping message");
132132
relay
133133
.send(encoder, { payload: new Uint8Array([1]) })
134-
.catch((e) => log("Failed to send relay ping", e));
134+
.catch((e) => log.error("Failed to send relay ping", e));
135135
}, relayPeriodSecs * 1000);
136136
intervals.push(interval);
137137
}

0 commit comments

Comments
 (0)