Next.js Enregistrement du journal personnalisé: capturez le serveur insatisfaisant Fin anormal
NEXT.js lui-même ne peut pas utiliser un enregistreur de journal personnalisé pour gérer l'insatisfaisant et le rejet du côté insatisfaisant du serveur. Bien que vous puissiez utiliser des bibliothèques telles que next-logger
, elle est limitée à l'utilisation de Pino. Si vous souhaitez utiliser d'autres bibliothèques de journaux et même envoyer des journaux aux fournisseurs de cloud tels que Datadog, cette méthode n'est pas valide.
La bibliothèque de journaux Loglayer peut résoudre ce problème. Il peut capturer ces anomalies et les envoyer à la bibliothèque de journaux que vous choisissez (comme Pino et Datadog).
Affichez le site Web de Loglayer pour comprendre l'enregistreur de journal et le fournisseur de cloud qui prend en charge le support. installer
Ce guide suppose que vous avez configuré Next.js.set
Vous devez créer un fichier de détection dans le répertoire racine du projet.
<code class="language-bash">npm i loglayer @loglayer/transport-pino pino serialize-error</code>
plus d'informations
<code class="language-typescript">// instrumentation.ts import { LogLayer, type ILogLayer } from 'loglayer'; import { PinoTransport } from "@loglayer/transport-pino"; import pino from "pino"; import { serializeError } from "serialize-error"; /** * 去除字符串中的ANSI代码,这是Next.js喜欢注入的内容。 */ function stripAnsiCodes(str: string): string { return str.replace( /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=>/, '' ); } function createConsoleMethod(log: ILogLayer, method: string) { const mappedMethod = method === "error" ? "errorOnly" : method; return (...args: unknown[]): void => { const data: Record<string, unknown> = {}; let hasData = false; let error: Error | null = null; const messages: string[] = []; for (const arg of args) { if (arg instanceof Error) { error = arg; continue; } if (typeof arg === "object" && arg !== null) { Object.assign(data, arg); hasData = true; continue; } if (typeof arg === "string") { messages.push(arg); } } let finalMessage = stripAnsiCodes(messages.join(" ")).trim(); // next.js在错误对象时使用“x”作为错误消息 if (finalMessage === "⨯" && error) { finalMessage = error?.message || ""; } if (error && hasData && messages.length > 0) { log.withError(error).withMetadata(data)[mappedMethod](finalMessage); } else if (error && messages.length > 0) { log.withError(error)[mappedMethod](finalMessage); } else if (hasData && messages.length > 0) { log.withMetadata(data)[mappedMethod](finalMessage); } else if (error && hasData && messages.length === 0) { log.withError(error).withMetadata(data)[mappedMethod](""); } else if (error && messages.length === 0) { log.errorOnly(error); } else if (hasData && messages.length === 0) { log.metadataOnly(data); } else { log[mappedMethod](finalMessage); } }; } export async function register() { const logger = new LogLayer({ errorSerializer: serializeError, transport: [ new PinoTransport({ logger: pino(), }), ] }); if (process.env.NEXT_RUNTIME === "nodejs") { console.error = createConsoleMethod(logger, "error"); console.log = createConsoleMethod(logger, "log"); console.info = createConsoleMethod(logger, "info"); console.warn = createConsoleMethod(logger, "warn"); console.debug = createConsoleMethod(logger, "debug"); } }</code>
Loglayer Next.js Guide intégré. page.tsx
<code class="language-json">{"err":{"type":"Object","message":"test","stack":"Error: test\n at Page (webpack-internal:///(rsc)/./src/app/page.tsx:12:11)","digest":"699232626","name":"Error"},"msg":"test"}</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!