refactor(logger): optimize logging architecture with 6 improvements
1. Extract shared module: consolidate getLogDir() and isProduction() into shared.ts, eliminate duplication across logger modules 2. Make retention config effective: delay file transport creation until config is loaded, apply appRetention/auditRetention from config.yaml 3. Add before-quit log flush: close logger and audit logger on app exit to prevent log loss 4. Unify logError entry point: remove duplicate logError from index.ts, re-export from error-utils.ts with richer error context 5. Renderer log level filtering: add client-side level check in preload to skip IPC for filtered-out messages 6. Child logger cache + audit cleanup: cache child loggers in IPC handler for performance, remove redundant timestamp format in audit logger Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,13 +2,42 @@ import type { LogLevel } from '../../shared/ipc-channels'
|
||||
import { IPC_CHANNELS } from '../../shared/ipc-channels'
|
||||
import { ipcRenderer } from '../lib/ipc'
|
||||
|
||||
// Cached log level for client-side filtering (avoids IPC for filtered-out messages)
|
||||
let cachedLevel: LogLevel = 'info'
|
||||
|
||||
/**
|
||||
* Check if a message at the given level should be logged
|
||||
* Based on level priority: error > warn > info > debug > verbose
|
||||
*/
|
||||
function shouldLog(level: LogLevel): boolean {
|
||||
const priorities: Record<LogLevel, number> = {
|
||||
verbose: 0,
|
||||
debug: 1,
|
||||
info: 2,
|
||||
warn: 3,
|
||||
error: 4
|
||||
}
|
||||
return (priorities[level] ?? 0) >= (priorities[cachedLevel] ?? 2)
|
||||
}
|
||||
|
||||
export const loggerApi = {
|
||||
log: (level: LogLevel, message: string, context?: Record<string, unknown>): void => {
|
||||
// Drop messages below the configured log level
|
||||
if (!shouldLog(level)) return
|
||||
|
||||
ipcRenderer.send(IPC_CHANNELS.LOGGER_FORWARD, {
|
||||
level,
|
||||
message,
|
||||
context,
|
||||
timestamp: Date.now()
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* Fetch the current log level from main process and cache it
|
||||
* Should be called early in renderer initialization
|
||||
*/
|
||||
fetchLevel: async (): Promise<void> => {
|
||||
cachedLevel = (await ipcRenderer.invoke(IPC_CHANNELS.LOGGER_GET_LEVEL)) as LogLevel
|
||||
}
|
||||
} as const
|
||||
|
||||
1
src/preload/index.d.ts
vendored
1
src/preload/index.d.ts
vendored
@@ -129,6 +129,7 @@ export interface ConfigAPI {
|
||||
|
||||
export interface LoggerAPI {
|
||||
log: (level: LogLevel, message: string, context?: Record<string, unknown>) => void
|
||||
fetchLevel: () => Promise<void>
|
||||
}
|
||||
|
||||
export interface UpdateAPI {
|
||||
|
||||
Reference in New Issue
Block a user