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

Pembalakan tersuai di Next.js

Patricia Arquette
Lepaskan: 2025-01-28 10:30:09
asal
295 orang telah melayarinya

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.

npm i loglayer @loglayer/transport-pino pino serialize-error
Salin selepas log masuk
ujian <测试>

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

Maklumat Lanjut <<>
// 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");
  }
}
Salin selepas log masuk

Loglayer

Loglayer Next.js Panduan Bersepadu. page.tsx

{"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"}
Salin selepas log masuk

Atas ialah kandungan terperinci Pembalakan tersuai di Next.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan