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

# Journalisation depuis 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" }
]}
/>

Cette documentation décrit comment configurer la journalisation avec l'intégration AppSignal for Go.

## Configurer la journalisation

<Warning>
  🔐 N'envoyez pas d'<strong>informations personnelles identifiables (PII)</strong> à AppSignal. Filtrez les PII (par exemple, noms, e-mails) des journaux et utilisez un identifiant, un hash ou un identifiant pseudonymisé à la place. <br /> <br /> Pour les **entités couvertes par la HIPAA**, plus d'informations sur la signature d'un Business Associate Agreement (BAA) sont disponibles dans notre [documentation Business Add-Ons](/support/business-add-ons).
</Warning>

Vous n'avez pas besoin de créer une source de journaux pour envoyer des journaux depuis l'intégration AppSignal for Go. Une source de journaux "application" sera créée automatiquement.

L'intégration Go utilise les capacités de journalisation d'OpenTelemetry pour envoyer des journaux à AppSignal.

### Utilisation autonome

Pour utiliser la journalisation avec OpenTelemetry en Go, vous devez configurer le logger en utilisant le logger provider d'OpenTelemetry.

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

### Utilisation avec `slog`

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

Vous pouvez configurer le package standard `slog` pour envoyer des journaux structurés à AppSignal en utilisant le handler OpenTelemetry.

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

## Utilisation

### Envoi de journaux

En utilisant directement le logger OpenTelemetry, vous pouvez définir le niveau de sévérité de vos journaux :

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

Vous pouvez définir des attributs personnalisés pour envoyer des informations de journal qui peuvent être utilisées lors du filtrage et de l'interrogation des journaux :

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

Vous pouvez interroger et filtrer le contenu des messages et les valeurs d'attribut depuis l'outil [Log Management](/logging/log-management).

Une fois configurés, les attributs souhaités seront envoyés à AppSignal en tant que tags de journal, et seront interrogeables dans l'interface de journalisation d'AppSignal.

## Filtrage des journaux

Vous pouvez utiliser [l'option de configuration `ignore_logs`](/go/configuration#option-ignore_logs) pour ignorer les lignes de journal. Consultez [notre guide Ignore Logs](/guides/filter-data/ignore-logs) pour en savoir plus.

## Besoin d'aide ?

Après avoir configuré votre application Go pour envoyer des journaux, les journaux devraient apparaître dans AppSignal. Si vous avez des doutes sur cette étape ou si AppSignal ne reçoit aucun journal, vous pouvez toujours [nous contacter](mailto:support@appsignal.com) pour obtenir de l'aide. Nous vous aiderons à remettre les choses sur la bonne voie !
