Skip to content

Commit 19b1b90

Browse files
authored
Inherit methodFactory extensions from the parent to the child loggers. (#4809)
* use methodFactory extensions from the rootLogger in child loggers. * use simple method factory copy AND `childLogger.setLevel(childLogger.getLevel());` This is the important part that actually registers the new methods. * add comments and find a way to make it clearer that the types are correct. * review * additionally fix MatrixRTCSessionManager being initialized before the extension is in place. * Add comment to clarify order of log extensions and creating childs. * review * Set "loglevel" min version to guarantee access to `logger.rebuild`
1 parent 1f52fa0 commit 19b1b90

File tree

4 files changed

+26
-11
lines changed

4 files changed

+26
-11
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
"bs58": "^6.0.0",
5757
"content-type": "^1.0.4",
5858
"jwt-decode": "^4.0.0",
59-
"loglevel": "^1.7.1",
59+
"loglevel": "^1.9.2",
6060
"matrix-events-sdk": "0.0.1",
6161
"matrix-widget-api": "^1.10.0",
6262
"oidc-client-ts": "^3.0.1",

src/logger.ts

+18-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ export interface Logger extends BaseLogger {
3434
/**
3535
* Create a child logger.
3636
*
37+
* This child will use the `methodFactory` of the parent, so any log extensions applied to the parent
38+
* at the time of calling `getChild` will be applied to the child as well.
39+
* It will NOT apply changes to the parent's `methodFactory` after the child was created.
40+
* Those changes need to be applied to the child manually.
41+
*
3742
* @param namespace - name to add to the current logger to generate the child. Some implementations of `Logger`
3843
* use this as a prefix; others use a different mechanism.
3944
*/
@@ -128,14 +133,24 @@ interface PrefixedLogger extends loglevel.Logger, LoggerWithLogMethod {
128133
*
129134
* @param prefix Prefix to add to each logged line. If undefined, no prefix will be added.
130135
*/
131-
function getPrefixedLogger(prefix?: string): LoggerWithLogMethod {
136+
function getPrefixedLogger(prefix?: string): PrefixedLogger {
132137
const loggerName = DEFAULT_NAMESPACE + (prefix === undefined ? "" : `-${prefix}`);
133138
const prefixLogger = loglevel.getLogger(loggerName) as PrefixedLogger;
134139

135140
if (prefixLogger.getChild === undefined) {
136141
// This is a new loglevel Logger which has not been turned into a PrefixedLogger yet.
137142
prefixLogger.prefix = prefix;
138-
prefixLogger.getChild = (childPrefix): Logger => getPrefixedLogger((prefix ?? "") + childPrefix);
143+
prefixLogger.getChild = (childPrefix): Logger => {
144+
// create the new child logger
145+
const childLogger = getPrefixedLogger((prefix ?? "") + childPrefix);
146+
// Assign the methodFactory from the parent logger.
147+
// This is useful if we add extensions to the parent logger that modifies
148+
// its methodFactory. (An example extension is: storing each log to a rageshake db)
149+
childLogger.methodFactory = prefixLogger.methodFactory;
150+
// Rebuild the child logger with the new methodFactory.
151+
childLogger.rebuild();
152+
return childLogger;
153+
};
139154
prefixLogger.setLevel(loglevel.levels.DEBUG, false);
140155
}
141156

@@ -146,7 +161,7 @@ function getPrefixedLogger(prefix?: string): LoggerWithLogMethod {
146161
* Drop-in replacement for `console` using {@link https://www.npmjs.com/package/loglevel|loglevel}.
147162
* Can be tailored down to specific use cases if needed.
148163
*/
149-
export const logger = getPrefixedLogger();
164+
export const logger = getPrefixedLogger() as LoggerWithLogMethod;
150165

151166
/**
152167
* A "span" for grouping related log lines together.

src/matrixrtc/MatrixRTCSessionManager.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
import { logger as rootLogger } from "../logger.ts";
17+
import { logger as rootLogger, type Logger } from "../logger.ts";
1818
import { type MatrixClient, ClientEvent } from "../client.ts";
1919
import { TypedEventEmitter } from "../models/typed-event-emitter.ts";
2020
import { type Room } from "../models/room.ts";
@@ -23,8 +23,6 @@ import { type MatrixEvent } from "../models/event.ts";
2323
import { MatrixRTCSession } from "./MatrixRTCSession.ts";
2424
import { EventType } from "../@types/event.ts";
2525

26-
const logger = rootLogger.getChild("[MatrixRTCSessionManager]");
27-
2826
export enum MatrixRTCSessionManagerEvents {
2927
// A member has joined the MatrixRTC session, creating an active session in a room where there wasn't previously
3028
SessionStarted = "session_started",
@@ -50,8 +48,10 @@ export class MatrixRTCSessionManager extends TypedEventEmitter<MatrixRTCSessionM
5048
// longer the correct session object for the room.
5149
private roomSessions = new Map<string, MatrixRTCSession>();
5250

51+
private logger: Logger;
5352
public constructor(private client: MatrixClient) {
5453
super();
54+
this.logger = rootLogger.getChild("[MatrixRTCSessionManager]");
5555
}
5656

5757
public start(): void {
@@ -105,7 +105,7 @@ export class MatrixRTCSessionManager extends TypedEventEmitter<MatrixRTCSessionM
105105
private onRoomState = (event: MatrixEvent, _state: RoomState): void => {
106106
const room = this.client.getRoom(event.getRoomId());
107107
if (!room) {
108-
logger.error(`Got room state event for unknown room ${event.getRoomId()}!`);
108+
this.logger.error(`Got room state event for unknown room ${event.getRoomId()}!`);
109109
return;
110110
}
111111

@@ -129,10 +129,10 @@ export class MatrixRTCSessionManager extends TypedEventEmitter<MatrixRTCSessionM
129129
const nowActive = session.memberships.length > 0;
130130

131131
if (wasActiveAndKnown && !nowActive) {
132-
logger.trace(`Session ended for ${room.roomId} (${session.memberships.length} members)`);
132+
this.logger.trace(`Session ended for ${room.roomId} (${session.memberships.length} members)`);
133133
this.emit(MatrixRTCSessionManagerEvents.SessionEnded, room.roomId, this.roomSessions.get(room.roomId)!);
134134
} else if (!wasActiveAndKnown && nowActive) {
135-
logger.trace(`Session started for ${room.roomId} (${session.memberships.length} members)`);
135+
this.logger.trace(`Session started for ${room.roomId} (${session.memberships.length} members)`);
136136
this.emit(MatrixRTCSessionManagerEvents.SessionStarted, room.roomId, this.roomSessions.get(room.roomId)!);
137137
}
138138
}

yarn.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -5081,7 +5081,7 @@ log-update@^6.1.0:
50815081
strip-ansi "^7.1.0"
50825082
wrap-ansi "^9.0.0"
50835083

5084-
loglevel@^1.7.1:
5084+
loglevel@^1.9.2:
50855085
version "1.9.2"
50865086
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08"
50875087
integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==

0 commit comments

Comments
 (0)