Files
aiartstudio/server/utils/logging.ts
T
2026-04-26 01:13:38 +08:00

63 lines
1.7 KiB
TypeScript

// server/utils/logging.ts - API 调试日志工具:为每次请求生成 requestId 并输出安全错误摘要。
import { randomUUID } from "node:crypto";
import { consola } from "consola";
type LogMeta = Record<string, unknown>;
/** 创建带 requestId、scope 和耗时统计的接口日志器 */
export const createApiLogger = (scope: string) => {
const requestId = randomUUID();
const startedAt = Date.now();
const prefix = `[${scope}]`;
const withBaseMeta = (meta?: LogMeta) => ({
requestId,
...(meta ?? {})
});
return {
requestId,
info(message: string, meta?: LogMeta) {
consola.info(`${prefix} ${message}`, withBaseMeta(meta));
},
warn(message: string, meta?: LogMeta) {
consola.warn(`${prefix} ${message}`, withBaseMeta(meta));
},
error(message: string, meta?: LogMeta) {
consola.error(`${prefix} ${message}`, withBaseMeta(meta));
},
done(message: string = "完成", meta?: LogMeta) {
consola.info(
`${prefix} ${message}`,
withBaseMeta({
...(meta ?? {}),
elapsedMs: Date.now() - startedAt
})
);
}
};
};
/** 将未知错误转换为可写入日志的安全摘要,避免把 cookie/key 等响应体细节打进日志 */
export const toSafeLogError = (error: unknown) => {
const maybeError = error as {
message?: string;
name?: string;
response?: {
status?: number;
};
stack?: string;
status?: number;
statusCode?: number;
statusMessage?: string;
};
return {
name: maybeError.name,
message: maybeError.message ?? maybeError.statusMessage,
status:
maybeError.status ?? maybeError.statusCode ?? maybeError.response?.status,
stack: maybeError.stack
};
};