2026-04-21 12:35:48 +08:00
|
|
|
import pino from 'pino'
|
|
|
|
|
import { resolve } from 'path'
|
|
|
|
|
import { mkdirSync, statSync, truncateSync, openSync, readSync, closeSync, writeFileSync } from 'fs'
|
|
|
|
|
import { homedir } from 'os'
|
|
|
|
|
|
|
|
|
|
const MAX_LOG_SIZE = 3 * 1024 * 1024 // 3MB
|
2026-04-23 19:49:31 +08:00
|
|
|
const CHECK_INTERVAL = 60_000 // Check every minute
|
2026-04-21 12:35:48 +08:00
|
|
|
|
|
|
|
|
const logDir = resolve(homedir(), '.hermes-web-ui', 'logs')
|
|
|
|
|
mkdirSync(logDir, { recursive: true })
|
|
|
|
|
|
|
|
|
|
const logFile = resolve(logDir, 'server.log')
|
2026-05-14 21:02:59 +08:00
|
|
|
const bridgeLogFile = resolve(logDir, 'bridge.log')
|
2026-04-21 12:35:48 +08:00
|
|
|
|
2026-05-14 21:02:59 +08:00
|
|
|
function rotateFileIfNeeded(file: string) {
|
2026-04-23 19:49:31 +08:00
|
|
|
try {
|
2026-05-14 21:02:59 +08:00
|
|
|
const stat = statSync(file)
|
2026-04-23 19:49:31 +08:00
|
|
|
if (stat.size > MAX_LOG_SIZE) {
|
|
|
|
|
const keepSize = Math.floor(MAX_LOG_SIZE / 2)
|
2026-05-14 21:02:59 +08:00
|
|
|
const fd = openSync(file, 'r')
|
2026-04-23 19:49:31 +08:00
|
|
|
const buf = Buffer.alloc(keepSize)
|
|
|
|
|
readSync(fd, buf, 0, keepSize, stat.size - keepSize)
|
|
|
|
|
closeSync(fd)
|
2026-05-14 21:02:59 +08:00
|
|
|
truncateSync(file, 0)
|
|
|
|
|
writeFileSync(file, buf)
|
2026-04-23 19:49:31 +08:00
|
|
|
}
|
2026-04-24 20:41:14 +08:00
|
|
|
} catch { }
|
2026-04-23 19:49:31 +08:00
|
|
|
}
|
|
|
|
|
|
2026-05-14 21:02:59 +08:00
|
|
|
function rotateIfNeeded() {
|
|
|
|
|
rotateFileIfNeeded(logFile)
|
|
|
|
|
rotateFileIfNeeded(bridgeLogFile)
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-23 19:49:31 +08:00
|
|
|
// Rotate on startup
|
|
|
|
|
rotateIfNeeded()
|
|
|
|
|
|
|
|
|
|
// Periodic rotation check — prevents unbounded log growth
|
|
|
|
|
setInterval(rotateIfNeeded, CHECK_INTERVAL)
|
2026-04-21 12:35:48 +08:00
|
|
|
|
|
|
|
|
export const logger = pino({
|
|
|
|
|
level: process.env.LOG_LEVEL || 'info',
|
|
|
|
|
}, pino.destination({
|
|
|
|
|
dest: logFile,
|
2026-04-24 20:41:14 +08:00
|
|
|
sync: true,
|
2026-04-21 12:35:48 +08:00
|
|
|
}))
|
2026-05-14 21:02:59 +08:00
|
|
|
|
|
|
|
|
export const bridgeLogger = pino({
|
|
|
|
|
level: process.env.BRIDGE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
|
|
|
|
|
name: 'bridge',
|
|
|
|
|
}, pino.destination({
|
|
|
|
|
dest: bridgeLogFile,
|
|
|
|
|
sync: true,
|
|
|
|
|
}))
|