summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2023-10-19 14:00:51 +0200
committerOskar Nyberg <oskar@mullvad.net>2023-10-20 11:42:17 +0200
commit7d2b5128e456f8524b40638fbd1fbd758f94cb3c (patch)
tree4c4d07e951987e6b502566f49b675b67b14f4ee8
parent4319388dbbd08fd8fe90a5d6ed5b8fb460b86e60 (diff)
downloadmullvadvpn-7d2b5128e456f8524b40638fbd1fbd758f94cb3c.tar.xz
mullvadvpn-7d2b5128e456f8524b40638fbd1fbd758f94cb3c.zip
Add console.log error handling
-rw-r--r--CHANGELOG.md1
-rw-r--r--gui/src/shared/logging.ts66
2 files changed, 40 insertions, 27 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8889750a23..386899ac42 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -56,6 +56,7 @@ Line wrap the file at 100 chars. Th
### Fixed
- Show correct endpoint in CLI for custom relays.
- Lower risk of being rate limited.
+- Fix error dialog when failing to write to console by handling the thrown error.
#### Windows
- Correctly detect whether OS is Windows Server (primarily for logging in daemon.log).
diff --git a/gui/src/shared/logging.ts b/gui/src/shared/logging.ts
index c2537e00d4..0be8de8c4b 100644
--- a/gui/src/shared/logging.ts
+++ b/gui/src/shared/logging.ts
@@ -55,43 +55,55 @@ export class Logger {
this.outputs
.filter((output) => level <= output.level)
.forEach(async (output) => {
- const maybePromise = output.write(level, message);
- if (maybePromise instanceof Promise) {
- try {
- await maybePromise;
- } catch (e) {
- const error = e as Error;
- console.error(
- `${output.constructor.name}.write: ${error.message}. Original message: ${message}`,
- );
- }
+ try {
+ await output.write(level, message);
+ } catch (e) {
+ const error = e as Error;
+ console.error(
+ `${output.constructor.name}.write: ${error.message}. Original message: ${message}`,
+ );
}
});
}
}
export class ConsoleOutput implements ILogOutput {
+ private disabled = false;
+
constructor(public level: LogLevel) {}
public write(level: LogLevel, message: string) {
- switch (level) {
- case LogLevel.error:
- console.error(message);
- break;
- case LogLevel.warning:
- console.warn(message);
- break;
- case LogLevel.info:
- console.info(message);
- break;
- case LogLevel.verbose:
- console.log(message);
- break;
- case LogLevel.debug:
- console.log(message);
- break;
+ if (this.disabled) {
+ return;
+ }
+
+ try {
+ switch (level) {
+ case LogLevel.error:
+ console.error(message);
+ break;
+ case LogLevel.warning:
+ console.warn(message);
+ break;
+ case LogLevel.info:
+ console.info(message);
+ throw new Error('Log failed');
+ break;
+ case LogLevel.verbose:
+ console.log(message);
+ break;
+ case LogLevel.debug:
+ console.log(message);
+ break;
+ }
+ } catch (error) {
+ this.disabled = true;
+
+ const message = error instanceof Object && 'message' in error ? error.message : '';
+ logger.error('Disabling console output due to:', message, error);
}
}
}
-export default new Logger();
+const logger = new Logger();
+export default logger;