bugfix: 多进程导致日志记录异常的问题修复 (#434)

pull/437/head
王良 2025-01-13 16:44:57 +08:00 committed by GitHub
parent 80e3f9885c
commit 8a96850e42
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 68 additions and 38 deletions

View File

@ -2,7 +2,7 @@ const fs = require('node:fs')
const path = require('node:path')
const server = require('@docmirror/mitmproxy')
const jsonApi = require('@docmirror/mitmproxy/src/json')
const log = require('@docmirror/mitmproxy/src/utils/util.log')
const log = require('@docmirror/mitmproxy/src/utils/util.log') // 当前脚本是在 server 的进程中执行的,所以使用 mitmproxy 中的logger
const home = process.env.USER_HOME || process.env.HOME || 'C:/Users/Administrator/'
@ -21,5 +21,5 @@ const config = jsonApi.parse(configJson.toString())
// const pacFilePath = '../../gui/extra/pac/pac.txt'
// config.plugin.overwall.pac.customPacFilePath = path.join(__dirname, pacFilePath)
config.setting.rootDir = path.join(__dirname, '../../gui/')
log.info(`start mitmproxy config by cli: 读取配置文件: ${configPath}`)
log.info(`start mitmproxy by cli, configPath: ${configPath}`)
server.start(config)

View File

@ -1,5 +1,5 @@
const log4js = require('./util.logger')
const loggerFactory = require('./util.logger')
const logger = log4js.getLogger('core')
const logger = loggerFactory.getLogger('core')
module.exports = logger

View File

@ -2,6 +2,7 @@ const path = require('node:path')
const log4js = require('log4js')
const configFromFiles = require('../config/index').configFromFiles
// 日志级别
const level = process.env.NODE_ENV === 'development' ? 'debug' : 'info'
function getDefaultConfigBasePath () {
@ -17,39 +18,68 @@ function getDefaultConfigBasePath () {
}
}
// 日志文件名
const coreLogFilename = path.join(getDefaultConfigBasePath(), '/core.log')
const guiLogFilename = path.join(getDefaultConfigBasePath(), '/gui.log')
const serverLogFilename = path.join(getDefaultConfigBasePath(), '/server.log')
// 日志文件目录
const basePath = getDefaultConfigBasePath()
// 日志相关配置
const backups = configFromFiles.app.keepLogFileCount // 保留日志文件数
// 通用日志配置
const appenderConfig = {
type: 'file',
pattern: 'yyyy-MM-dd',
keepFileExt: true, // 保留日志文件扩展名
compress: true, // 压缩日志文件
// 以下三个配置都设置,兼容新旧版本
backups,
numBackups: backups,
daysToKeep: backups,
keepFileExt: true, // 保留日志文件扩展名为 .log
backups: configFromFiles.app.keepLogFileCount, // 保留日志文件数
}
// 设置日志配置
log4js.configure({
appenders: {
std: { type: 'stdout' },
core: { ...appenderConfig, filename: coreLogFilename },
gui: { ...appenderConfig, filename: guiLogFilename },
server: { ...appenderConfig, filename: serverLogFilename },
},
categories: {
default: { appenders: ['std'], level },
core: { appenders: ['core', 'std'], level },
gui: { appenders: ['gui', 'std'], level },
server: { appenders: ['server', 'std'], level },
},
})
let log = null
module.exports = log4js
// 设置一组日志配置
function log4jsConfigure (categories) {
const config = {
appenders: {
std: { type: 'stdout' },
},
categories: {
default: { appenders: ['std'], level },
},
}
for (const category of categories) {
config.appenders[category] = { ...appenderConfig, filename: path.join(basePath, `/${category}.log`) }
config.categories[category] = { appenders: [category, 'std'], level }
}
log4js.configure(config)
// 拿第一个日志类型来logger并设置到log变量中
log = log4js.getLogger(categories[0])
log.info('设置日志配置完成:', config)
}
module.exports = {
getLogger (category) {
if (!category) {
if (log) {
log.error('未指定日志类型,无法配置并获取日志对象!!!')
}
throw new Error('未指定日志类型,无法配置并获取日志对象!!!')
}
if (category === 'core' || category === 'gui') {
// core 和 gui 的日志配置,因为它们在同一进程中,所以一起配置,且只能配置一次
if (log == null) {
log4jsConfigure(['core', 'gui'])
}
return log4js.getLogger(category)
} else {
if (log == null) {
log4jsConfigure([category])
} else {
log.error(`当前进程已经设置过日志配置,无法设置 "${category}" 的配置,先临时返回 "${log.category}" 的 log 进行日志记录。如果与其他类型的日志在同一进程中写入,请参照 core 和 gui 一起配置`)
}
return log
}
},
}

View File

@ -2,7 +2,7 @@ const fs = require('node:fs')
const path = require('node:path')
const server = require('@docmirror/mitmproxy')
const jsonApi = require('@docmirror/mitmproxy/src/json')
const log = require('../utils/util.log')
const log = require('@docmirror/mitmproxy/src/utils/util.log') // 当前脚本是在 server 的进程中执行的,所以使用 mitmproxy 中的logger
const configPath = process.argv[2]
const configJson = fs.readFileSync(configPath)
@ -13,5 +13,5 @@ const config = jsonApi.parse(configJson.toString())
// const pacFilePath = '../extra/pac/pac.txt'
// config.plugin.overwall.pac.customPacFilePath = path.join(__dirname, pacFilePath)
config.setting.rootDir = path.join(__dirname, '../')
log.info(`start mitmproxy config by gui bridge: ${configPath}`)
log.info(`start mitmproxy by gui bridge, configPath: ${configPath}`)
server.start(config)

View File

@ -1,5 +1,5 @@
const log4js = require('@docmirror/dev-sidecar/src/utils/util.logger')
const loggerFactory = require('@docmirror/dev-sidecar/src/utils/util.logger')
const logger = log4js.getLogger('gui')
const logger = loggerFactory.getLogger('gui')
module.exports = logger

View File

@ -1,5 +1,5 @@
const log4js = require('@docmirror/dev-sidecar/src/utils/util.logger')
const loggerFactory = require('@docmirror/dev-sidecar/src/utils/util.logger')
const logger = log4js.getLogger('server')
const logger = loggerFactory.getLogger('server')
module.exports = logger