> ## 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 Elixir

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 Elixir", version: "2.6.0" }
]}
/>

Diese Dokumentation beschreibt, wie Sie Logging mit der AppSignal for Elixir-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 Elixir-Integration zu senden. Eine "application"-Log-Quelle wird automatisch erstellt.

### Logger Handler

<Compatibility
  versions={[
{ name: "AppSignal for Elixir", version: "2.7.10" },
{ name: "Elixir", version: "1.15" },
]}
/>

Sie können den Erlang-`:logger` so konfigurieren, dass er das Modul `Appsignal.Logger.Handler` als Handler verwendet, indem Sie die Funktion `Appsignal.Logger.Handler.add/2` in Ihrem `Application.start/2`-Callback aufrufen:

<CodeGroup>
  ```elixir Elixir theme={null}
  @impl true
  def start(_type, _args) do
    Appsignal.Logger.Handler.add("phoenix")
  end
  ```
</CodeGroup>

Das angegebene Argument ist der Gruppenname, der beschreibt, von wo aus Sie loggen. Dieser Gruppenname kann in AppSignal verwendet werden, um Ihre Logs zu filtern.

### Logger Backend

<Tip>
  Ab Elixir-Version 1.15 werden Elixir-Logger-Backends nicht mehr empfohlen.
  Siehe den Abschnitt [Logger Handler](#logger-handler) oben für die empfohlene
  Alternative.
</Tip>

Anstatt einen Elixir-Logger-Handler zu verwenden, können Sie das Elixir-Logger-Backend so konfigurieren, dass es das Modul `Appsignal.Logger.Backend` als Backend verwendet, indem Sie den folgenden Code in die Datei `config/runtime.exs` einfügen:

<CodeGroup>
  ```elixir Elixir theme={null}
  config :logger, backends: [:console, {Appsignal.Logger.Backend, [group: "phoenix"]}]
  ```
</CodeGroup>

Die Option `group` beschreibt, von wo aus Sie loggen. Dieser Gruppenname kann in AppSignal verwendet werden, um Ihre Logs zu filtern.

Sie können das Backend auch mit der Funktion `add_backend/2` in Ihrem `Application.start/2`-Callback hinzufügen:

<CodeGroup>
  ```elixir Elixir theme={null}
  @impl true
  def start(_type, _args) do
    Logger.add_backend(Appsignal.Logger.Backend, group: "phoenix")
  end
  ```
</CodeGroup>

### Elixir Logger

Um Logs an AppSignal zu senden, ohne das Elixir-Logger-Backend zu verwenden, können Sie eine der Logging-Funktionen von `Appsignal.Logger` verwenden und ihr einen `groupname` übergeben, der definiert, von wo aus Sie loggen. Wenn wir beispielsweise aus einem Helper zum Rechnungsstellen an Kunden loggen würden:

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.info(
    "invoice_helper",
    "Generating invoice for customer 129"
  )
  ```
</CodeGroup>

## Verwendung

### Logs senden

Wie bei der Logger-Klasse von Elixir/Phoenix können Sie die Severity-Stufe Ihrer Logs mit `fatal`, `error`, `warning`, `info` und `debug` definieren:

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.warning(
    "app",
    "Something's gone terribly wrong here"
  )
  ```
</CodeGroup>

Sie können benutzerdefinierte Attribute als letztes Argument übergeben, um Log-Informationen zu senden, die beim Filtern und Abfragen von Logs verwendet werden können:

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.info(
    "invoice_helper",
    "Generated invoice for customer #{customer.id}",
    %{ customer_id: customer.id, invoice_id: invoice.id }
  )
  ```
</CodeGroup>

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

Nach der Konfiguration werden die gewünschten Attribute als Log-Tags an AppSignal gesendet und sind in der AppSignal Logging-Oberfläche abfragbar.

## Formate

### Automatisch erkanntes Format

<Compatibility versions={[{ name: "AppSignal for Elixir", version: "2.15.11" }]} />

Das AppSignal for Elixir-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>
  ```elixir Elixir theme={null}
  # Plaintext format
  Appsignal.Logger.info(
    "invoice_helper",
    "Generated invoice"
  )
  # Logfmt format
  Appsignal.Logger.info(
    "invoice_helper",
    "Generated invoice invoice_id=A145 for customer customer_id=123"
  )
  # JSON format
  Appsignal.Logger.info(
    "invoice_helper",
    ~s({"message": "Generated invoice for customer", "invoice_id": "A145", "customer_id": "123"})
  )
  ```
</CodeGroup>

### Logfmt

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 Elixir-Pakets verwenden, die keine [automatische Formaterkennung](#auto-detected-format) unterstützt.

Das Logfmt-Format kann beim Aufruf des AppSignal-Loggers angegeben werden, indem der Wert `:logfmt` als letztes Argument hinzugefügt wird.

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.info(
    "invoice_helper",
    "Generated invoice invoice_id=A145 for customer customer_id=123",
    :logfmt
  )
  ```
</CodeGroup>

### JSON

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 Elixir-Pakets verwenden, die keine [automatische Formaterkennung](#auto-detected-format) unterstützt.

Das JSON-Format kann beim Aufruf des AppSignal-Loggers angegeben werden, indem der Wert `:json` als letztes Argument hinzugefügt wird.

<CodeGroup>
  ```elixir Elixir theme={null}
  Appsignal.Logger.info(
    "invoice_helper",
    ~s({"message": "Generated invoice for customer", "invoice_id": "A145", "customer_id": "123"}),
    :json
  )
  ```
</CodeGroup>

Nur primitive, nicht verschachtelte Werte (Zahlen, Strings, Booleans und `null`) werden als Log-Attribute angezeigt. Alle anderen Attribute werden verworfen.

## Logs filtern

Sie können [die Konfigurationsoption `ignore_logs`](/elixir/configuration/options#option-ignore_logs) 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 Elixir-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!
