Navigation

Related Articles

Back to Latest Articles

Présentation du lxErrorLoggerPlugin


cedric
Présentation du lxErrorLoggerPlugin

Voici le petit dernier des plugins Symfony de chez Lexik, lxErrorLoggerPlugin, son but est simple : vous alerter en cas d’erreurs PHP ou Exceptions sur vos projets Symfony.
Le besoin est simple, être alerté et éventuellement logger chaque erreurs, qu’elles soient PHP, Exception ou erreurs remontées par Symfony. En effet le logger de base de Symfony s’arrête aux erreurs remontées par ses soins mais ne remontent pas forcément aux erreurs PHP. Le système de notification du plugin est très flexible grâce à une série de « notifier » que l’on peut activer ou non de façon indépendante les uns des autres.

Voici les différents notifiers que nous proposons :

  • stockage en base de données (celle par défaut, ou via un dsn personnalisé) ;
  • stockage en fichier XML ;
  • stockage en fichier de log classique (fichier texte) ;
  • notification via un envoi de mail ;
  • notification via Hoptoad, un webservice de log d’erreur.

Le plugin va par défaut logger toutes les exceptions levées, par contre pour les erreurs PHP il est évidement possible de configurer l’error_reporting, ce qui permet de remonter seulement les erreurs et non les notices par exemple. La configuration du plugin se fait tout simplement dans le fichier app.yml de votre application (ou du projet). Chaque « notifier » possède ses propres options, pour plus de détail je vous invite à regarder le README du plugin.

Voici par exemple une capture d’écran d’un email envoyé par lxErrorLoggerPlugin :

Comme il a été précisé en introduction, lxErrorLoggerPlugin permet de notifier les erreurs mais également de les stocker. Le stockage se fait via une base de données ou un fichier XML. Cela apporte 2 avantages indéniables :

  • la possibilité de repérer des erreurs similaires à d’autres, il est alors possible de prévenir les notifiers tels que le notifier email pour ne pas envoyer un email doublon, tout ceci est configurable ;
  • la possibilité de générer un flux RSS des erreurs, l’URL du flux sera protégé par un token paramètrable par vos soins.

Exemple d’utilisation :

Supposons que nous avons besoin de logger les erreurs qui se produisent sur notre application frontend.

1. Activer le plugin :

// config/ProjectConfiguration.class.php
  public function setup()
  {
    $this->enablePlugins(array(
      ...,
      'lxErrorLoggerPlugin',
    ));
  }

2. Configurer le plugin dans l’application souhaité, frontend dans cet exemple :
Ici nous allons utiliser la notification des erreurs en base de données et par email.

# apps/frontend/config/app.yml
all:
  lx_error_logger_plugin:
    enabled:              true # Enable error notification
    php_error_reporting:  <?php echo (E_ALL | E_STRICT)."\n" ?>
    rss:
      token:              264864156479631564841687 # token to access to the rss
      items:              10 # items in the rss
    notifier:
      db:
        enabled:          true
        options:
          similar_error:  true
      mail:
        enabled:          true
        options:
          to:             [bob@example.com, chuck@example.com]
          subject:        A new error occured on your website
          always_send:    true # always send an email even if db or xml notifiers detect the error as similar

3. Activer le flux RSS des dernières erreurs :
Dans cet exemple la notification des erreurs en base de données est activée donc le flux RSS peut récupérer des données.

# apps/frontend/config/settings.yml
all:
  .settings:
    enabled_modules: [..., lxErrorNotifierRss]

Le flux RSS est maintenant accessible avec l’url :
http://super-website.com/lx-error/rss.xml?token=264864156479631564841687

Et c’est tout 🙂

Note : le plugin ne fournit aucune interface permettant de lister les erreurs loggées, libre à chacun de créer son CRUD, module d’admin generator ou autre interface comme il le souhaite en fonction du besoin.

Dépôt du plugin sur Github : https://github.com/lexik/lxErrorLoggerPlugin.

Show Comments (11)

