feat: 保存 renderer 日志到文件

This commit is contained in:
qier222 2022-04-16 13:30:25 +08:00
parent d3089b8940
commit 4c625b172c
No known key found for this signature in database
GPG key ID: 9C85007ED905F14D
12 changed files with 61 additions and 31 deletions

View file

@ -2,7 +2,7 @@ import { db, Tables } from './db'
import type { FetchTracksResponse } from '../renderer/api/track'
import { app } from 'electron'
import { Request, Response } from 'express'
import logger from './logger'
import log from './log'
import fs from 'fs'
import * as musicMetadata from 'music-metadata'
import { APIs } from './CacheAPIsName'
@ -203,7 +203,7 @@ class Cache {
if (api === APIs.SongDetail) {
const cache = this.get(api, req.query)
if (cache) {
logger.debug(`[cache] Cache hit for ${req.path}`)
log.debug(`[cache] Cache hit for ${req.path}`)
return cache
}
}
@ -220,7 +220,7 @@ class Cache {
)
if (!isAudioFileExists) return
logger.debug(`[cache] Audio cache hit for ${req.path}`)
log.debug(`[cache] Audio cache hit for ${req.path}`)
return {
data: [
@ -306,9 +306,9 @@ class Cache {
await fs.writeFile(`${path}/${id}-${br}.${type}`, buffer, error => {
if (error) {
return logger.error(`[cache] cacheAudio failed: ${error}`)
return log.error(`[cache] cacheAudio failed: ${error}`)
}
logger.info(`Audio file ${id}-${br}.${type} cached!`)
log.info(`Audio file ${id}-${br}.${type} cached!`)
db.upsert(Tables.Audio, {
id,
@ -318,7 +318,7 @@ class Cache {
updateAt: Date.now(),
})
logger.info(`[cache] cacheAudio ${id}-${br}.${type}`)
log.info(`[cache] cacheAudio ${id}-${br}.${type}`)
})
}
}

View file

@ -2,7 +2,7 @@ import path from 'path'
import { app } from 'electron'
import fs from 'fs'
import SQLite3 from 'better-sqlite3'
import logger from './logger'
import log from './log'
import { createFileIfNotExist } from './utils'
const isDev = process.env.NODE_ENV === 'development'
@ -29,7 +29,7 @@ class DB {
)
constructor() {
logger.info('[db] Initializing database...')
log.info('[db] Initializing database...')
createFileIfNotExist(this.dbFilePath)
@ -42,7 +42,7 @@ class DB {
this.sqlite.pragma('auto_vacuum = FULL')
this.initTables()
logger.info('[db] Database initialized')
log.info('[db] Database initialized')
}
initTables() {

View file

@ -10,7 +10,7 @@ import {
import Store from 'electron-store'
import { release } from 'os'
import path, { join } from 'path'
import logger from './logger'
import log from './log'
import { initIpcMain } from './ipcMain'
const isWindows = process.platform === 'win32'
@ -18,7 +18,7 @@ const isMac = process.platform === 'darwin'
const isLinux = process.platform === 'linux'
const isDev = process.env.NODE_ENV === 'development'
logger.info('[index] Main process start')
log.info('[index] Main process start')
// Disable GPU Acceleration for Windows 7
if (release().startsWith('6.1')) app.disableHardwareAcceleration()
@ -99,7 +99,7 @@ async function createWindow() {
}
app.whenReady().then(async () => {
logger.info('[index] App ready')
log.info('[index] App ready')
createWindow()
handleWindowEvents()
initIpcMain(win)
@ -113,10 +113,10 @@ app.whenReady().then(async () => {
// eslint-disable-next-line @typescript-eslint/no-var-requires
} = require('electron-devtools-installer')
installExtension(REACT_DEVELOPER_TOOLS.id).catch(err =>
logger.info('An error occurred: ', err)
log.info('An error occurred: ', err)
)
installExtension(REDUX_DEVTOOLS.id).catch(err =>
logger.info('An error occurred: ', err)
log.info('An error occurred: ', err)
)
}
})

View file

@ -2,7 +2,7 @@ import { BrowserWindow, ipcMain, app } from 'electron'
import { db, Tables } from './db'
import { IpcChannels } from './IpcChannelsName'
import cache from './cache'
import logger from './logger'
import log from './log'
import fs from 'fs'
import { APIs } from './CacheAPIsName'

View file

@ -5,14 +5,17 @@
* @see https://www.npmjs.com/package/electron-log
*/
import logger from 'electron-log'
import log from 'electron-log'
import pc from 'picocolors'
Object.assign(console, logger.functions)
logger.transports.console.format = `${pc.dim('{h}:{i}:{s}{scope}')} {text}`
logger.transports.file.level = 'info'
Object.assign(console, log.functions)
log.variables.process = 'main'
log.transports.console.format = `[{process}] ${pc.dim(
'{h}:{i}:{s}{scope}'
)} {level} {text}`
log.transports.file.level = 'info'
logger.info(
log.info(
`\n\n██╗ ██╗███████╗███████╗██████╗ ██╗ █████╗ ██╗ ██╗███╗ ███╗██╗ ██╗███████╗██╗ ██████╗
@ -21,6 +24,6 @@ logger.info(
\n`
)
export default logger
export default log
logger.info(`[logger] logger initialized`)
log.info(`[logger] logger initialized`)

View file

@ -1,4 +1,4 @@
import logger from './logger'
import log from './log'
import path from 'path'
import { app } from 'electron'
import { createDirIfNotExist } from './utils'
@ -10,4 +10,4 @@ if (isDev) {
createDirIfNotExist(devUserDataPath)
app.setPath('appData', devUserDataPath)
}
logger.info(`[index] userData path: ${app.getPath('userData')}`)
log.info(`[index] userData path: ${app.getPath('userData')}`)

View file

@ -1,5 +1,15 @@
import { IpcChannels } from '@/main/IpcChannelsName'
const { contextBridge, ipcRenderer } = require('electron')
const log = require('electron-log')
const isDev = process.env.NODE_ENV === 'development'
log.transports.file.level = 'info'
log.variables.process = 'renderer'
log.transports.console.format = isDev
? `[{process}] {text}`
: `[{process}] {h}:{i}:{s}{scope} {level} {text}`
contextBridge.exposeInMainWorld('log', log)
contextBridge.exposeInMainWorld('ipcRenderer', {
sendSync: ipcRenderer.sendSync,
@ -14,6 +24,7 @@ contextBridge.exposeInMainWorld('ipcRenderer', {
}
},
})
contextBridge.exposeInMainWorld('env', {
isElectron: true,
isEnableTitlebar:

View file

@ -1,9 +1,9 @@
import * as Sentry from '@sentry/node'
import * as Tracing from '@sentry/tracing'
import pkg from '../../package.json'
import logger from './logger'
import log from './log'
logger.info(`[sentry] sentry initializing`)
log.info(`[sentry] sentry initializing`)
Sentry.init({
dsn: 'https://2aaaa67f1c3d4d6baefafa5d58fcf340@o436528.ingest.sentry.io/6274637',
@ -16,4 +16,4 @@ Sentry.init({
tracesSampleRate: 1.0,
})
logger.info(`[sentry] sentry initialized`)
log.info(`[sentry] sentry initialized`)

View file

@ -1,12 +1,12 @@
import { pathCase } from 'change-case'
import cookieParser from 'cookie-parser'
import express, { Request, Response } from 'express'
import logger from './logger'
import log from './log'
import cache from './cache'
import fileUpload from 'express-fileupload'
import path from 'path'
logger.info('[server] starting http server')
log.info('[server] starting http server')
const isDev = process.env.NODE_ENV === 'development'
const isProd = process.env.NODE_ENV === 'production'
@ -24,7 +24,7 @@ Object.entries(neteaseApi).forEach(([name, handler]) => {
name = pathCase(name)
const wrappedHandler = async (req: Request, res: Response) => {
logger.debug(`[server] Handling request: ${req.path}`)
log.debug(`[server] Handling request: ${req.path}`)
// Get from cache
const cacheData = await cache.getForExpress(name, req)
@ -93,5 +93,5 @@ const port = Number(
: process.env.ELECTRON_DEV_NETEASE_API_PORT ?? 3000
)
app.listen(port, () => {
logger.info(`[server] API server listening on port ${port}`)
log.info(`[server] API server listening on port ${port}`)
})

View file

@ -1,4 +1,5 @@
import { IpcChannels } from '@/main/IpcChannelsName'
import { ElectronLog } from 'electron-log'
export {}
@ -20,6 +21,7 @@ declare global {
isMac: boolean
isWin: boolean
}
log?: ElectronLog
}
}

View file

@ -1,3 +1,4 @@
import './utils/initLog'
import { StrictMode } from 'react'
import * as ReactDOMClient from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'

View file

@ -0,0 +1,13 @@
export {}
if (window.log) {
Object.assign(console, window.log.functions)
window.log.info(
`\n\n██╗ ██╗███████╗███████╗██████╗ ██╗ █████╗ ██╗ ██╗███╗ ███╗██╗ ██╗███████╗██╗ ██████╗
\n`
)
}