IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Monolog dans un Monolog en Commande [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 47
    Points
    47
    Par défaut Monolog dans un Monolog en Commande
    Bonjour,

    Dans un script d'import (une commande héritant de ContainerAwareCommand) je cherche comment loguer les événements et les afficher dans la console.

    Mon script vas effectuer différentes tâches et un import par 'Client'
    Je voudrais que chaque client soit informé si il y a un problème dans son import avec les détails des erreurs.
    et à la fin je veux un rapport complet pour moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    class ImportCommand extends ContainerAwareCommand {
        private function __execute(InputInterface $input, OutputInterface $output) {
            $log_file_path = 'logs/global_import.log';
            $logger = new \Symfony\Bridge\Monolog\Logger('global');
            $logger->pushHandler(new StreamHandler($log_file_path, Logger::DEBUG));
            $logger->pushHandler(new ConsoleHandler($output, true, array(
                OutputInterface::VERBOSITY_NORMAL => Logger::INFO,
                OutputInterface::VERBOSITY_QUIET => Logger::CRITICAL,
            )));
     
            // do something for all client
            $logger->info('Un truc réussit');
     
            foreach ($this->em->getRepository('Lb2gSiteBundle:Client')->findAll() as $client) {
                $log_file_client_path = 'logs/import_client_'.$client->getId().'log';
                $logger_client = new \Symfony\Bridge\Monolog\Logger('client_'.$client->getId());
                $logger_client->pushHandler(new StreamHandler($log_file_client_path, Logger::DEBUG));
     
                // do something for one client
                $logger_client->info('Salut ' . $client->getNom());
                $logger->info('Salut ' . $client->getNom());
                if (rand (0,1)) {
                    $logger_client->error("Pas de bol !");
                    $logger->error("Pas de bol !");
                }
     
                // If error for the client notify him by mail
                if ($logger_client->countErrors()) {
                    mail($client->getEmail(), 'error', file_get_contents($log_file_client_path));
                }
            }
     
            // if errors
            if ($logger->countErrors()) {
                mail('moi@ici.la', 'error', file_get_contents($log_file_path));
            }
     
        }
    }
    Je me retrouve donc avec deux logger.
    $logger_client et $logger.

    Mais lors que je veux logguer un truc dans les deux je suis obliger de faire deux appels.

    Exist-il un moyen de dire au $logger_client que tout ce qui lui est dit doit être aussi transmis à $logger ?

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Tu peux n'utiliser qu'un seul logger et regarder comment créer différents channels de manière à logger chacun des messages dans le channel correspondant (ou dans les deux).

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    As tu essayé d'ajouter et d'enlever ton handler "client" sur l'objet logger de base?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    class ImportCommand extends ContainerAwareCommand {
    
        private function __execute(InputInterface $input, OutputInterface $output) {
    
            $log_file_path = 'logs/global_import.log';
            $logger = new \Symfony\Bridge\Monolog\Logger('global');
            $logger->pushHandler(new StreamHandler($log_file_path, Logger::DEBUG));
            $logger->pushHandler(new ConsoleHandler($output, true, array(
                OutputInterface::VERBOSITY_NORMAL => Logger::INFO,
                OutputInterface::VERBOSITY_QUIET => Logger::CRITICAL,
            )));
     
            // do something for all client
            $logger->info('Un truc réussit');
     
            foreach ($this->em->getRepository('Lb2gSiteBundle:Client')->findAll() as $client) {
    
                $log_file_client_path = 'logs/import_client_'.$client->getId().'log';
                //ajout du handler
                $logger->pushHandler(new StreamHandler($log_file_client_path, Logger::DEBUG));
     
                // do something for one client
                $logger->info('Salut ' . $client->getNom());
                if (rand (0,1)) {
                    $logger->error("Pas de bol !");
                }
     
                // If error for the client notify him by mail
                if ($logger_client->countErrors()) {
                    mail($client->getEmail(), 'error', file_get_contents($log_file_client_path));
                }
    
                //suppression du handler
               $logger->popHandler();
            }
     
            // if errors
            if ($logger->countErrors()) {
                mail('moi@ici.la', 'error', file_get_contents($log_file_path));
            }
     
        }
    }

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    J'ai testé l'ajout/suppression du handler.
    ça marche. ça me permet d'avoir un fichier le log global et un par client.
    Merci

    Je nais pas encore compris comment me servir des channels.
    Peut-être pour une autre fois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Saisie d'arguments dans la ligne de commande
    Par sangei dans le forum Général Java
    Réponses: 20
    Dernier message: 06/12/2009, 16h08
  2. Réponses: 5
    Dernier message: 02/03/2006, 09h38
  3. passage de paramètres dans l'invite de commande
    Par mr_neness dans le forum Langage
    Réponses: 10
    Dernier message: 18/11/2005, 15h01
  4. Smbclient mettre le mot de passe dans la ligne de commande
    Par EpOnYmE187 dans le forum Réseau
    Réponses: 2
    Dernier message: 28/07/2005, 19h39
  5. Ecrire dans l'invite de commande
    Par Joeleclems dans le forum MFC
    Réponses: 9
    Dernier message: 08/06/2005, 13h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo