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

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 Collector", version: "0.7.0" }
]}
/>

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

Die Go-Integration nutzt die Logging-Funktionen von OpenTelemetry, um Logs an AppSignal zu senden.

### Eigenständige Verwendung

Um Logging mit OpenTelemetry in Go zu verwenden, müssen Sie den Logger mithilfe des OpenTelemetry-Logger-Providers einrichten.

<CodeGroup>
  ```go Go theme={null}
  package main

  import (
  	"context"
  	"go.opentelemetry.io/otel"
  	"go.opentelemetry.io/otel/log"
  )

  func main() {
  	// Get the logger from the global logger provider
  	loggerProvider := otel.GetLoggerProvider()
  	logger := loggerProvider.Logger("my-app")

  	// Log a message
  	logger.Emit(context.Background(), log.Record{
  		Severity: log.SeverityInfo,
  		Body:     log.StringValue("Log message line"),
  	})
  }
  ```
</CodeGroup>

### Verwendung mit `slog`

<Compatibility versions={[{ name: "Go", version: "1.21" }]} />

Sie können das Standardpaket `slog` so konfigurieren, dass es strukturierte Logs über den OpenTelemetry-Handler an AppSignal sendet.

<CodeGroup>
  ```go Go theme={null}
  package main

  import (
  	"context"
  	"log/slog"
  	"go.opentelemetry.io/contrib/bridges/otelslog"
  )

  func main() {
  	// Create an OpenTelemetry `slog` handler
  	otelHandler := otelslog.NewHandler("my-app")

  	// Create a `slog` logger with the OpenTelemetry handler
  	logger := slog.New(otelHandler)

  	// Use the logger
  	logger.Info("Log message line")
  	logger.With("user_id", 123).Info("User logged in")
  	logger.Error("An error occurred", "error", "database connection failed")
  }
  ```
</CodeGroup>

## Verwendung

### Logs senden

Mit dem OpenTelemetry-Logger direkt können Sie die Severity-Stufe Ihrer Logs definieren:

<CodeGroup>
  ```go Go theme={null}
  package main

  import (
  	"context"
  	"go.opentelemetry.io/otel"
  	"go.opentelemetry.io/otel/log"
  )

  func main() {
  	loggerProvider := otel.GetLoggerProvider()
  	logger := loggerProvider.Logger("my-app")

  	// Different severity levels
  	logger.Emit(context.Background(), log.Record{
  		Severity: log.SeverityWarn,
  		Body:     log.StringValue("Something went wrong"),
  	})

  	logger.Emit(context.Background(), log.Record{
  		Severity: log.SeverityInfo,
  		Body:     log.StringValue("Action completed"),
  	})

  	logger.Emit(context.Background(), log.Record{
  		Severity: log.SeverityError,
  		Body:     log.StringValue("Database connection failed"),
  	})
  }
  ```
</CodeGroup>

Sie können benutzerdefinierte Attribute definieren, um Log-Informationen zu senden, die beim Filtern und Abfragen von Logs verwendet werden können:

<CodeGroup>
  ```go Go theme={null}
  package main

  import (
  	"context"
  	"go.opentelemetry.io/otel"
  	"go.opentelemetry.io/otel/log"
  )

  func processInvoice(customerID string) {
  	loggerProvider := otel.GetLoggerProvider()
  	logger := loggerProvider.Logger("invoice_helper")

  	logger.Emit(context.Background(), log.Record{
  		Severity: log.SeverityInfo,
  		Body:     log.StringValue("Generating invoice for customer"),
  		Attributes: []log.KeyValue{
  			log.String("customer_id", customerID),
  		},
  	})

  	invoice := generateInvoice(customerID)

  	logger.Emit(context.Background(), log.Record{
  		Severity: log.SeverityInfo,
  		Body:     log.StringValue("Generated invoice for customer"),
  		Attributes: []log.KeyValue{
  			log.String("customer_id", customerID),
  			log.String("invoice_id", invoice.ID),
  		},
  	})
  }
  ```
</CodeGroup>

Sie können Nachrichteninhalte und Attributwerte aus dem [Log-Management](/logging/log-management)-Tool heraus 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.

## Logs filtern

Sie können [die Konfigurationsoption `ignore_logs`](/go/configuration#option-ignore_logs) verwenden, um Log-Zeilen 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 Go-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!
