Next.js benutzerdefinierter Protokolldatensatz: Erfassen
Next.js selbst kann einen benutzerdefinierten Protokollrekorder nicht verwenden, um die unbefriedigende und Ablehnung der unbefriedigenden Seite des Servers zu verarbeiten. Obwohl Sie Bibliotheken wie verwenden können, ist dies auf die Verwendung von Pino beschränkt. Wenn Sie andere Protokollbibliotheken verwenden und sogar Protokolle an Cloud -Anbieter wie Datadog senden möchten, ist diese Methode ungültig. next-logger
Sehen Sie sich die LogLayer -Website an, um den Protokollrekorder und den Cloud -Anbieter zu verstehen, der die Unterstützung unterstützt.
installieren Diese Anleitung setzt davon aus, dass Sie Next eingerichtet haben.js.
set Sie müssen eine Erkennungsdatei im Projektstammverzeichnis erstellen.
Test
<code class="language-bash">npm i loglayer @loglayer/transport-pino pino serialize-error</code>
Weitere Informationen
<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>
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>
Das obige ist der detaillierte Inhalt vonBenutzerdefinierte Protokollierung in Next.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!