Heim > Web-Frontend > js-Tutorial > Benutzerdefinierte Protokollierung in Next.js

Benutzerdefinierte Protokollierung in Next.js

Patricia Arquette
Freigeben: 2025-01-28 10:30:09
Original
237 Leute haben es durchsucht

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

Protokollbibliothek von LogLayer kann dieses Problem lösen. Es kann diese Anomalien erfassen und an die von Ihnen ausgewählte Protokollbibliothek senden (z. B. Pino und Datadog).

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.

Installieren Sie zunächst das erforderliche Softwarepaket. Sie können jede Übertragungsmethode verwenden, die Ihnen gefällt. In diesem Beispiel werden wir Pino verwenden:

set Sie müssen eine Erkennungsdatei im Projektstammverzeichnis erstellen.

Test
<code class="language-bash">npm i loglayer @loglayer/transport-pino pino serialize-error</code>
Nach dem Login kopieren
Wenn Sie einen unbefriedigenden Fehler aus werfen, sollten Sie Folgendes im Terminal sehen:

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>
Nach dem Login kopieren
LogLayer

LogLayer Next.js Integrated Guide.

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage