summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2019-04-24 13:43:31 +0200
committerAndrej Mihajlov <and@mullvad.net>2019-04-25 09:39:03 +0200
commit5d64426d40f87fb90db3550f51d83d63b53b0f65 (patch)
tree23a28cdc862fa1af42caac9686780d883a0a75a4
parentd07d62e752f55718dad05218504c208ea4c354bc (diff)
downloadmullvadvpn-5d64426d40f87fb90db3550f51d83d63b53b0f65.tar.xz
mullvadvpn-5d64426d40f87fb90db3550f51d83d63b53b0f65.zip
Update electron-log
-rw-r--r--gui/package-lock.json6
-rw-r--r--gui/package.json2
-rw-r--r--gui/src/main/index.ts72
-rw-r--r--gui/src/renderer/app.tsx3
-rw-r--r--gui/src/shared/logging.ts65
-rw-r--r--gui/test/setup/main.js1
-rw-r--r--gui/test/setup/renderer.ts5
7 files changed, 100 insertions, 54 deletions
diff --git a/gui/package-lock.json b/gui/package-lock.json
index 12219e168f..fba0a8f610 100644
--- a/gui/package-lock.json
+++ b/gui/package-lock.json
@@ -2255,9 +2255,9 @@
}
},
"electron-log": {
- "version": "2.2.17",
- "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-2.2.17.tgz",
- "integrity": "sha512-v+Af5W5z99ehhaLOfE9eTSXUwjzh2wFlQjz51dvkZ6ZIrET6OB/zAZPvsuwT6tm3t5x+M1r+Ed3U3xtPZYAyuQ=="
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-3.0.5.tgz",
+ "integrity": "sha512-wWOPNBVGh7NJx/OLXdgtuYrqxoG9ZWO+kZYloIHi66B5W9EgXZw71jdZ1ddeWNg4CkABypa8tkrRGqCKF+9tYg=="
},
"electron-mocha": {
"version": "6.0.4",
diff --git a/gui/package.json b/gui/package.json
index 3407cf2c73..a322fd0c0d 100644
--- a/gui/package.json
+++ b/gui/package.json
@@ -14,7 +14,7 @@
"dependencies": {
"connected-react-router": "^5.0.1",
"d3-geo-projection": "^2.6.0",
- "electron-log": "^2.2.8",
+ "electron-log": "^3.0.5",
"gettext-parser": "^3.1.0",
"history": "^4.6.1",
"jsonrpc-lite": "^2.0.6",
diff --git a/gui/src/main/index.ts b/gui/src/main/index.ts
index a934f11121..b3139362d8 100644
--- a/gui/src/main/index.ts
+++ b/gui/src/main/index.ts
@@ -1,7 +1,6 @@
import { execFile } from 'child_process';
import { app, BrowserWindow, ipcMain, Menu, nativeImage, screen, Tray } from 'electron';
import log from 'electron-log';
-import * as fs from 'fs';
import mkdirp from 'mkdirp';
import * as path from 'path';
import * as uuid from 'uuid';
@@ -19,6 +18,13 @@ import {
} from '../shared/daemon-rpc-types';
import { loadTranslations, messages } from '../shared/gettext';
import { IpcMainEventChannel } from '../shared/ipc-event-channel';
+import {
+ backupLogFile,
+ getLogsDirectory,
+ getMainLogFile,
+ getRendererLogFile,
+ setupLogging,
+} from '../shared/logging';
import { getOpenAtLogin, setOpenAtLogin } from './autostart';
import { ConnectionObserver, DaemonRpc, SubscriptionListener } from './daemon-rpc';
import GuiSettings from './gui-settings';
@@ -59,8 +65,8 @@ class ApplicationMain {
private reconnectBackoff = new ReconnectionBackoff();
private connectedToDaemon = false;
- private logFilePath = '';
- private oldLogFilePath?: string;
+ private logFilePaths: string[] = [];
+ private oldLogFilePaths: string[] = [];
private quitStage = AppQuitStage.unready;
private accountHistory: AccountToken[] = [];
@@ -171,54 +177,22 @@ class ApplicationMain {
}
private initLogging() {
- const logDirectory = this.getLogsDirectory();
- const format = '[{y}-{m}-{d} {h}:{i}:{s}.{ms}][{level}] {text}';
-
- this.logFilePath = path.join(logDirectory, 'frontend.log');
-
- log.transports.console.format = format;
- log.transports.file.format = format;
- if (process.env.NODE_ENV === 'development') {
- log.transports.console.level = 'debug';
+ const logDirectory = getLogsDirectory();
+ const mainLogFile = getMainLogFile();
+ const rendererLogFile = getRendererLogFile();
+ const logFiles = [mainLogFile, rendererLogFile];
- // Disable log file in development
- log.transports.file.level = false;
- } else {
- // Create log folder
+ if (process.env.NODE_ENV !== 'development') {
+ // Ensure log directory exists
mkdirp.sync(logDirectory);
- // Backup previous log file if it exists
- try {
- fs.accessSync(this.logFilePath);
- this.oldLogFilePath = path.join(logDirectory, 'frontend.old.log');
- fs.renameSync(this.logFilePath, this.oldLogFilePath);
- } catch (error) {
- // No previous log file exists
- }
-
- // Configure logging to file
- log.transports.console.level = 'debug';
- log.transports.file.level = 'debug';
- log.transports.file.file = this.logFilePath;
-
- log.debug(`Logging to ${this.logFilePath}`);
+ this.logFilePaths = logFiles;
+ this.oldLogFilePaths = logFiles
+ .map((logFile) => backupLogFile(logFile))
+ .filter((oldLogFile): oldLogFile is string => typeof oldLogFile === 'string');
}
- }
- // Returns platform specific logs folder for application
- // See open issue and PR on Github:
- // 1. https://github.com/electron/electron/issues/10118
- // 2. https://github.com/electron/electron/pull/10191
- private getLogsDirectory() {
- switch (process.platform) {
- case 'darwin':
- // macOS: ~/Library/Logs/{appname}
- return path.join(app.getPath('home'), 'Library/Logs', app.getName());
- default:
- // Windows: %LOCALAPPDATA%\{appname}\logs
- // Linux: ~/.config/{appname}/logs
- return path.join(app.getPath('userData'), 'logs');
- }
+ setupLogging(mainLogFile);
}
private onActivate = () => {
@@ -880,10 +854,8 @@ class ApplicationMain {
if (toRedact.length > 0) {
args.push('--redact', ...toRedact, '--');
}
- args.push(this.logFilePath);
- if (this.oldLogFilePath) {
- args.push(this.oldLogFilePath);
- }
+ args.push(...this.logFilePaths);
+ args.push(...this.oldLogFilePaths);
execFile(executable, args, { windowsHide: true }, (error, stdout, stderr) => {
if (error) {
diff --git a/gui/src/renderer/app.tsx b/gui/src/renderer/app.tsx
index 2549404e20..fba3733e94 100644
--- a/gui/src/renderer/app.tsx
+++ b/gui/src/renderer/app.tsx
@@ -26,6 +26,7 @@ import { IWindowShapeParameters } from '../main/window-controller';
import { cities, countries, loadTranslations, messages, relayLocations } from '../shared/gettext';
import { IGuiSettingsState } from '../shared/gui-settings-state';
import { IpcRendererEventChannel } from '../shared/ipc-event-channel';
+import { getRendererLogFile, setupLogging } from '../shared/logging';
import AccountDataCache, { AccountFetchRetryAction } from './lib/account-data-cache';
import AccountExpiry from './lib/account-expiry';
@@ -78,6 +79,8 @@ export default class AppRenderer {
private loginTimer?: NodeJS.Timeout;
constructor() {
+ setupLogging(getRendererLogFile());
+
ipcRenderer.on(
'update-window-shape',
(_event: Electron.Event, shapeParams: IWindowShapeParameters) => {
diff --git a/gui/src/shared/logging.ts b/gui/src/shared/logging.ts
new file mode 100644
index 0000000000..d06abca4fe
--- /dev/null
+++ b/gui/src/shared/logging.ts
@@ -0,0 +1,65 @@
+import { app, remote } from 'electron';
+import log from 'electron-log';
+import * as fs from 'fs';
+import * as path from 'path';
+
+const LOG_FORMAT = '[{y}-{m}-{d} {h}:{i}:{s}.{ms}][{level}] {text}';
+
+// Returns platform specific logs folder for application
+// See open issue and PR on Github:
+// 1. https://github.com/electron/electron/issues/10118
+// 2. https://github.com/electron/electron/pull/10191
+export function getLogsDirectory() {
+ const theApp = process.type === 'browser' ? app : remote.app;
+
+ switch (process.platform) {
+ case 'darwin':
+ // macOS: ~/Library/Logs/{appname}
+ return path.join(theApp.getPath('home'), 'Library/Logs', theApp.getName());
+ default:
+ // Windows: %LOCALAPPDATA%\{appname}\logs
+ // Linux: ~/.config/{appname}/logs
+ return path.join(theApp.getPath('userData'), 'logs');
+ }
+}
+
+export function getMainLogFile(): string {
+ return path.join(getLogsDirectory(), 'frontend.log');
+}
+
+export function getRendererLogFile(): string {
+ return path.join(getLogsDirectory(), 'frontend-renderer.log');
+}
+
+export function setupLogging(logFile: string) {
+ log.transports.console.format = LOG_FORMAT;
+ log.transports.file.format = LOG_FORMAT;
+ log.transports.console.level = 'debug';
+
+ if (process.env.NODE_ENV === 'development') {
+ // Disable log file in development
+ log.transports.file.level = false;
+ } else {
+ // Configure logging to file
+ log.transports.file.level = 'debug';
+ log.transports.file.file = logFile;
+
+ log.debug(`Logging to ${logFile}`);
+ }
+}
+
+export function backupLogFile(filePath: string): string | undefined {
+ const ext = path.extname(filePath);
+ const baseName = path.basename(filePath, ext);
+ const backupFile = path.join(path.dirname(filePath), baseName + '.old' + ext);
+
+ try {
+ fs.accessSync(filePath);
+ fs.renameSync(filePath, backupFile);
+
+ return backupFile;
+ } catch (error) {
+ // No previous log file exists
+ return undefined;
+ }
+}
diff --git a/gui/test/setup/main.js b/gui/test/setup/main.js
index dd458a30b6..3d2a20c020 100644
--- a/gui/test/setup/main.js
+++ b/gui/test/setup/main.js
@@ -2,3 +2,4 @@ const log = require('electron-log');
log.transports.console.level = false;
log.transports.file.level = false;
+log.transports.rendererConsole = null;
diff --git a/gui/test/setup/renderer.ts b/gui/test/setup/renderer.ts
index 05c236a2da..d3de21979d 100644
--- a/gui/test/setup/renderer.ts
+++ b/gui/test/setup/renderer.ts
@@ -1,9 +1,14 @@
+import log from 'electron-log';
import Enzyme from 'enzyme';
import ReactSixteenAdapter from 'enzyme-adapter-react-16';
import chai from 'chai';
import spies from 'chai-spies';
import chaiAsPromised from 'chai-as-promised';
+log.transports.console.level = false;
+log.transports.file.level = false;
+log.transports.mainConsole = null;
+
chai.use(spies);
chai.use(chaiAsPromised);