> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Logging aus Node.js

export const VersionRequirements = ({versions = []}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const boundaries = {
    upper: " or lower",
    exact: "",
    lower: " or higher"
  };
  const containerStyle = {
    marginTop: "0.5rem",
    marginBottom: "1.5rem"
  };
  const lineStyle = {
    display: "block",
    margin: "0 0 0.35rem 0",
    fontSize: "0.875rem",
    lineHeight: "1.4"
  };
  const pillBaseStyle = {
    display: "inline-block",
    padding: "0.1em 0.4em",
    borderRadius: "0.25rem",
    border: "1px solid",
    fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
    fontSize: "0.85em",
    fontWeight: 500
  };
  const pillColors = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#e9d5ff",
      color: "#9333ea"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#99f6e4",
      color: "#0d9488"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#bbf7d0",
      color: "#16a34a"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#bfdbfe",
      color: "#2563eb"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fecaca",
      color: "#dc2626"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fed7aa",
      color: "#ea580c"
    }
  };
  const defaultPillColor = {
    background: "#f4f4f5",
    borderColor: "#e4e4e7",
    color: "#52525b"
  };
  const getPillStyle = name => ({
    ...pillBaseStyle,
    ...pillColors[name] || defaultPillColor
  });
  const getBoundText = bound => {
    return boundaries[bound] || boundaries.lower;
  };
  return <div style={containerStyle}>
      {versions.map((v, i) => <p key={`${v.name}-${v.version}-${v.bound || "lower"}-${i}`} style={lineStyle}>
          This feature requires{" "}
          <code style={getPillStyle(v.name)}>{v.name}</code> version {v.version}
          {getBoundText(v.bound)}.
        </p>)}
    </div>;
};

export const Compatibility = ({versions = [], label = "Available in"}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const defaultPillStyle = {
    borderColor: "#d4d4d8",
    background: "#f4f4f5",
    color: "#3f3f46"
  };
  const pillStyles = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#d8b4fe",
      color: "#6b21a8"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#5eead4",
      color: "#115e59"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#86efac",
      color: "#166534"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#93c5fd",
      color: "#1e40af"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fca5a5",
      color: "#991b1b"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fdba74",
      color: "#9a3412"
    }
  };
  const getPillStyle = name => ({
    ...defaultPillStyle,
    ...pillStyles[name] || ({})
  });
  return <div className="not-prose my-4 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-sm dark:border-white/10 dark:bg-white/5">
      <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
        <span className="font-semibold text-zinc-700 dark:text-zinc-200">
          {label}:
        </span>
        {versions.map((v, i) => <span key={`${v.name}-${v.version}-${i}`} className="inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium" style={getPillStyle(v.name)}>
            <span>{v.name}</span>
            <span className="opacity-70">
              {v.version}
              {v.exact ? "" : "+"}
            </span>
          </span>)}
      </div>
    </div>;
};

<VersionRequirements
  versions={[
{ name: "AppSignal for Node.js", version: "3.0.1" }
]}
/>

Diese Dokumentation beschreibt, wie Sie Logging mit der AppSignal for Node.js-Integration konfigurieren.

## Logging konfigurieren

<Warning>
  🔐 Senden Sie keine <strong>personenbezogenen Daten (Personal Identifiable Information, PII)</strong> an AppSignal. Filtern Sie PII (z. B. Namen, E-Mail-Adressen) aus Logs und verwenden Sie stattdessen eine ID, einen Hash oder einen pseudonymisierten Bezeichner. <br /> <br /> Für **HIPAA-pflichtige Stellen** finden Sie weitere Informationen zum Abschluss eines Business Associate Agreement (BAA) in unserer [Business Add-Ons-Dokumentation](/support/business-add-ons).
</Warning>

Sie müssen keine Log-Quelle erstellen, um Logs aus der AppSignal for Node.js-Integration zu senden. Eine "application"-Log-Quelle wird automatisch erstellt.

### Eigenständige Verwendung

Um den Logger zu verwenden, müssen Sie AppSignal importieren und den Logger über die Funktion `.logger()` einrichten.

Die Funktion `.logger()` akzeptiert zwei Argumente: `group` und optional `severityThreshold`. Wenn `severityThreshold` nicht angegeben wird, ist der Standardwert `info`.

<CodeGroup>
  ```javascript Node.js theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  const logger = Appsignal.logger("app");

  // with a severity threshold:
  const logger = Appsignal.logger("app", "info");
  ```
