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

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

## 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 Elixir. Une source de journaux "application" sera créée automatiquement.

### Logger Handler

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

Vous pouvez configurer le `:logger` Erlang pour utiliser le module `Appsignal.Logger.Handler` comme handler, en appelant la fonction `Appsignal.Logger.Handler.add/2` dans votre callback `Application.start/2` :

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

L'argument fourni est le nom de groupe qui décrit d'où vous journalisez. Ce nom de groupe peut être utilisé dans AppSignal pour filtrer vos journaux.

### Logger Backend

<Tip>
  À partir de la version 1.15 d'Elixir, les backends de logger Elixir ne sont plus
  recommandés. Voir la [section Logger Handler](#logger-handler) ci-dessus pour
  l'alternative recommandée.
</Tip>

Au lieu d'utiliser un handler de logger Elixir, vous pouvez configurer le backend du logger Elixir pour utiliser le module `Appsignal.Logger.Backend` comme backend en plaçant le code ci-dessous dans le fichier `config/runtime.exs` :

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

L'option `group` décrit d'où vous journalisez. Ce nom de groupe peut être utilisé dans AppSignal pour filtrer vos journaux.

Vous pouvez également ajouter le backend en utilisant la fonction `add_backend/2` dans votre callback `Application.start/2` :

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

### Elixir Logger

Pour envoyer des journaux à AppSignal sans utiliser le backend Elixir Logger, vous pouvez utiliser l'une des fonctions de journalisation de `Appsignal.Logger` et lui fournir un `groupname` qui définit d'où vous journalisez. Par exemple, si nous journalisions depuis un helper pour facturer des clients :

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

## Utilisation

### Envoi de journaux

Comme la classe logger Elixir/Phoenix, vous pouvez définir le niveau de sévérité de vos journaux en utilisant `fatal`, `error`, `warning`, `info` et `debug` :

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

Vous pouvez passer des attributs personnalisés comme dernier argument, pour envoyer des informations de journal qui peuvent être utilisées lors du filtrage et de l'interrogation des journaux :

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

Vous pouvez interroger et filtrer le contenu des messages et les valeurs d'attribut en utilisant notre [syntaxe de requête](/logging/query-syntax).

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.

## Formats

### Format détecté automatiquement

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

Le package AppSignal for Elixir détectera automatiquement le format de la ligne de journal comme JSON, Logfmt ou plaintext par défaut, et en analysera les attributs.
Vous n'avez pas besoin de définir manuellement le format du journal, sauf s'il n'est pas correctement détecté.
Veuillez également [nous le signaler](mailto:support@appsignal.com?subject=Log%20format%20auto%20detection%20not%20working) si cela ne fonctionne pas automatiquement.

<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

Le logger AppSignal peut être configuré explicitement pour attendre que la ligne soit formatée en Logfmt et en analyser les attributs.
Utilisez cette option lorsque vous utilisez une version plus ancienne du package AppSignal for Elixir, qui ne prend pas en charge la [détection automatique du format](#auto-detected-format).

Le format Logfmt peut être spécifié lorsque le logger AppSignal est appelé en ajoutant la valeur `:logfmt` comme dernier argument.

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

### JSON

Le logger AppSignal peut être configuré explicitement pour attendre que la ligne soit formatée en JSON et en analyser les attributs.
Utilisez cette option lorsque vous utilisez une version plus ancienne du package AppSignal for Elixir, qui ne prend pas en charge la [détection automatique du format](#auto-detected-format).

Le format JSON peut être spécifié lorsque le logger AppSignal est appelé en ajoutant la valeur `:json` comme dernier argument.

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

Seules les valeurs primitives non imbriquées (nombres, chaînes, booléens et `null`) seront affichées comme attributs de journal. Tous les autres attributs seront ignorés.

## Filtrage des journaux

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

## Besoin d'aide ?

Après avoir configuré votre application Elixir 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 !