Comments

  • AYoub

    Bonjour,
    J\’ai installé le plugin et activé seulement la notification par email.

    j\’ai ceci : Allowed memory size of 134217728 bytes exhausted (tried to allocate 102236161 bytes)

    plugins/lxErrorLoggerPlugin/lib/logger/lxErrorLoggerService.class.php, Line: 104

    j\’ai une memory Limit de 128M

    je pense que c\’est assez suffisant pour ce que fait mon appli.

    Merci

    • Article Author
  • cedric

    @AYoub : Salut, on eu une erreur similaire il y a peu de temps. Dans notre cas il s’agissait d’un script qui provoquait une erreur de mémoire insuffisante, du coup il y a une erreur à la terminaison du script, le error logger essaye de notifier l’erreur mais étant donné qu’il n’y a plus assez de mémoire disponible on obtient une autre fatal error.
    Tu peux peut être essayer en passant l’option ‘reserve_memory’ à true.

    • Article Author
  • AYoub

    @cedric: Merci pour la réponse, ceci dit j’ai fait ce que tu m’as dis mais rien :/ le truc c’est que rien ne se passe si je passe à l’environnement dev

    • Article Author
  • Julien

    Bonjour,

    Pouvez vous mettre à jour votre module sur Git Hub ?

    Je rencontre le problème suivant : lors de l’apparition de certaines erreurs, une page blanche se charge sans aucun retour (pas de log symfony et lx)

    • Article Author
  • Samuel Breton

    On regarde dans l’aprem!

    • Article Author
  • jeremy

    Bonjour Julien,

    Il nous faudrait plus de détail pour pouvoir t’aider, tu as probablement une fatal error sur la page ce qui empêche de logger quoi que ce soit au niveau du lxErrorLogger, as tu tester de passer le paramètre « reserve_memory » à true ? (cf. doc app.yml du plugin)
    Cela permet de bloquer un peu de mémoire en cas de fatal error pour pouvoir faire un traitement.
    Quels sont les notifiers que tu as activé ?

    • Article Author
  • Julien

    Désolé pour le retard.

    Oui j’ai bien activé le reserve_memory.

    J’ai activé le log fichier et db. Le log via email étant trop gourmand pour l’instant.

    L’erreur de la page blanche s’affiche aléatoirement. Je désactive alors lx et tout fonctionne normalement.

    • Article Author
  • Thomas

    Je pense que ça vient des trace qui est très gourmand en mémoire (liste de tous les objets, et parfois avec des références circulaires ….)

    Mieux vaut faire sa trace en fonction de son besoin (genre juste un message ou le nom du fichier) plutôt que copier tout le context Php …

    • Article Author
  • Sullivan

    Je bidouille votre plugin, c’est vraiment sympa!

    Petit bemole, votre classe de notification en bdd utilise pdo et pas Doctrine, du coup on doit rentrer manuellement tout les parametres de la base, c’est pas tres grave mais c’est pas indique dans la doc (enfin je crois…).

    Par contre, vous faites directement un ‘INSERT INTO lx_error_logger’ et un ‘FROM lx_error_logger l’ sans tenir compte du possible prefixe pouvant être definie par symfony (tblname_format: im_%s // databases.yml), j’ai ajouter le mien (im_) à la main dans votre plugin, ça marche nickel, mais il serait bon de le faire automatiquement non ? 🙂

    Sinon bon boulot, ce plugin offre pas mal de possibilites interessantes ! 😉

    • Article Author
  • Sullivan

    Je bidouille votre plugin, c\’est vraiment sympa!

    Petit bemole, votre classe de notification en bdd utilise pdo et pas Doctrine, du coup on doit rentrer manuellement tout les parametres de la base, c\’est pas tres grave mais c\’est pas indique dans la doc (enfin je crois…).

    Par contre, vous faites directement un \’INSERT INTO lx_error_logger\’ et un \’FROM lx_error_logger l\’ sans tenir compte du possible prefixe pouvant être definie par symfony (tblname_format: im_%s // databases.yml), j\’ai ajouter le mien (im_) à la main dans votre plugin, ça marche nickel, mais il serait bon de le faire automatiquement non ? 🙂

    Sinon bon boulot, ce plugin offre pas mal de possibilites interessantes ! 😉

    • Article Author
  • Pascal

    Bonjour et merci pour cet excellent plugin qui a fait mon bonheur sur divers projets.

    Juste une question : avez vous prévu de le porter sur sf2?

    • Article Author

Recevez nos articles