release: v1.1.1 — session fixes, storage cleanup, logging
GitHub Release / release (push) Canceled after 0s
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
Publish Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Canceled after 0s
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Canceled after 0s
Publish Docker image / merge (push) Canceled after 0s
GitHub Release / release (push) Canceled after 0s
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
Publish Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Canceled after 0s
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Canceled after 0s
Publish Docker image / merge (push) Canceled after 0s
This commit is contained in:
1 parent
acc64751ef
commit
901fefb3f5
20 files changed
+231
-37
No files matched your search
@@ -7,6 +7,12 @@ const LEVEL_ORDER: Record<LogLevel, number> = {
|
||||
error: 40
|
||||
}
|
||||
|
||||
type H3LikeError = Error & {
|
||||
statusCode?: number
|
||||
statusMessage?: string
|
||||
data?: unknown
|
||||
}
|
||||
|
||||
function currentLevel(): LogLevel {
|
||||
const raw = (process.env.LOG_LEVEL || 'info').toLowerCase()
|
||||
if (raw === 'debug' || raw === 'info' || raw === 'warn' || raw === 'error') {
|
||||
@@ -27,6 +33,35 @@ function formatLine(level: LogLevel, message: string, extra?: Record<string, unk
|
||||
return `[${time}] [${level.toUpperCase()}] ${message}${payload}`
|
||||
}
|
||||
|
||||
/** 将 unknown / Error / H3Error 转为可 JSON 输出的字段,便于 Docker 日志排查 */
|
||||
export function serializeError(error: unknown): Record<string, unknown> {
|
||||
if (error instanceof Error) {
|
||||
const h3 = error as H3LikeError
|
||||
const out: Record<string, unknown> = {
|
||||
name: error.name,
|
||||
message: error.message
|
||||
}
|
||||
if (h3.statusCode !== undefined) out.statusCode = h3.statusCode
|
||||
if (h3.statusMessage) out.statusMessage = h3.statusMessage
|
||||
if (h3.data !== undefined) out.data = h3.data
|
||||
if (error.stack && shouldLog('debug')) out.stack = error.stack
|
||||
else if (error.stack && (h3.statusCode ?? 500) >= 500) out.stack = error.stack
|
||||
if ('cause' in error && error.cause !== undefined) {
|
||||
out.cause = serializeError(error.cause)
|
||||
}
|
||||
return out
|
||||
}
|
||||
if (typeof error === 'string') return { message: error }
|
||||
if (error && typeof error === 'object') {
|
||||
try {
|
||||
return { detail: JSON.parse(JSON.stringify(error)) }
|
||||
} catch {
|
||||
return { message: String(error) }
|
||||
}
|
||||
}
|
||||
return { message: String(error) }
|
||||
}
|
||||
|
||||
export function logDebug(message: string, extra?: Record<string, unknown>) {
|
||||
if (!shouldLog('debug')) return
|
||||
console.debug(formatLine('debug', message, extra))
|
||||
@@ -47,6 +82,11 @@ export function logError(message: string, extra?: Record<string, unknown>) {
|
||||
console.error(formatLine('error', message, extra))
|
||||
}
|
||||
|
||||
/** message + 原始 error 对象(自动 serialize) */
|
||||
export function logException(message: string, error: unknown, extra?: Record<string, unknown>) {
|
||||
logError(message, { ...extra, error: serializeError(error) })
|
||||
}
|
||||
|
||||
export function clientIp(event: Parameters<typeof getRequestIP>[0]): string {
|
||||
return getRequestIP(event, { xForwardedFor: true }) || '-'
|
||||
}
|
||||
Reference in new issue
Block a user