Files
Hermes-ui/packages/server/src/services/logger.ts
T
ekko 9a9416c99c Fix bridge history, profile models, and Windows gateway handling (#845)
* feat: support profile-aware group chat bridge flows

* feat: route cron jobs through hermes cli

* Fix group chat routing and isolate bridge tests

* Add Grok image-to-video media skill

* Default Grok videos to media directory

* Fix bridge profile fallback and cron repeat clearing

* Refine bridge chat and gateway platform handling

* Filter bridge tool-call text deltas

* Preserve structured bridge chat history

* Prepare beta release build artifacts

* Fix Windows run profile resolution

* Fix Windows path compatibility checks

* Fix profile-scoped model page display

* Hide Windows subprocess windows for jobs and updates

* Hide Windows file backend subprocess windows

* Avoid Windows gateway restart lock conflicts

* Treat Windows gateway lock as running on startup

* Force release Windows gateway lock on restart

* Tighten Windows gateway lock cleanup

* Update chat e2e source expectation

* Bump package version to 0.5.30

---------

Co-authored-by: Codex <codex@openai.com>
2026-05-19 16:09:59 +08:00

58 lines
1.5 KiB
TypeScript

import pino from 'pino'
import { tmpdir } from 'os'
import { join, resolve } from 'path'
import { mkdirSync, statSync, truncateSync, openSync, readSync, closeSync, writeFileSync } from 'fs'
import { config } from '../config'
const MAX_LOG_SIZE = 3 * 1024 * 1024 // 3MB
const CHECK_INTERVAL = 60_000 // Check every minute
const logDir = process.env.VITEST
? resolve(tmpdir(), 'hermes-web-ui-test-logs', String(process.pid))
: resolve(config.appHome, 'logs')
mkdirSync(logDir, { recursive: true })
const logFile = resolve(logDir, 'server.log')
const bridgeLogFile = resolve(logDir, 'bridge.log')
function rotateFileIfNeeded(file: string) {
try {
const stat = statSync(file)
if (stat.size > MAX_LOG_SIZE) {
const keepSize = Math.floor(MAX_LOG_SIZE / 2)
const fd = openSync(file, 'r')
const buf = Buffer.alloc(keepSize)
readSync(fd, buf, 0, keepSize, stat.size - keepSize)
closeSync(fd)
truncateSync(file, 0)
writeFileSync(file, buf)
}
} catch { }
}
function rotateIfNeeded() {
rotateFileIfNeeded(logFile)
rotateFileIfNeeded(bridgeLogFile)
}
// Rotate on startup
rotateIfNeeded()
// Periodic rotation check — prevents unbounded log growth
setInterval(rotateIfNeeded, CHECK_INTERVAL)
export const logger = pino({
level: process.env.LOG_LEVEL || 'info',
}, pino.destination({
dest: logFile,
sync: true,
}))
export const bridgeLogger = pino({
level: process.env.BRIDGE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
name: 'bridge',
}, pino.destination({
dest: bridgeLogFile,
sync: true,
}))