Rumah >hujung hadapan web >tutorial js >Pembalakan tersuai di Next.js

Pembalakan tersuai di Next.js

Patricia Arquette
Patricia Arquetteasal
2025-01-28 10:30:09275semak imbas

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.

Pertama, pasangkan pakej perisian yang diperlukan. Anda boleh menggunakan sebarang kaedah penghantaran yang anda suka -dalam contoh ini kami akan menggunakan pino:

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

Jika anda membuang ralat yang tidak memuaskan dari , anda harus melihat yang berikut di terminal:

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn