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

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

<VersionRequirements
  versions={[
{ name: "AppSignal for Python", version: "1.6.0" }
]}
/>

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

<Warning>
  La journalisation n'est disponible qu'en utilisant le [mode
  collector](/python/configuration/collector), qui est une **fonctionnalité
  expérimentale**.
</Warning>

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

Lors de l'utilisation du [mode collector](/python/configuration/collector), AppSignal instrumente automatiquement le module `logging` intégré de Python via OpenTelemetry, en attachant un handler au logger racine.

### Désactivation de l'instrumentation de journalisation

L'instrumentation du module `logging` de Python peut être désactivée à l'aide de [l'option de configuration `disable_default_instrumentations`](/python/configuration/options#option-disable_default_instrumentations) :

<CodeGroup>
  ```python Python theme={null}
  # __appsignal__.py
  appsignal = Appsignal(
      # ...
      disable_default_instrumentations=["logging"],
  )
  ```
</CodeGroup>

Cela désactive l'instrumentation automatique du module `logging` en attachant un handler au logger racine, ce qui signifie que les journaux envoyés au module `logging` de Python ne seront plus capturés par AppSignal.

Vous pouvez toujours envoyer des journaux directement en utilisant l'API logs d'OpenTelemetry, comme décrit dans la section [Envoi de journaux avec OpenTelemetry](#sending-logs-with-opentelemetry) ci-dessous.

#### Attacher des handlers manuellement

Lorsque l'instrumentation automatique est désactivée, vous pouvez attacher le `LoggingHandler` d'OpenTelemetry à des loggers spécifiques vous-même, plutôt que de compter sur AppSignal pour l'ajouter au logger racine :

<CodeGroup>
  ```python Python theme={null}
  import logging
  from opentelemetry.sdk._logs import LoggingHandler

  handler = LoggingHandler(level=logging.NOTSET)
  logging.getLogger("myapp").addHandler(handler)
  ```
</CodeGroup>

Cela vous donne le contrôle sur les loggers qui envoient leur sortie à AppSignal.

### Niveau de journal

Le module `logging` de Python est par défaut à `WARNING`, ce qui signifie que les messages `INFO` et `DEBUG` ne sont pas capturés par défaut. Pour capturer les messages de sévérité inférieure, définissez explicitement le niveau du logger racine :

<CodeGroup>
  ```python Python theme={null}
  import logging
  logging.root.setLevel(logging.INFO)
  ```
</CodeGroup>

### Quels journaux sont capturés

AppSignal capture les journaux envoyés au logger racine et à tout logger qui s'y propage. La propagation est contrôlée par l'attribut `propagate` sur chaque logger, qui est par défaut à `True` en Python.

Les loggers avec `propagate=False` n'auront **pas** leurs messages capturés par AppSignal.

## Configuration du framework

### Django

Django configure certains loggers avec `propagate=False` par défaut, ce qui les empêche d'atteindre AppSignal. Remplacez-les dans `settings.py` pour réactiver la propagation :

<CodeGroup>
  ```python Python theme={null}
  # settings.py
  LOGGING = {
      "version": 1,
      "disable_existing_loggers": False,
      "handlers": {
          "console": {"class": "logging.StreamHandler"},
      },
      "loggers": {
          "django.server": {
              "handlers": ["console"],
              "level": "INFO",
              "propagate": True,
          },
          "myapp": {
              "handlers": ["console"],
              "level": "INFO",
              "propagate": True,
          },
      },
  }
  ```
</CodeGroup>

Définir `"propagate": True` garantit que les messages du logger atteignent le logger racine, où le handler d'AppSignal est attaché.

#### Attacher des handlers manuellement

Vous pouvez également attacher le `LoggingHandler` directement aux loggers de Django au lieu de compter sur la propagation vers le logger racine :

<CodeGroup>
  ```python Python theme={null}
  # settings.py
  import logging
  from opentelemetry.sdk._logs import LoggingHandler

  LOGGING = {
      "version": 1,
      "handlers": {
          "console": {"class": "logging.StreamHandler"},
          "appsignal": {"()": LoggingHandler, "level": logging.NOTSET},
      },
      "loggers": {
          "django.server": {
              "handlers": ["console", "appsignal"],
              "level": "INFO",
          },
          "myapp": {
              "handlers": ["console", "appsignal"],
              "level": "INFO",
          },
      },
  }
  ```
</CodeGroup>

### Celery

Celery fork des processus worker, donc AppSignal doit être démarré pour chaque fork. Utilisez le signal `worker_process_init` pour réinitialiser AppSignal et configurer la journalisation dans chaque processus worker. Consultez la [page d'instrumentation Celery](/python/instrumentations/celery) pour plus de détails sur l'instrumentation des tâches Celery.

<CodeGroup>
  ```python Python theme={null}
  # tasks.py
  import logging
  import appsignal
  from celery.signals import worker_process_init

  @worker_process_init.connect(weak=False)
  def init_worker_logging(*args, **kwargs):
      appsignal.start()
      logging.root.setLevel(logging.INFO)
      logging.getLogger("celery").propagate = True
  ```
</CodeGroup>

## Envoi de journaux avec OpenTelemetry

Vous pouvez également envoyer des journaux directement en utilisant l'API logs d'OpenTelemetry, sans passer par le module `logging` de Python :

<CodeGroup>
  ```python Python theme={null}
  from opentelemetry._logs import get_logger_provider
  from opentelemetry.sdk._logs import SeverityNumber

  logger_provider = get_logger_provider()
  logger = logger_provider.get_logger("my-app")

  logger.emit(
      logger_provider.get_logger("my-app").create_log_record(
          body="Log message line",
          severity_number=SeverityNumber.INFO,
      )
  )
  ```
</CodeGroup>

## Besoin d'aide ?

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