</CodeGroup>

Es gibt sechs verfügbare Severity-Stufen: `trace`, `debug`, `info`, `log`, `warn` und `error`, jede mit einer eigenen Funktion gleichen Namens. Diese Funktionen akzeptieren zwei Argumente: `message` und `attributes`. `attributes` wird für Metadaten verwendet und ist optional.

Nachrichten werden nur dann geloggt, wenn ihre Severity-Stufe über dem Severity-Schwellenwert liegt.

<CodeGroup>
  ```javascript Node.js theme={null}
  logger.info("Log message line");
  logger.debug("User logged in", { user_id: 123 });
  ```
</CodeGroup>

Beachten Sie, dass eine Nachricht nicht an AppSignal gesendet wird, wenn ihre Severity unter dem beim Initialisieren des Loggers festgelegten Severity-Schwellenwert liegt.

Sie können Nachrichteninhalte und Attributwerte mit unserer [Abfragesyntax](/logging/query-syntax) abfragen und filtern.

#### Mehrere Logging-Backends verwenden

Derzeit ist es nicht möglich, mit dem Standard-Logger von Node.js Logs an mehrere Backends zu senden. Für komplexere Setups empfehlen wir die Verwendung einer Logging-Bibliothek wie Winston oder Pino.

### Verwendung mit Winston

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.0.3" }]} />

Wenn Sie Winston zum Loggen von Nachrichten in Ihrer gesamten Anwendung verwenden, können Sie unseren Winston-Transport verwenden, um diese Logs an AppSignal zu senden. Nachdem Sie den Transport aus der AppSignal-Integration importiert haben, fügen Sie ihn der Transportliste Ihres Winston-Loggers hinzu:

<CodeGroup>
  ```javascript Node.js theme={null}
  const winston = require("winston");
  const { WinstonTransport } = require("@appsignal/nodejs");

  const logger = winston.createLogger({
    transports: [new WinstonTransport({ group: "app" })],
  });
  ```
</CodeGroup>

#### Child Logger

Sie können einen Child Logger verwenden, um zusätzliche Tags zu Log-Nachrichten hinzuzufügen. Sie definieren Tags beim Erstellen der Child-Logger-Konstante oder übergeben Tags als Metadaten beim Schreiben einer Log-Nachricht. Angenommen, wir möchten mehr Kontext zu den Aktionen eines bestimmten Benutzers innerhalb einer bestimmten Sitzung in unseren Logs erhalten. Im folgenden Beispiel wird ein Child Logger für die Gruppe `background` verwendet, um `sessionID` hinzuzufügen. Die zusätzlichen Tags `drinkID` und `paymentID` werden beim Erstellen einer Log-Nachricht als Metadaten bereitgestellt, und wenn dem Child eine Gruppe übergeben wird, überschreibt sie die im Transport festgelegte.

<CodeGroup>
  ```javascript Node.js theme={null}
  const logger = winston.createLogger({...});

  const sessionLogger = logger.child({
    group: "background",
    sessionID: user.id,
  });

  sessionLogger.debug("User logged in");
  sessionLogger.info("User ordered coffee", { drinkID: 30, paymentID: 20082 });
  sessionLogger.debug("User logged out");
  ```
</CodeGroup>

#### Mehrere Logging-Backends verwenden

Um Logs sowohl an den AppSignal-Logger als auch an `STDOUT` zu senden, fügen Sie einen weiteren Transport hinzu:

<CodeGroup>
  ```javascript JavaScript theme={null}
  const winston = require("winston");
  const { WinstonTransport } = require("@appsignal/nodejs");

  const logger = winston.createLogger({
    transports: [
      new WinstonTransport({ group: "app" }),
      new winston.transports.Console(),
    ],
  });
  ```
</CodeGroup>

### Verwendung mit Pino

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.5.4" }]} />

Wenn Pino Ihre bevorzugte Logging-Bibliothek ist, können Sie den AppSignal Pino-Transport verwenden, um Logs an AppSignal zu senden.

Das Argument group wird auf "app" voreingestellt, wenn es nicht angegeben wird.

<CodeGroup>
  ```javascript Node.js theme={null}
  import pino from "pino";

  const logger = pino({
    transport: {
      targets: [
        { target: "@appsignal/nodejs/pino", options: { group: "my-group" } }
      ],
    },
  });
  ```
