diff options
| author | Oskar Nyberg <oskar@mullvad.net> | 2021-01-12 13:29:33 +0100 |
|---|---|---|
| committer | Oskar Nyberg <oskar@mullvad.net> | 2021-01-15 13:32:09 +0100 |
| commit | ef332247aa3408b2af862340cf3fe1ae4ee5054a (patch) | |
| tree | 6a4680d9ad599861246053404211ec8b6d5675c5 | |
| parent | fd02a14f3fad35f49cfd7b9deb3aae02fcf9dda2 (diff) | |
| download | mullvadvpn-ef332247aa3408b2af862340cf3fe1ae4ee5054a.tar.xz mullvadvpn-ef332247aa3408b2af862340cf3fe1ae4ee5054a.zip | |
Use new logger
25 files changed, 64 insertions, 60 deletions
diff --git a/gui/package.json b/gui/package.json index 27e399f41e..0bb993f9df 100644 --- a/gui/package.json +++ b/gui/package.json @@ -101,7 +101,7 @@ "lint": "eslint --ext tsx,ts .", "format": "prettier \"**/*.{js,css,ts,tsx}\" --write", "develop": "gulp develop", - "test": "cross-env NODE_ENV=test electron-mocha --renderer --reporter spec --require-main \"test/setup/main.js\" --require ts-node/register --require \"test/setup/renderer.ts\" \"test/**/*.{ts,tsx}\"", + "test": "cross-env NODE_ENV=test electron-mocha --renderer --reporter spec --require ts-node/register --require \"test/setup/renderer.ts\" \"test/**/*.{ts,tsx}\"", "update-translations": "node scripts/extract-translations", "pack:mac": "gulp pack-mac", "pack:win": "gulp pack-win", diff --git a/gui/src/main/account-data-cache.ts b/gui/src/main/account-data-cache.ts index 5c178e83a6..a03728e004 100644 --- a/gui/src/main/account-data-cache.ts +++ b/gui/src/main/account-data-cache.ts @@ -1,7 +1,7 @@ -import log from 'electron-log'; import moment from 'moment'; import { hasExpired } from '../shared/account-expiry'; import { AccountToken, IAccountData } from '../shared/daemon-rpc-types'; +import log from '../shared/logging'; import consumePromise from '../shared/promise'; import { Scheduler } from '../shared/scheduler'; import { InvalidAccountError } from './errors'; diff --git a/gui/src/main/autostart.ts b/gui/src/main/autostart.ts index a42691550c..f5369b6723 100644 --- a/gui/src/main/autostart.ts +++ b/gui/src/main/autostart.ts @@ -1,8 +1,8 @@ import { app } from 'electron'; -import log from 'electron-log'; import * as fs from 'fs'; import * as path from 'path'; import { promisify } from 'util'; +import log from '../shared/logging'; const DESKTOP_FILE_NAME = 'mullvad-vpn.desktop'; diff --git a/gui/src/main/daemon-rpc.ts b/gui/src/main/daemon-rpc.ts index 7f9e6d629b..9be0fc6870 100644 --- a/gui/src/main/daemon-rpc.ts +++ b/gui/src/main/daemon-rpc.ts @@ -4,7 +4,6 @@ import { StringValue, UInt32Value, } from 'google-protobuf/google/protobuf/wrappers_pb.js'; -import log from 'electron-log'; import { Empty } from 'google-protobuf/google/protobuf/empty_pb.js'; import { promisify } from 'util'; import { @@ -50,6 +49,7 @@ import { TunnelProtocol, IDnsOptions, } from '../shared/daemon-rpc-types'; +import log from '../shared/logging'; import * as managementInterface from './management_interface/management_interface_grpc_pb'; import * as grpcTypes from './management_interface/management_interface_pb'; diff --git a/gui/src/main/gui-settings.ts b/gui/src/main/gui-settings.ts index e7d8a47cf1..54b51116cd 100644 --- a/gui/src/main/gui-settings.ts +++ b/gui/src/main/gui-settings.ts @@ -1,8 +1,8 @@ import { app } from 'electron'; -import log from 'electron-log'; import * as fs from 'fs'; import * as path from 'path'; import { IGuiSettingsState, SYSTEM_PREFERRED_LOCALE_KEY } from '../shared/gui-settings-state'; +import log from '../shared/logging'; const settingsSchema = { preferredLocale: 'string', diff --git a/gui/src/main/index.ts b/gui/src/main/index.ts index efef48e033..402a0a35cb 100644 --- a/gui/src/main/index.ts +++ b/gui/src/main/index.ts @@ -10,8 +10,6 @@ import { shell, Tray, } from 'electron'; -import log from 'electron-log'; -import mkdirp from 'mkdirp'; import moment from 'moment'; import * as path from 'path'; import { sprintf } from 'sprintf-js'; @@ -39,14 +37,8 @@ import { import { loadTranslations, messages } from '../shared/gettext'; import { SYSTEM_PREFERRED_LOCALE_KEY } from '../shared/gui-settings-state'; import { IpcMainEventChannel } from '../shared/ipc-event-channel'; -import { - backupLogFile, - cleanUpLogDirectory, - getLogsDirectory, - getMainLogFile, - getRendererLogFile, - setupLogging, -} from '../shared/logging'; +import log, { ConsoleOutput, Logger } from '../shared/logging'; +import { LogLevel } from '../shared/logging-types'; import { AccountExpiredNotificationProvider, CloseToAccountExpiryNotificationProvider, @@ -63,6 +55,16 @@ import { InvalidAccountError } from './errors'; import Expectation from './expectation'; import GuiSettings from './gui-settings'; import { getAppIcon } from './linux-desktop-entry'; +import { + backupLogFile, + cleanUpLogDirectory, + createLoggingDirectory, + FileOutput, + getMainLogPath, + getRendererLogPath, + IpcInput, + OLD_LOG_FILES, +} from './logging'; import NotificationController from './notification-controller'; import { resolveBin } from './proc'; import ReconnectionBackoff from './reconnection-backoff'; @@ -201,6 +203,8 @@ class ApplicationMain { private autoConnectOnWireguardKeyEvent = false; private autoConnectFallbackScheduler = new Scheduler(); + private rendererLog?: Logger; + public run() { // Remove window animations to combat window flickering when opening window. Can be removed when // this issue has been resolved: https://github.com/electron/electron/issues/12130 @@ -252,28 +256,35 @@ class ApplicationMain { if (appDataDir) { app.setPath('appData', appDataDir); app.setPath('userData', path.join(appDataDir, app.name)); + app.setPath('logs', path.join(appDataDir, app.name, 'logs')); } else { throw new Error('Missing %LOCALAPPDATA% environment variable'); } + } else if (process.platform === 'linux') { + const userDataDir = app.getPath('userData'); + app.setPath('logs', path.join(userDataDir, 'logs')); } } private initLogging() { - const logDirectory = getLogsDirectory(); - const mainLogFile = getMainLogFile(); - const logFiles = [mainLogFile, getRendererLogFile()]; + const mainLogPath = getMainLogPath(); + const rendererLogPath = getRendererLogPath(); if (process.env.NODE_ENV !== 'development') { - // Ensure log directory exists - mkdirp.sync(logDirectory); + createLoggingDirectory(); + cleanUpLogDirectory(OLD_LOG_FILES); - for (const logFile of logFiles) { - backupLogFile(logFile); - } + backupLogFile(mainLogPath); + backupLogFile(rendererLogPath); + + log.addOutput(new FileOutput(LogLevel.debug, mainLogPath)); + + this.rendererLog = new Logger(); + this.rendererLog.addInput(new IpcInput()); + this.rendererLog.addOutput(new FileOutput(LogLevel.debug, rendererLogPath)); } - cleanUpLogDirectory(); - setupLogging(mainLogFile); + log.addOutput(new ConsoleOutput(LogLevel.debug)); } private onActivate = () => { @@ -340,6 +351,9 @@ class ApplicationMain { } this.daemonRpc.disconnect(); + + log.dispose(); + this.rendererLog?.dispose(); } private detectLocale(): string { @@ -1151,10 +1165,6 @@ class ApplicationMain { IpcMainEventChannel.app.handleOpenUrl((url) => shell.openExternal(url)); IpcMainEventChannel.app.handleOpenPath((path) => shell.openPath(path)); IpcMainEventChannel.app.handleShowOpenDialog((options) => dialog.showOpenDialog(options)); - - IpcMainEventChannel.logging.handleLog(({ level, data }) => - this.rendererLog?.log(LogLevels[level], ...data), - ); } private async createNewAccount(): Promise<string> { diff --git a/gui/src/main/linux-desktop-entry.ts b/gui/src/main/linux-desktop-entry.ts index 02edd8eb0f..dc1ae0e57b 100644 --- a/gui/src/main/linux-desktop-entry.ts +++ b/gui/src/main/linux-desktop-entry.ts @@ -1,8 +1,8 @@ import child_process from 'child_process'; -import log from 'electron-log'; import fs from 'fs'; import path from 'path'; import { ILinuxApplication } from '../shared/application-types'; +import log from '../shared/logging'; type DirectoryDescription = string | RegExp; diff --git a/gui/src/main/notification-controller.ts b/gui/src/main/notification-controller.ts index 95c1216b72..17343837d4 100644 --- a/gui/src/main/notification-controller.ts +++ b/gui/src/main/notification-controller.ts @@ -1,8 +1,8 @@ import { app, nativeImage, NativeImage, Notification } from 'electron'; -import log from 'electron-log'; import os from 'os'; import path from 'path'; import { TunnelState } from '../shared/daemon-rpc-types'; +import log from '../shared/logging'; import { ConnectedNotificationProvider, ConnectingNotificationProvider, diff --git a/gui/src/renderer/app.tsx b/gui/src/renderer/app.tsx index 73019b1e14..f63e03633a 100644 --- a/gui/src/renderer/app.tsx +++ b/gui/src/renderer/app.tsx @@ -1,4 +1,3 @@ -import log from 'electron-log'; import * as React from 'react'; import { Provider } from 'react-redux'; import { Router } from 'react-router'; @@ -21,7 +20,7 @@ import { loadTranslations, messages, relayLocations } from '../shared/gettext'; import { IGuiSettingsState, SYSTEM_PREFERRED_LOCALE_KEY } from '../shared/gui-settings-state'; import { IpcRendererEventChannel, IRelayListPair } from '../shared/ipc-event-channel'; import { ILinuxSplitTunnelingApplication } from '../shared/application-types'; -import { getRendererLogFile, setupLogging } from '../shared/logging'; +import log, { ConsoleOutput } from '../shared/logging'; import consumePromise from '../shared/promise'; import History from './lib/history'; @@ -43,6 +42,8 @@ import { TunnelState, VoucherResponse, } from '../shared/daemon-rpc-types'; +import { LogLevel } from '../shared/logging-types'; +import IpcOutput from './lib/logging'; interface IPreferredLocaleDescriptor { name: string; @@ -94,7 +95,8 @@ export default class AppRenderer { private loginTimer?: NodeJS.Timeout; constructor() { - setupLogging(getRendererLogFile()); + log.addOutput(new ConsoleOutput(LogLevel.debug)); + log.addOutput(new IpcOutput(LogLevel.debug)); IpcRendererEventChannel.locale.listen((locale) => { // load translations for the new locale diff --git a/gui/src/renderer/components/AppButton.tsx b/gui/src/renderer/components/AppButton.tsx index 54a3039078..352d70d9e9 100644 --- a/gui/src/renderer/components/AppButton.tsx +++ b/gui/src/renderer/components/AppButton.tsx @@ -1,7 +1,7 @@ -import log from 'electron-log'; import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; import styled from 'styled-components'; import { colors } from '../../config.json'; +import log from '../../shared/logging'; import { useMounted } from '../lib/utilityHooks'; import { StyledButtonContent, StyledLabel, StyledLabelContainer } from './AppButtonStyles'; import ImageView from './ImageView'; diff --git a/gui/src/renderer/components/ClipboardLabel.tsx b/gui/src/renderer/components/ClipboardLabel.tsx index 8b96b32dd3..2131e884df 100644 --- a/gui/src/renderer/components/ClipboardLabel.tsx +++ b/gui/src/renderer/components/ClipboardLabel.tsx @@ -1,7 +1,7 @@ -import log from 'electron-log'; import * as React from 'react'; import styled from 'styled-components'; import { messages } from '../../shared/gettext'; +import log from '../../shared/logging'; import { Scheduler } from '../../shared/scheduler'; interface IProps { diff --git a/gui/src/renderer/components/ErrorBoundary.tsx b/gui/src/renderer/components/ErrorBoundary.tsx index c54fe97721..040ff71826 100644 --- a/gui/src/renderer/components/ErrorBoundary.tsx +++ b/gui/src/renderer/components/ErrorBoundary.tsx @@ -1,8 +1,8 @@ -import log from 'electron-log'; import React from 'react'; import styled from 'styled-components'; import { colors, links } from '../../config.json'; import { messages } from '../../shared/gettext'; +import log from '../../shared/logging'; import PlatformWindowContainer from '../containers/PlatformWindowContainer'; import ImageView from './ImageView'; import { Container, Layout } from './Layout'; diff --git a/gui/src/renderer/components/NotificationArea.tsx b/gui/src/renderer/components/NotificationArea.tsx index 35fcffdd6d..c087d9984a 100644 --- a/gui/src/renderer/components/NotificationArea.tsx +++ b/gui/src/renderer/components/NotificationArea.tsx @@ -1,6 +1,6 @@ -import log from 'electron-log'; import React, { useCallback } from 'react'; import { useSelector } from 'react-redux'; +import log from '../../shared/logging'; import { BlockWhenDisconnectedNotificationProvider, CloseToAccountExpiryNotificationProvider, diff --git a/gui/src/renderer/components/WireguardKeys.tsx b/gui/src/renderer/components/WireguardKeys.tsx index 9e1df9693c..5bb84c7509 100644 --- a/gui/src/renderer/components/WireguardKeys.tsx +++ b/gui/src/renderer/components/WireguardKeys.tsx @@ -1,9 +1,9 @@ -import log from 'electron-log'; import moment from 'moment'; import * as React from 'react'; import { sprintf } from 'sprintf-js'; import { TunnelState } from '../../shared/daemon-rpc-types'; import { messages } from '../../shared/gettext'; +import log from '../../shared/logging'; import { IWgKey, WgKeyState } from '../redux/settings/reducers'; import * as AppButton from './AppButton'; import { AriaDescribed, AriaDescription, AriaDescriptionGroup } from './AriaGroup'; diff --git a/gui/src/renderer/containers/AdvancedSettingsPage.tsx b/gui/src/renderer/containers/AdvancedSettingsPage.tsx index 68d6899acb..0aaa4ee3f4 100644 --- a/gui/src/renderer/containers/AdvancedSettingsPage.tsx +++ b/gui/src/renderer/containers/AdvancedSettingsPage.tsx @@ -1,4 +1,3 @@ -import log from 'electron-log'; import { connect } from 'react-redux'; import { RouteComponentProps, withRouter } from 'react-router'; import { @@ -7,6 +6,7 @@ import { RelayProtocol, TunnelProtocol, } from '../../shared/daemon-rpc-types'; +import log from '../../shared/logging'; import RelaySettingsBuilder from '../../shared/relay-settings-builder'; import AdvancedSettings from '../components/AdvancedSettings'; diff --git a/gui/src/renderer/containers/ConnectPage.tsx b/gui/src/renderer/containers/ConnectPage.tsx index f56bc6e160..99882bf8b1 100644 --- a/gui/src/renderer/containers/ConnectPage.tsx +++ b/gui/src/renderer/containers/ConnectPage.tsx @@ -1,8 +1,8 @@ -import log from 'electron-log'; import { connect } from 'react-redux'; import { RouteComponentProps, withRouter } from 'react-router'; import { sprintf } from 'sprintf-js'; import { messages } from '../../shared/gettext'; +import log from '../../shared/logging'; import Connect from '../components/Connect'; import withAppContext, { IAppContext } from '../context'; import { IRelayLocationRedux, RelaySettingsRedux } from '../redux/settings/reducers'; diff --git a/gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx b/gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx index dcdc862355..8b01b5e996 100644 --- a/gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx +++ b/gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx @@ -1,6 +1,6 @@ -import log from 'electron-log'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import log from '../../shared/logging'; import ExpiredAccountErrorView from '../components/ExpiredAccountErrorView'; import accountActions from '../redux/account/actions'; diff --git a/gui/src/renderer/containers/PreferencesPage.tsx b/gui/src/renderer/containers/PreferencesPage.tsx index 35d9c62f5b..571219b528 100644 --- a/gui/src/renderer/containers/PreferencesPage.tsx +++ b/gui/src/renderer/containers/PreferencesPage.tsx @@ -1,6 +1,6 @@ -import log from 'electron-log'; import { connect } from 'react-redux'; import { RouteComponentProps, withRouter } from 'react-router'; +import log from '../../shared/logging'; import consumePromise from '../../shared/promise'; import Preferences from '../components/Preferences'; import withAppContext, { IAppContext } from '../context'; diff --git a/gui/src/renderer/containers/SelectLocationPage.tsx b/gui/src/renderer/containers/SelectLocationPage.tsx index 29bb468304..fbad19285b 100644 --- a/gui/src/renderer/containers/SelectLocationPage.tsx +++ b/gui/src/renderer/containers/SelectLocationPage.tsx @@ -1,9 +1,9 @@ -import log from 'electron-log'; import { connect } from 'react-redux'; import { RouteComponentProps, withRouter } from 'react-router'; import { bindActionCreators } from 'redux'; import BridgeSettingsBuilder from '../../shared/bridge-settings-builder'; import { LiftedConstraint, RelayLocation } from '../../shared/daemon-rpc-types'; +import log from '../../shared/logging'; import RelaySettingsBuilder from '../../shared/relay-settings-builder'; import SelectLocation from '../components/SelectLocation'; import withAppContext, { IAppContext } from '../context'; diff --git a/gui/src/renderer/redux/settings/reducers.ts b/gui/src/renderer/redux/settings/reducers.ts index 53d19aba29..59b4c32b46 100644 --- a/gui/src/renderer/redux/settings/reducers.ts +++ b/gui/src/renderer/redux/settings/reducers.ts @@ -1,4 +1,3 @@ -import log from 'electron-log'; import { BridgeState, KeygenEvent, @@ -9,6 +8,7 @@ import { TunnelProtocol, } from '../../../shared/daemon-rpc-types'; import { IGuiSettingsState } from '../../../shared/gui-settings-state'; +import log from '../../../shared/logging'; import { ReduxAction } from '../store'; export type RelaySettingsRedux = diff --git a/gui/src/shared/gettext.ts b/gui/src/shared/gettext.ts index df15e0c2ef..3283269c70 100644 --- a/gui/src/shared/gettext.ts +++ b/gui/src/shared/gettext.ts @@ -1,9 +1,9 @@ -import log from 'electron-log'; import fs from 'fs'; import { po } from 'gettext-parser'; import Gettext from 'node-gettext'; import path from 'path'; import { LocalizationContexts } from './localization-contexts'; +import log from './logging'; const SOURCE_LANGUAGE = 'en'; const LOCALES_DIR = path.resolve(__dirname, '../../locales'); diff --git a/gui/src/shared/ipc-helpers.ts b/gui/src/shared/ipc-helpers.ts index 1c1465b09b..d1a72a2df6 100644 --- a/gui/src/shared/ipc-helpers.ts +++ b/gui/src/shared/ipc-helpers.ts @@ -1,6 +1,6 @@ import { ipcMain, ipcRenderer, WebContents } from 'electron'; -import log from 'electron-log'; import { capitalize } from './string-helpers'; +import log from './logging'; type Handler<T, R> = (callback: (arg: T) => R) => void; type Sender<T, R> = (arg: T) => R; diff --git a/gui/test/logging.spec.ts b/gui/test/logging.spec.ts index 9572c6ed24..22c3db02fa 100644 --- a/gui/test/logging.spec.ts +++ b/gui/test/logging.spec.ts @@ -2,7 +2,7 @@ import { expect } from 'chai'; import fs from 'fs'; import sinon from 'sinon'; import { it, describe, before, beforeEach, after } from 'mocha'; -import * as logging from '../src/shared/logging'; +import { backupLogFile, rotateOrDeleteFile } from '../src/main/logging'; const aPath = 'log-directory/a.log'; const oldAPath = 'log-directory/a.old.log'; @@ -51,7 +51,7 @@ describe('Logging', () => { }); it('should backup log file', () => { - logging.backupLogFile(aPath); + backupLogFile(aPath); const oldA = fs.readFileSync(oldAPath).toString(); expect(fs.accessSync.bind(null, aPath)).to.throw(); @@ -59,7 +59,7 @@ describe('Logging', () => { }); it('should replace backup file', () => { - logging.backupLogFile(bPath); + backupLogFile(bPath); const oldB = fs.readFileSync(oldBPath).toString(); expect(fs.accessSync.bind(null, bPath)).to.throw(); @@ -67,13 +67,13 @@ describe('Logging', () => { }); it('should clean up old log files', () => { - logging.rotateOrDeleteFile(bPath); + rotateOrDeleteFile(bPath); const oldB = fs.readFileSync(oldBPath).toString(); expect(fs.accessSync.bind(null, bPath)).to.throw(); expect(oldB).to.equal(initialFileState[bPath]); - logging.rotateOrDeleteFile(bPath); + rotateOrDeleteFile(bPath); expect(fs.accessSync.bind(null, bPath)).to.throw(); expect(fs.accessSync.bind(null, oldBPath)).to.throw(); diff --git a/gui/test/setup/main.js b/gui/test/setup/main.js deleted file mode 100644 index dd458a30b6..0000000000 --- a/gui/test/setup/main.js +++ /dev/null @@ -1,4 +0,0 @@ -const log = require('electron-log'); - -log.transports.console.level = false; -log.transports.file.level = false; diff --git a/gui/test/setup/renderer.ts b/gui/test/setup/renderer.ts index b8e1c5e2a3..05c236a2da 100644 --- a/gui/test/setup/renderer.ts +++ b/gui/test/setup/renderer.ts @@ -1,13 +1,9 @@ -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; - chai.use(spies); chai.use(chaiAsPromised); |
