Rumah >hujung hadapan web >tutorial js >Pembalakan tersuai di Next.js
Next.js Log Log Custom: Tangkap pelayan yang tidak memuaskan tidak normal
next.js sendiri tidak boleh menggunakan perakam log tersuai untuk mengendalikan yang tidak memuaskan dan penolakan sisi tidak memuaskan pelayan. Walaupun anda boleh menggunakan perpustakaan seperti next-logger
, ia terhad kepada menggunakan Pino. Jika anda ingin menggunakan perpustakaan log lain dan juga menghantar log kepada penyedia awan seperti DataDog, kaedah ini tidak sah.
Perpustakaan log Loglayer dapat menyelesaikan masalah ini. Ia boleh menangkap keabnormalan ini dan menghantarnya ke perpustakaan log yang anda pilih (seperti Pino dan Datadog).
Lihat laman web Loglayer untuk memahami perakam log dan pembekal awan yang menyokong sokongan. Pasang
Panduan ini mengandaikan bahawa anda telah menubuhkan Next.Js.set
Anda perlu membuat fail pengesanan dalam direktori root projek.
<code class="language-bash">npm i loglayer @loglayer/transport-pino pino serialize-error</code>ujian
Maklumat Lanjut
<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 Panduan Bersepadu. 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>
Atas ialah kandungan terperinci Pembalakan tersuai di Next.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!