</CodeGroup>

#### Mehrere Logging-Backends verwenden

Um Logs sowohl an den AppSignal-Logger als auch an `STDOUT` zu senden, fügen Sie ein weiteres Target hinzu:

<CodeGroup>
  ```javascript Node.js theme={null}
  import pino from "pino";

  const logger = pino({
    transport: {
      targets: [
          { target: "@appsignal/nodejs/pino", options: { group: "my-group" } },
          { target: 'pino/file', options: {destination: 1} }
      ],
    },
  });
  ```
</CodeGroup>

## Formate

### Automatisch erkanntes Format

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.7.2" }]} />

Das AppSignal for Node.js-Paket erkennt das Format der Log-Zeile standardmäßig automatisch als JSON, Logfmt oder Plaintext und parst die Attribute daraus.
Sie müssen das Log-Format nicht manuell einstellen, es sei denn, es wird nicht ordnungsgemäß erkannt.
Bitte [benachrichtigen Sie uns](mailto:support@appsignal.com?subject=Log%20format%20auto%20detection%20not%20working) auch, wenn dies nicht automatisch funktioniert.

<CodeGroup>
  ```javascript Node.js theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  // Plaintext format
  const logger = Appsignal.logger("app", "info");
  logger.info("This is about the blog");

  // Logfmt format
  const logger = Appsignal.logger("app", "info");
  logger.info("category=blog This is about the blog");

  // JSON format
  const logger = Appsignal.logger("app", "info");
  logger.info('{"category": "blog", "message": "This is about the blog"}');
  ```
</CodeGroup>

### Logfmt

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.0.11" }]} />

Der AppSignal Logger kann explizit so konfiguriert werden, dass er erwartet, dass die Zeile als Logfmt formatiert ist, und Attribute daraus parst.
Verwenden Sie diese Option, wenn Sie eine ältere Version des AppSignal for Node.js-Pakets verwenden, die keine [automatische Formaterkennung](#auto-detected-format) unterstützt.

Das Log-Format kann beim Erstellen eines Loggers angegeben werden.
Übergeben Sie beim Initialisieren des AppSignal-Loggers den Wert `"logfmt"` als drittes Argument.

<CodeGroup>
  ```javascript Node.js theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  const logger = Appsignal.logger("app", "info", "logfmt");
  logger.info("category=blog this is about the blog");
  ```
</CodeGroup>

Im obigen Beispiel wird ein filterbares category-Attribut mit dem Wert "blog" geloggt.

### JSON

<Compatibility versions={[{ name: "AppSignal for Node.js", version: "3.0.11" }]} />

Der AppSignal Logger kann explizit so konfiguriert werden, dass er erwartet, dass die Zeile als JSON formatiert ist, und Attribute daraus parst.
Verwenden Sie diese Option, wenn Sie eine ältere Version des AppSignal for Node.js-Pakets verwenden, die keine [automatische Formaterkennung](#auto-detected-format) unterstützt.

Das Log-Format kann beim Erstellen eines Loggers angegeben werden.
Übergeben Sie beim Initialisieren des AppSignal-Loggers den Wert `"json"` als drittes Argument.

<CodeGroup>
  ```javascript Node.js theme={null}
  const { Appsignal } = require("@appsignal/nodejs");

  const logger = Appsignal.logger("app", "info", "json");
  logger.info('{"category": "blog", "message": "this is about the blog"}');
  ```
</CodeGroup>

Im obigen Beispiel wird ein filterbares category-Attribut mit dem Wert "blog" geloggt.

## Logs filtern

Sie können [die Konfigurationsoption `ignoreLogs`](/nodejs/3.x/configuration/options#option-ignorelogs) verwenden, um Log-Zeilen anhand ihrer Nachricht zu ignorieren. Lesen Sie [unseren Leitfaden zum Ignorieren von Logs](/guides/filter-data/ignore-logs), um mehr zu erfahren.

## Brauchen Sie Hilfe?

Nachdem Sie Ihre Node.js-Anwendung so konfiguriert haben, dass sie Logs sendet, sollten die Logs in AppSignal erscheinen. Wenn Sie sich bei diesem Schritt unsicher sind oder AppSignal keine Logs empfängt, können Sie sich jederzeit für [Unterstützung an uns wenden](mailto:support@appsignal.com). Wir helfen Ihnen, wieder auf Kurs zu kommen!
