diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2019-04-24 13:43:31 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2019-04-25 09:39:03 +0200 |
| commit | 5d64426d40f87fb90db3550f51d83d63b53b0f65 (patch) | |
| tree | 23a28cdc862fa1af42caac9686780d883a0a75a4 | |
| parent | d07d62e752f55718dad05218504c208ea4c354bc (diff) | |
| download | mullvadvpn-5d64426d40f87fb90db3550f51d83d63b53b0f65.tar.xz mullvadvpn-5d64426d40f87fb90db3550f51d83d63b53b0f65.zip | |
Update electron-log
| -rw-r--r-- | gui/package-lock.json | 6 | ||||
| -rw-r--r-- | gui/package.json | 2 | ||||
| -rw-r--r-- | gui/src/main/index.ts | 72 | ||||
| -rw-r--r-- | gui/src/renderer/app.tsx | 3 | ||||
| -rw-r--r-- | gui/src/shared/logging.ts | 65 | ||||
| -rw-r--r-- | gui/test/setup/main.js | 1 | ||||
| -rw-r--r-- | gui/test/setup/renderer.ts | 5 |
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); |
