44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
import { clientIp, logError, logException, logWarn, serializeError } from '../utils/logger'
|
|
|
|
/**
|
|
* 记录未捕获的 H3/Nitro 错误(含 createApiError 抛出的 4xx/5xx)。
|
|
*/
|
|
export default defineNitroPlugin((nitroApp) => {
|
|
nitroApp.hooks.hook('error', (error, { event }) => {
|
|
const serialized = serializeError(error)
|
|
const status = typeof serialized.statusCode === 'number'
|
|
? serialized.statusCode
|
|
: 500
|
|
|
|
if (!event) {
|
|
logError('unhandled error', serialized)
|
|
return
|
|
}
|
|
|
|
const path = getRequestURL(event).pathname
|
|
const method = getMethod(event)
|
|
const base = {
|
|
method,
|
|
path,
|
|
status,
|
|
ip: clientIp(event),
|
|
message: serialized.message,
|
|
...(serialized.statusMessage ? { reason: serialized.statusMessage } : {}),
|
|
...(serialized.data ? { data: serialized.data } : {})
|
|
}
|
|
|
|
if (!path.startsWith('/api/')) {
|
|
if (status >= 500) {
|
|
logException(`${method} ${path}`, error, base)
|
|
}
|
|
return
|
|
}
|
|
|
|
if (status >= 500) {
|
|
logException('API error', error, base)
|
|
} else if (status >= 400) {
|
|
logWarn('API rejected', base)
|
|
}
|
|
})
|
|
})
|