# Logging

Le logging s'effectue avec monolog: <https://symfony.com/doc/5.4/logging.html>

Les logs sont traités par channels (ex : security, doctrine, http...)
On peut consulter la liste des channels actifs avec la commande :

     ./bin/console debug:container monolog.log

Pour enregistrer un nouveau canal, on configure le service dans `config/services.yaml`:

    App\Service\MyService:
        tags:
            - { name: monolog.logger, channel: my_channel }


## Canaux et traitements

### Principe général

Certains handlers sont communs à différents canaux : stderr, console, critical
On se contente alors d'exclure les canaux non pertinents avec la syntaxe suivante:

    channels: ["!event", "!doctrine"]


D'autres sont plus spécifiques, comme les différents `rotating_files`. On définit un ou plusieurs canaux
concernés :

        file_main:
            type: rotating_file
            [...]
            channels: ["logger", "php", "doctrine", "http_client", "elastica"]
        file_auth:
            type: rotating_file
            [...]
            channels: security

Enfin, d'autres sont vraiment dédiés à des process particuliers, comme des opérations d'export ou de 
synchronisation.


#### stderr

Tous les loggers (exceptés `event` et `event`) transmettent les messages de niveau ERROR ou plus vers la sortie 
d'erreur stderr de php. Le stream est ensuite géré par le serveur apache, nginx ou autre.

#### console

La console associe automatiquement les niveaux de log avec la verbosité attendue :

| LoggerInterface | Verbosity | Command line |
| --- | --- | --- |
| ->error() | OutputInterface::VERBOSITY_QUIET | stderr |
| ->warning() | OutputInterface::VERBOSITY_NORMAL | stdout |
| ->notice() | OutputInterface::VERBOSITY_VERBOSE | -v |
| ->info() | OutputInterface::VERBOSITY_VERY_VERBOSE | -vv |
| ->debug()  | OutputInterface::VERBOSITY_DEBUG  | -vvv |


> Voir: https://symfony.com/doc/current/logging/monolog_console.html

#### rotating_files (main, et particuliers)

Les canaux natifs ou custom sont par défaut gérés par un handler de type rotating_file qui logue les messages 
dans `var/log/{env}.main.log`

Certains canaux sont gérés par un handler particulier et logués dans des fichiers spécifiques. Par ex, 
le canal `security` est redirigé vers `var/log/{env}.auth.log`

#### critical

En cas d'erreur de niveau critical ou supérieur, un handler de type finger_crossed passe les logs à un handler 
de type `mailer` (par l'intermédiaire d'un handler `deduplicated` qui évitera les lignes en doublon).

Le handler `mailer` envoie ensuite un mail à l'exploitation.








