From 72021dfc572e0cbd60e64a316c0f0a7b4c8ef0c7 Mon Sep 17 00:00:00 2001 From: aoirint Date: Thu, 30 Sep 2021 05:51:14 +0900 Subject: [PATCH 1/7] use log level for logging --- package-lock.json | 5 +++++ package.json | 1 + src/background.ts | 30 ++++++++++++++++++++++-------- src/electron/ipc.ts | 4 ++-- src/electron/log.ts | 20 -------------------- 5 files changed, 30 insertions(+), 30 deletions(-) delete mode 100644 src/electron/log.ts diff --git a/package-lock.json b/package-lock.json index 6b5b255f51..46114dc46d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7504,6 +7504,11 @@ "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, + "dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + }, "debounce-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", diff --git a/package.json b/package.json index 0a81eddc3d..6d0fb37f43 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@quasar/extras": "^1.10.9", "ajv": "^8.6.2", "core-js": "^3.6.5", + "dayjs": "^1.10.7", "electron-log": "^4.4.1", "electron-store": "^8.0.0", "encoding-japanese": "^1.0.30", diff --git a/src/background.ts b/src/background.ts index 649c2f6235..5ada9c61d9 100644 --- a/src/background.ts +++ b/src/background.ts @@ -13,11 +13,24 @@ import path from "path"; import { textEditContextMenu } from "./electron/contextMenu"; import { hasSupportedGpu } from "./electron/device"; import { ipcMainHandle, ipcMainSend } from "@/electron/ipc"; -import { logError } from "./electron/log"; import fs from "fs"; import { CharacterInfo, SavingSetting } from "./type/preload"; +import log from "electron-log"; +import dayjs from "dayjs"; + +// silly以上のログをコンソールに出力 +log.transports.console.format = '[{h}:{i}:{s}.{ms}] [{level}] {text}'; +log.transports.console.level = 'silly'; + +// warn以上のログをファイルに出力 +const prefix = dayjs().format('YYYYMMDD_HHmmss'); +log.transports.file.format = '[{h}:{i}:{s}.{ms}] [{level}] {text}'; +log.transports.file.level = 'warn'; +log.transports.file.fileName = `${prefix}_error.log`; + + const isDevelopment = process.env.NODE_ENV !== "production"; let win: BrowserWindow; @@ -26,10 +39,10 @@ let win: BrowserWindow; if (!isDevelopment && !app.requestSingleInstanceLock()) app.quit(); process.on("uncaughtException", (error) => { - logError(error); + log.error(error); }); process.on("unhandledRejection", (reason) => { - logError(reason); + log.error(reason); }); // 設定 @@ -330,7 +343,7 @@ ipcMainHandle("MAXIMIZE_WINDOW", () => { }); ipcMainHandle("LOG_ERROR", (_, ...params) => { - logError(...params); + log.error(...params); }); /** @@ -363,7 +376,7 @@ ipcMainHandle( treeKill(engineProcess.pid, (error) => { // error変数の値がnull以外であればkillコマンドが失敗したことを意味します。 if (error !== null) { - console.log(error); + log.error(error); // 再起動用に設定したclose listenerを削除。 engineProcess.removeListener("close", closeListenerCallBack); @@ -414,8 +427,9 @@ app.on("quit", () => { willQuitEngine = true; try { engineProcess.pid != undefined && treeKill(engineProcess.pid); - } catch { - logError("engine kill error"); + } catch (e: unknown) { + log.error("engine kill error"); + log.error(e); } }); @@ -429,7 +443,7 @@ app.on("ready", async () => { await installExtension(VUEJS3_DEVTOOLS); } catch (e: unknown) { if (e instanceof Error) { - logError("Vue Devtools failed to install:", e.toString()); + log.error("Vue Devtools failed to install:", e.toString()); } } } diff --git a/src/electron/ipc.ts b/src/electron/ipc.ts index 74aebc1e1f..3491435236 100644 --- a/src/electron/ipc.ts +++ b/src/electron/ipc.ts @@ -1,5 +1,5 @@ import { ipcMain, IpcMainInvokeEvent, BrowserWindow } from "electron"; -import { logError } from "@/electron/log"; +import log from "electron-log"; export function ipcMainHandle( channel: T, @@ -19,7 +19,7 @@ export function ipcMainHandle( try { return listener(event, ...args); } catch (e) { - logError(e); + log.error(e); } }; ipcMain.handle(channel, errorHandledListener); diff --git a/src/electron/log.ts b/src/electron/log.ts deleted file mode 100644 index 29d8d5edc6..0000000000 --- a/src/electron/log.ts +++ /dev/null @@ -1,20 +0,0 @@ -import log from "electron-log"; - -const setLogFileName = () => { - //ファイル名に日時を指定 - const d = new Date(); - const prefix = - d.getFullYear() + - ("00" + (d.getMonth() + 1)).slice(-2) + - ("00" + d.getDate()).slice(-2) + - "_" + - ("00" + d.getHours()).slice(-2) + - ("00" + d.getMinutes()).slice(-2) + - ("00" + d.getSeconds()).slice(-2); - log.transports.file.fileName = `${prefix}_error.log`; -}; - -export const logError = (...params: unknown[]): void => { - setLogFileName(); - log.error(...params); -}; From b3cf37c258564918b35cad84d862ad487c5748e1 Mon Sep 17 00:00:00 2001 From: aoirint Date: Thu, 30 Sep 2021 06:00:04 +0900 Subject: [PATCH 2/7] add LOG_INFO ipc --- src/background.ts | 4 ++++ src/electron/preload.ts | 4 ++++ src/store/audio.ts | 2 +- src/store/index.ts | 4 ++++ src/store/type.ts | 1 + src/type/ipc.d.ts | 5 +++++ src/type/preload.d.ts | 1 + 7 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/background.ts b/src/background.ts index 5ada9c61d9..c5e9eb95a7 100644 --- a/src/background.ts +++ b/src/background.ts @@ -346,6 +346,10 @@ ipcMainHandle("LOG_ERROR", (_, ...params) => { log.error(...params); }); +ipcMainHandle("LOG_INFO", (_, ...params) => { + log.info(...params); +}); + /** * エンジンを再起動する。 * エンジンの起動が開始したらresolve、起動が失敗したらreject。 diff --git a/src/electron/preload.ts b/src/electron/preload.ts index 957168c569..55039129f5 100644 --- a/src/electron/preload.ts +++ b/src/electron/preload.ts @@ -148,6 +148,10 @@ const api: Sandbox = { return ipcRenderer.invoke("LOG_ERROR", ...params); }, + logInfo: (...params) => { + return ipcRenderer.invoke("LOG_INFO", ...params); + }, + restartEngine: () => { return ipcRendererInvoke("RESTART_ENGINE"); }, diff --git a/src/store/audio.ts b/src/store/audio.ts index 46697f827e..3ed3d88b37 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -326,7 +326,7 @@ export const audioStore: VoiceVoxStoreOptions< await api.versionVersionGet(); } catch { await new Promise((resolve) => setTimeout(resolve, 1000)); - console.log("waiting engine..."); + window.electron.logInfo("waiting engine..."); continue; } engineState = "READY"; diff --git a/src/store/index.ts b/src/store/index.ts index 228fd5d7cb..f2175183f1 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -23,6 +23,7 @@ export const GET_OSS_LICENSES = "GET_OSS_LICENSES"; export const GET_UPDATE_INFOS = "GET_UPDATE_INFOS"; export const SHOW_WARNING_DIALOG = "SHOW_WARNING_DIALOG"; export const LOG_ERROR = "LOG_ERROR"; +export const LOG_INFO = "LOG_INFO"; const isDevelopment = process.env.NODE_ENV == "development"; @@ -56,6 +57,9 @@ export const indexStore: VoiceVoxStoreOptions< [LOG_ERROR]: (_, ...params: unknown[]) => { window.electron.logError(...params); }, + [LOG_INFO]: (_, ...params: unknown[]) => { + window.electron.logInfo(...params); + }, }, }; diff --git a/src/store/type.ts b/src/store/type.ts index 7d45f0894b..dbf2603ced 100644 --- a/src/store/type.ts +++ b/src/store/type.ts @@ -348,6 +348,7 @@ export type IndexActions = { message: string; }): Promise; LOG_ERROR(...payload: unknown[]): void; + LOG_INFO(...payload: unknown[]): void; }; /* diff --git a/src/type/ipc.d.ts b/src/type/ipc.d.ts index 756eb04a71..a8b4a82104 100644 --- a/src/type/ipc.d.ts +++ b/src/type/ipc.d.ts @@ -107,6 +107,11 @@ type IpcIHData = { return: void; }; + LOG_INFO: { + args: [...params: unknown[]]; + return: void; + }; + RESTART_ENGINE: { args: []; return: void; diff --git a/src/type/preload.d.ts b/src/type/preload.d.ts index 4f7b622e43..58bcdb8690 100644 --- a/src/type/preload.d.ts +++ b/src/type/preload.d.ts @@ -39,6 +39,7 @@ export interface Sandbox { minimizeWindow(): void; maximizeWindow(): void; logError(...params: unknown[]): void; + logInfo(...params: unknown[]): void; restartEngine(): Promise; savingSetting(newData?: SavingSetting): Promise; checkFileExists(file: string): Promise; From 6a861039a6354b0ac649fa61a28b71198fc0c328 Mon Sep 17 00:00:00 2001 From: aoirint Date: Thu, 30 Sep 2021 06:07:54 +0900 Subject: [PATCH 3/7] log cpu/gpu mode --- src/background.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/background.ts b/src/background.ts index c5e9eb95a7..c4d7472454 100644 --- a/src/background.ts +++ b/src/background.ts @@ -105,12 +105,15 @@ async function runEngine() { }); } + const useGpu = store.get("useGpu") + log.info(`ENGINE will start in ${useGpu ? 'GPU' : 'CPU'} mode`) + // エンジンプロセスの起動 const enginePath = path.resolve( appDirPath, process.env.ENGINE_PATH ?? "run.exe" ); - const args = store.get("useGpu") ? ["--use_gpu"] : null; + const args = useGpu ? ["--use_gpu"] : null; engineProcess = execFile( enginePath, args, From 31532f2bd570e1a784085911407808724215bf0c Mon Sep 17 00:00:00 2001 From: aoirint Date: Thu, 30 Sep 2021 06:17:43 +0900 Subject: [PATCH 4/7] fix format --- src/background.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/background.ts b/src/background.ts index c4d7472454..286303db52 100644 --- a/src/background.ts +++ b/src/background.ts @@ -21,16 +21,15 @@ import log from "electron-log"; import dayjs from "dayjs"; // silly以上のログをコンソールに出力 -log.transports.console.format = '[{h}:{i}:{s}.{ms}] [{level}] {text}'; -log.transports.console.level = 'silly'; +log.transports.console.format = "[{h}:{i}:{s}.{ms}] [{level}] {text}"; +log.transports.console.level = "silly"; // warn以上のログをファイルに出力 -const prefix = dayjs().format('YYYYMMDD_HHmmss'); -log.transports.file.format = '[{h}:{i}:{s}.{ms}] [{level}] {text}'; -log.transports.file.level = 'warn'; +const prefix = dayjs().format("YYYYMMDD_HHmmss"); +log.transports.file.format = "[{h}:{i}:{s}.{ms}] [{level}] {text}"; +log.transports.file.level = "warn"; log.transports.file.fileName = `${prefix}_error.log`; - const isDevelopment = process.env.NODE_ENV !== "production"; let win: BrowserWindow; @@ -105,8 +104,8 @@ async function runEngine() { }); } - const useGpu = store.get("useGpu") - log.info(`ENGINE will start in ${useGpu ? 'GPU' : 'CPU'} mode`) + const useGpu = store.get("useGpu"); + log.info(`ENGINE will start in ${useGpu ? "GPU" : "CPU"} mode`); // エンジンプロセスの起動 const enginePath = path.resolve( From 83564e1ddf10eb82a2d1969575de9e5ae23cd2b8 Mon Sep 17 00:00:00 2001 From: aoirint Date: Thu, 30 Sep 2021 06:12:09 +0900 Subject: [PATCH 5/7] use spawn instead execFile for ENGINE exec --- src/background.ts | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/background.ts b/src/background.ts index 286303db52..7c10203f07 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,6 +1,6 @@ "use strict"; -import { execFile, ChildProcess } from "child_process"; +import { spawn, ChildProcess } from "child_process"; import dotenv from "dotenv"; import treeKill from "tree-kill"; import Store from "electron-store"; @@ -112,21 +112,32 @@ async function runEngine() { appDirPath, process.env.ENGINE_PATH ?? "run.exe" ); - const args = useGpu ? ["--use_gpu"] : null; - engineProcess = execFile( - enginePath, - args, - { cwd: path.dirname(enginePath) }, - () => { - if (!willQuitEngine) { - ipcMainSend(win, "DETECTED_ENGINE_ERROR"); - dialog.showErrorBox( - "音声合成エンジンエラー", - "音声合成エンジンが異常終了しました。エンジンを再起動してください。" - ); - } + const args = useGpu ? ["--use_gpu"] : []; + + engineProcess = spawn(enginePath, args, { + cwd: path.dirname(enginePath) + }); + + engineProcess.stdout?.on('data', (data) => { + log.info('ENGINE: ' + data.toString('utf-8')); + }); + + engineProcess.stderr?.on('data', (data) => { + log.error('ENGINE: ' + data.toString('utf-8')); + }); + + engineProcess.on('close', (code, signal) => { + log.info(`ENGINE: terminated due to receipt of signal ${signal}`); + log.info(`ENGINE: exited with code ${code}`); + + if (!willQuitEngine) { + ipcMainSend(win, "DETECTED_ENGINE_ERROR"); + dialog.showErrorBox( + "音声合成エンジンエラー", + "音声合成エンジンが異常終了しました。エンジンを再起動してください。" + ); } - ); + }); } // temp dir From 698096e180afb7651e427e4b42e545b8bdcd3f81 Mon Sep 17 00:00:00 2001 From: aoirint Date: Thu, 30 Sep 2021 06:18:55 +0900 Subject: [PATCH 6/7] fix format --- src/background.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/background.ts b/src/background.ts index 7c10203f07..7c0a8c7cb5 100644 --- a/src/background.ts +++ b/src/background.ts @@ -115,18 +115,18 @@ async function runEngine() { const args = useGpu ? ["--use_gpu"] : []; engineProcess = spawn(enginePath, args, { - cwd: path.dirname(enginePath) + cwd: path.dirname(enginePath), }); - engineProcess.stdout?.on('data', (data) => { - log.info('ENGINE: ' + data.toString('utf-8')); + engineProcess.stdout?.on("data", (data) => { + log.info("ENGINE: " + data.toString("utf-8")); }); - engineProcess.stderr?.on('data', (data) => { - log.error('ENGINE: ' + data.toString('utf-8')); + engineProcess.stderr?.on("data", (data) => { + log.error("ENGINE: " + data.toString("utf-8")); }); - engineProcess.on('close', (code, signal) => { + engineProcess.on("close", (code, signal) => { log.info(`ENGINE: terminated due to receipt of signal ${signal}`); log.info(`ENGINE: exited with code ${code}`); From 56d0d5abacee5d0152b6c773d69d0c36ea442c82 Mon Sep 17 00:00:00 2001 From: aoirint Date: Thu, 30 Sep 2021 07:51:51 +0900 Subject: [PATCH 7/7] follow #278 --- src/store/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/index.ts b/src/store/index.ts index 78b41e4fd4..bb68dd8a7d 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -50,7 +50,7 @@ export const indexStore: VoiceVoxStoreOptions< LOG_ERROR(_, ...params: unknown[]) { window.electron.logError(...params); }, - [LOG_INFO]: (_, ...params: unknown[]) => { + LOG_INFO(_, ...params: unknown[]) { window.electron.logInfo(...params); }, },