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

Enregistrement personnalisé dans Next.js

Patricia Arquette
Libérer: 2025-01-28 10:30:09
original
237 Les gens l'ont consulté

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>
Copier après la connexion
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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal