Maison >interface Web >js tutoriel >Enregistrement personnalisé dans Next.js

Enregistrement personnalisé dans Next.js

Patricia Arquette
Patricia Arquetteoriginal
2025-01-28 10:30:09242parcourir

Next.js Enregistrement du journal personnalisé: capturez le serveur insatisfaisant Fin anormal

NEXT.js lui-même ne peut pas utiliser un enregistreur de journal personnalisé pour gérer l'insatisfaisant et le rejet du côté insatisfaisant du serveur. Bien que vous puissiez utiliser des bibliothèques telles que next-logger, elle est limitée à l'utilisation de Pino. Si vous souhaitez utiliser d'autres bibliothèques de journaux et même envoyer des journaux aux fournisseurs de cloud tels que Datadog, cette méthode n'est pas valide.

La bibliothèque de journaux Loglayer peut résoudre ce problème. Il peut capturer ces anomalies et les envoyer à la bibliothèque de journaux que vous choisissez (comme Pino et Datadog).

Affichez le site Web de Loglayer pour comprendre l'enregistreur de journal et le fournisseur de cloud qui prend en charge le support. installer

Ce guide suppose que vous avez configuré Next.js.

Tout d'abord, installez le progiciel requis. Vous pouvez utiliser n'importe quelle méthode de transmission que vous aimez - Dans cet exemple, nous utiliserons Pino:

set

Vous devez créer un fichier de détection dans le répertoire racine du projet.

<code class="language-bash">npm i loglayer @loglayer/transport-pino pino serialize-error</code>
Tester

Si vous lancez une erreur insatisfaisante de , vous devriez voir ce qui suit dans le terminal:

plus d'informations
<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 Guide intégré. 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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn