Skip to content

Commit a1aaaca

Browse files
authored
Merge pull request #1592 from vector-im/dbkr/use_loglevel
Use the loglevel library's extensions
2 parents 1d018ee + 31446e7 commit a1aaaca

15 files changed

+72
-50
lines changed

.eslintrc.cjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ module.exports = {
3333
rules: {
3434
// We're aiming to convert this code to strict mode
3535
"@typescript-eslint/no-non-null-assertion": "off",
36+
// We should use the js-sdk logger, never console directly.
37+
"no-console": ["error"],
3638
},
3739
},
3840
],

src/FullScreenView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { useLocation } from "react-router-dom";
1919
import classNames from "classnames";
2020
import { Trans, useTranslation } from "react-i18next";
2121
import * as Sentry from "@sentry/react";
22+
import { logger } from "matrix-js-sdk/src/logger";
2223

2324
import { Header, HeaderLogo, LeftNav, RightNav } from "./Header";
2425
import { LinkButton, Button } from "./button";
@@ -57,7 +58,7 @@ export function ErrorView({ error }: ErrorViewProps) {
5758
const { t } = useTranslation();
5859

5960
useEffect(() => {
60-
console.error(error);
61+
logger.error(error);
6162
Sentry.captureException(error);
6263
}, [error]);
6364

src/auth/RegisterPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { useHistory, useLocation } from "react-router-dom";
2727
import { captureException } from "@sentry/react";
2828
import { sleep } from "matrix-js-sdk/src/utils";
2929
import { Trans, useTranslation } from "react-i18next";
30+
import { logger } from "matrix-js-sdk/src/logger";
3031

3132
import { FieldRow, InputField, ErrorMessage } from "../input/Input";
3233
import { Button } from "../button";
@@ -97,7 +98,7 @@ export const RegisterPage: FC = () => {
9798
await newClient.joinRoom(roomId);
9899
} else {
99100
captureException(error);
100-
console.error(`Couldn't join room ${roomId}`, error);
101+
logger.error(`Couldn't join room ${roomId}`, error);
101102
}
102103
}
103104
}

src/auth/useRecaptcha.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
import { useEffect, useCallback, useRef, useState } from "react";
1818
import { randomString } from "matrix-js-sdk/src/randomstring";
1919
import { useTranslation } from "react-i18next";
20+
import { logger } from "matrix-js-sdk/src/logger";
2021

2122
import { translatedError } from "../TranslatedError";
2223

@@ -74,7 +75,7 @@ export const useRecaptcha = (sitekey?: string) => {
7475
}
7576

7677
if (!window.grecaptcha) {
77-
console.log("Recaptcha not loaded");
78+
logger.log("Recaptcha not loaded");
7879
return Promise.reject(translatedError("Recaptcha not loaded", t));
7980
}
8081

src/home/RegisteredView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { MatrixClient } from "matrix-js-sdk/src/client";
2020
import { randomString } from "matrix-js-sdk/src/randomstring";
2121
import { useTranslation } from "react-i18next";
2222
import { Heading } from "@vector-im/compound-web";
23+
import { logger } from "matrix-js-sdk/src/logger";
2324

2425
import {
2526
createRoom,
@@ -97,7 +98,7 @@ export function RegisteredView({ client }: Props) {
9798
setError(undefined);
9899
setJoinExistingCallModalOpen(true);
99100
} else {
100-
console.error(error);
101+
logger.error(error);
101102
setLoading(false);
102103
setError(error);
103104
}

src/home/UnauthenticatedView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { useHistory } from "react-router-dom";
1919
import { randomString } from "matrix-js-sdk/src/randomstring";
2020
import { Trans, useTranslation } from "react-i18next";
2121
import { Heading } from "@vector-im/compound-web";
22+
import { logger } from "matrix-js-sdk/src/logger";
2223

2324
import { useClient } from "../ClientContext";
2425
import { Header, HeaderLogo, LeftNav, RightNav } from "../Header";
@@ -130,7 +131,7 @@ export const UnauthenticatedView: FC = () => {
130131
}
131132

132133
submit().catch((error) => {
133-
console.error(error);
134+
logger.error(error);
134135
setLoading(false);
135136
setError(error);
136137
reset();

src/main.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,16 @@ import "matrix-js-sdk/src/browser-index";
2323
import { StrictMode } from "react";
2424
import { createRoot } from "react-dom/client";
2525
import { createBrowserHistory } from "history";
26-
2726
import "./index.css";
27+
import { logger } from "matrix-js-sdk/src/logger";
28+
2829
import App from "./App";
2930
import { init as initRageshake } from "./settings/rageshake";
3031
import { Initializer } from "./initializer";
3132

3233
initRageshake();
3334

34-
console.info(`Element Call ${import.meta.env.VITE_APP_VERSION || "dev"}`);
35+
logger.info(`Element Call ${import.meta.env.VITE_APP_VERSION || "dev"}`);
3536

3637
const root = createRoot(document.getElementById("root")!);
3738

src/matrix-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ export async function initClient(
177177
try {
178178
await client.store.startup();
179179
} catch (error) {
180-
console.error(
180+
logger.error(
181181
"Error starting matrix client store. Falling back to memory store.",
182182
error
183183
);

src/profile/useProfile.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event";
1919
import { User, UserEvent } from "matrix-js-sdk/src/models/user";
2020
import { FileType } from "matrix-js-sdk/src/http-api";
2121
import { useState, useCallback, useEffect } from "react";
22+
import { logger } from "matrix-js-sdk/src/logger";
2223

2324
interface ProfileLoadState {
2425
success: boolean;
@@ -127,7 +128,7 @@ export function useProfile(client: MatrixClient | undefined) {
127128
}));
128129
}
129130
} else {
130-
console.error("Client not initialized before calling saveProfile");
131+
logger.error("Client not initialized before calling saveProfile");
131132
}
132133
},
133134
[client]

src/room/RoomAuthView.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
import { useCallback, useState } from "react";
1818
import { useLocation } from "react-router-dom";
1919
import { Trans, useTranslation } from "react-i18next";
20+
import { logger } from "matrix-js-sdk/src/logger";
2021

2122
import styles from "./RoomAuthView.module.css";
2223
import { Button } from "../button";
@@ -46,7 +47,7 @@ export function RoomAuthView() {
4647
typeof dataForDisplayName === "string" ? dataForDisplayName : "";
4748

4849
registerPasswordlessUser(displayName).catch((error) => {
49-
console.error("Failed to register passwordless user", e);
50+
logger.error("Failed to register passwordless user", e);
5051
setLoading(false);
5152
setError(error);
5253
});

src/room/RoomPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ limitations under the License.
1616

1717
import { FC, useEffect, useState, useCallback, ReactNode } from "react";
1818
import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession";
19+
import { logger } from "matrix-js-sdk/src/logger";
1920

2021
import { useClientLegacy } from "../ClientContext";
2122
import { ErrorView, LoadingView } from "../FullScreenView";
@@ -37,7 +38,7 @@ export const RoomPage: FC = () => {
3738

3839
const roomIdOrAlias = roomId ?? roomAlias;
3940
if (!roomIdOrAlias) {
40-
console.error("No room specified");
41+
logger.error("No room specified");
4142
}
4243

4344
const [optInAnalytics, setOptInAnalytics] = useOptInAnalytics();

src/room/VideoPreview.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
Track,
2525
} from "livekit-client";
2626
import classNames from "classnames";
27+
import { logger } from "matrix-js-sdk/src/logger";
2728

2829
import { Avatar } from "../Avatar";
2930
import styles from "./VideoPreview.module.css";
@@ -80,7 +81,7 @@ export const VideoPreview: FC<Props> = ({
8081
},
8182
},
8283
(error) => {
83-
console.error("Error while creating preview Tracks:", error);
84+
logger.error("Error while creating preview Tracks:", error);
8485
}
8586
);
8687
const videoTrack = useMemo(

src/settings/rageshake.ts

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,6 @@ enum ConsoleLoggerEvent {
5454
Log = "log",
5555
}
5656

57-
type LogFunction = (
58-
...args: (Error | DOMException | object | string)[]
59-
) => void;
60-
type LogFunctionName = "log" | "info" | "warn" | "error";
61-
6257
// A class which monkey-patches the global console and stores log lines.
6358

6459
interface LogEntry {
@@ -69,37 +64,11 @@ interface LogEntry {
6964

7065
class ConsoleLogger extends EventEmitter {
7166
private logs = "";
72-
private originalFunctions: { [key in LogFunctionName]?: LogFunction } = {};
73-
74-
public monkeyPatch(consoleObj: Console): void {
75-
// Monkey-patch console logging
76-
const consoleFunctionsToLevels = {
77-
log: "I",
78-
info: "I",
79-
warn: "W",
80-
error: "E",
81-
};
82-
83-
Object.entries(consoleFunctionsToLevels).forEach(([name, level]) => {
84-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
85-
// @ts-ignore
86-
const originalFn = consoleObj[name].bind(consoleObj);
87-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
88-
// @ts-ignore
89-
this.originalFunctions[name] = originalFn;
90-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
91-
// @ts-ignore
92-
consoleObj[name] = (...args) => {
93-
this.log(level, ...args);
94-
originalFn(...args);
95-
};
96-
});
97-
}
9867

99-
public log(
100-
level: string,
68+
public log = (
69+
level: LogLevel,
10170
...args: (Error | DOMException | object | string)[]
102-
): void {
71+
): void => {
10372
// We don't know what locale the user may be running so use ISO strings
10473
const ts = new Date().toISOString();
10574

@@ -129,7 +98,7 @@ class ConsoleLogger extends EventEmitter {
12998
this.logs += line;
13099

131100
this.emit(ConsoleLoggerEvent.Log);
132-
}
101+
};
133102

134103
/**
135104
* Returns the log lines to flush to disk and empties the internal log buffer
@@ -510,7 +479,7 @@ declare global {
510479
*/
511480
export function init(): Promise<void> {
512481
global.mx_rage_logger = new ConsoleLogger();
513-
global.mx_rage_logger.monkeyPatch(window.console);
482+
setLogExtension(global.mx_rage_logger.log);
514483

515484
return tryInitStorage();
516485
}
@@ -591,3 +560,42 @@ const getCircularReplacer = (): StringifyReplacer => {
591560
return value;
592561
};
593562
};
563+
564+
enum LogLevel {
565+
trace = 0,
566+
debug = 1,
567+
info = 2,
568+
warn = 3,
569+
error = 4,
570+
silent = 5,
571+
}
572+
573+
type LogExtensionFunc = (
574+
level: LogLevel,
575+
...rest: (Error | DOMException | object | string)[]
576+
) => void;
577+
type LogLevelString = keyof typeof LogLevel;
578+
579+
/**
580+
* This method borrowed from livekit (who also use loglevel and in turn essentially
581+
* took loglevel's example honouring log levels). Adds a loglevel logging extension
582+
* in the recommended way.
583+
*/
584+
export function setLogExtension(extension: LogExtensionFunc) {
585+
const originalFactory = logger.methodFactory;
586+
587+
logger.methodFactory = function (methodName, configLevel, loggerName) {
588+
const rawMethod = originalFactory(methodName, configLevel, loggerName);
589+
590+
const logLevel = LogLevel[methodName as LogLevelString];
591+
const needLog = logLevel >= configLevel && logLevel < LogLevel.silent;
592+
593+
return (...args) => {
594+
rawMethod.apply(this, args);
595+
if (needLog) {
596+
extension(logLevel, ...args);
597+
}
598+
};
599+
};
600+
logger.setLevel(logger.getLevel()); // Be sure to call setLevel method in order to apply plugin
601+
}

src/settings/submit-rageshake.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
import pako from "pako";
2727
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
2828
import { ClientEvent } from "matrix-js-sdk/src/client";
29+
import { logger } from "matrix-js-sdk/src/logger";
2930

3031
import { getLogsForReport } from "./rageshake";
3132
import { useClient } from "../ClientContext";
@@ -296,7 +297,7 @@ export function useSubmitRageshake(): {
296297
setState({ sending: false, sent: true, error: undefined });
297298
} catch (error) {
298299
setState({ sending: false, sent: false, error: error as Error });
299-
console.error(error);
300+
logger.error(error);
300301
}
301302
},
302303
[client, inspectorState, sending]

src/video-grid/VideoGrid.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
} from "@react-spring/web";
3939
import useMeasure from "react-use-measure";
4040
import { ResizeObserver as JuggleResizeObserver } from "@juggle/resize-observer";
41+
import { logger } from "matrix-js-sdk/src/logger";
4142

4243
import styles from "./VideoGrid.module.css";
4344
import { Layout } from "../room/LayoutToggle";
@@ -298,7 +299,7 @@ function getFreedomLayoutTilePositions(
298299
}
299300

300301
if (tileCount > 12) {
301-
console.warn("Over 12 tiles is not currently supported");
302+
logger.warn("Over 12 tiles is not currently supported");
302303
}
303304

304305
const { layoutDirection, itemGridRatio } = getGridLayout(

0 commit comments

Comments
 (0)