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

Zend Framework PHP Discussion :

Récupération de log


Sujet :

Zend Framework PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 428
    Points : 123
    Points
    123
    Par défaut Récupération de log
    Bonjours a tous,

    Je m’excuse par avance si je n'est pas mit le post au bon endroit, je ne savais pas trop ou le mettre.
    Je suis actuellement débutant sur le framework ZF.

    Pour détailler mon environnement de dev, j'ai actuellement une API sous ZF3, d'ou ma présence ici, avec des applications en Angular, communicant via des web services.

    La difficulté que je rencontre est de pouvoir avoir des informations les plus complètes possible en cas de bug. J'ai donc pensé a des logs, en récupérant toutes les new Exception déclenché dans l'API.
    Seulement pour que cela fonctionne je me retrouve a faire un try catch dans chaque fonctions de mes contrôleurs. Ce qui est relativement lourd, j'avais espéré faire plutôt faire un Try catch générale pour les "catcher tous", mais dans le module.php de l'API, cela ne fonctionne pas.

    Avez vous des idée a me soumettre ? des recommandations, ou peut être même qu'il existe un module que je n'ai pas vu dans la doc ?

    Je vous remercie par avance.
    Je vous remercie d'avance pour vos lumières.

  2. #2
    Membre régulier Avatar de Persistant
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Septembre 2016
    Messages : 50
    Points : 73
    Points
    73
    Par défaut
    Bonsoir,

    Q: En quoi les log de php ne sont pas suffisant ? R: Ha oui les données POST ne sont pas logé... As tu regardé du coté de Zend_Log ?

    PS: Catcher des erreur que tu ne sais pas traiter est un suicide différé.

  3. #3
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Tu peux faire un catch all dans un module dédié, le mien s'appelle Error.

    module/Error/config/module.config.php :

    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
     
    <?php
     
    declare(strict_types=1);
     
    namespace Error;
     
    use ErrorException;
    use Zend\Mvc;
    use Error\EventListener;
     
    final class Module
    {
        public function onBootstrap(Mvc\MvcEvent $event)
        {
            $app = $event->getApplication();
            $eventManager = $app->getEventManager();
            $moduleRouteListener = new Mvc\ModuleRouteListener();
            $moduleRouteListener->attach($eventManager);
            $serviceManager = $app->getServiceManager();
     
            $errorEventHandler = $serviceManager->get(EventListener\ErrorHandler::class);
            $eventManager->attach(
                [
                    Mvc\MvcEvent::EVENT_DISPATCH_ERROR,
                    Mvc\MvcEvent::EVENT_RENDER_ERROR,
                ],
                $errorEventHandler
            );
            $errorHandler = function ($severity, $message, $file, $line) {
                if (!(error_reporting() & $severity)) {
                    return;
                }
                throw new ErrorException($message, 0, $severity, $file, $line);
            };
            set_error_handler($errorHandler);
            $shutdownHandler = $serviceManager->get(EventListener\ShutdownHandler::class);
            register_shutdown_function($shutdownHandler);
        }
     
        public function getConfig()
        {
            return include __DIR__.'/config/module.config.php';
        }
    }

    module/Error/config/module.config.php :

    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
     
    <?php
     
    use Error\EventListener;
     
    return [
        'service_manager' => [
            'factories' => [
                EventListener\ErrorHandler::class => EventListener\ErrorHandlerFactory::class,
                EventListener\ShutdownHandler::class => EventListener\ShutdownHandlerFactory::class,
            ],
        ],
        'view_manager' => [
            'display_not_found_reason' => false,
            'display_exceptions' => false,
            'not_found_template' => 'error/404',
            'exception_template' => 'error/index',
            'template_map' => [
                'error/403' => __DIR__.'/../view/error/403.phtml',
                'error/404' => __DIR__.'/../view/error/404.phtml',
                'error/index' => __DIR__.'/../view/error/index.phtml',
                'error/layout' => __DIR__.'/../view/error/layout.phtml',
            ],
        ],
    ];
    module/Error/src/EventListener/ErrorHandler.php :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    <?php
     
    declare(strict_types=1);
     
    namespace Error\EventListener;
     
    use Error;
    use Psr\Log\LoggerInterface as Logger;
    use Throwable;
    use Zend\Mvc\MvcEvent;
    use Zend\Http\Response as HttpResponse;
    use Zend\Stdlib\ResponseInterface as Response;
    use Zend\View\Model\ViewModel;
     
    final class ErrorHandler
    {
        /**
         * @var Logger
         */
        private $logger;
     
        private $viewModelClass = ViewModel::class;
     
        private $errorLayout = 'error/layout';
     
        /**
         * @param Logger $logger
         */
        public function __construct(Logger $logger)
        {
            $this->logger = $logger;
        }
     
        /**
         * Log Exceptions and errors that have been thrown back to the dispatch.
         *
         * @param MvcEvent $event
         * @throws \Exception
         */
        public function __invoke(MvcEvent $event)
        {
            // Do nothing if the result is a response object
            $result   = $event->getResult();
            $response = $event->getResponse();
     
            if ($result instanceof Response || ($response && ! $response instanceof HttpResponse)) {
                return;
            }
     
            $viewModel = new $this->viewModelClass();
            $viewModel->setTemplate($this->errorLayout);
            $event->setViewModel($viewModel);
     
            if ($result->exception instanceof Throwable) {
                $this->logger->critical($result->exception->getMessage(), [
                    'exception' => $result->exception,
                    'file' => $result->exception->getFile(),
                    'line' => $result->exception->getLine(),
                ]);
            }
            if ($result->exception instanceof Error) {
                throw new \Exception('Error raised.', 500, $result->exception);
            }
        }
    }
    module/Error/src/EventListener/ShutdownHandler.php :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    <?php
     
    declare(strict_types=1);
     
    namespace Error\EventListener;
     
    use Psr\Log\LoggerInterface;
    use Psr\Log\LogLevel;
     
    final class ShutdownHandler
    {
        /**
         * @var LoggerInterface
         */
        private $logger;
     
        /**
         * @var array
         */
        private $errorPriorityMap = [
            E_NOTICE => LogLevel::NOTICE,
            E_USER_NOTICE => LogLevel::NOTICE,
            E_WARNING => LogLevel::WARNING,
            E_CORE_WARNING => LogLevel::WARNING,
            E_USER_WARNING => LogLevel::WARNING,
            E_ERROR => LogLevel::ERROR,
            E_USER_ERROR => LogLevel::ERROR,
            E_CORE_ERROR => LogLevel::ERROR,
            E_RECOVERABLE_ERROR => LogLevel::ERROR,
            E_PARSE => LogLevel::ERROR,
            E_COMPILE_ERROR => LogLevel::ERROR,
            E_COMPILE_WARNING => LogLevel::ERROR,
            E_STRICT => LogLevel::DEBUG,
            E_DEPRECATED => LogLevel::DEBUG,
            E_USER_DEPRECATED => LogLevel::DEBUG,
        ];
     
        /**
         * ShutdownHandler constructor.
         *
         * @param LoggerInterface $logger
         */
        public function __construct(LoggerInterface $logger)
        {
            $this->logger = $logger;
        }
     
        public function __invoke()
        {
            $error = error_get_last();
            if (null === $error || $error['type'] !== E_ERROR) {
                return;
            }
            while (ob_get_level() > 0) {
                ob_end_clean();
            }
            $chars = md5(uniqid('', true));
            $errorReference = substr($chars, 2, 2).substr($chars, 12, 2).substr($chars, 26, 2);
     
            $extras = [
                'reference' => $errorReference,
                'file' => $error['file'],
                'line' => $error['line'],
            ];
            $priority = $this->errorPriorityMap[$error['type']];
            $this->logger->log($priority, $error['message'], $extras);
     
            // set absolute path of the template to render (the shutdown method sometimes changes relative path).
            $fatalTemplatePath = __DIR__.'/../../view/error/fatal.html';
     
            // read content of file
            $body = file_get_contents($fatalTemplatePath);
            // inject error reference
            $body = str_replace('%__ERROR_REFERENCE__%', 'Error Reference: '.$errorReference, $body);
            echo $body;
            exit(1);
        }
    }
    Je ne t'ai pas mis les factories (simples) et les vues (personnalisées pour ce projet client), mais niveau vue du coup tu es sur du worst case scenario ("Une erreur est survenue et nous en sommes désolé. Si cela se reproduit, vous pouvez nous contacter avec la référence XXXXXXXX", la ref étant un code unique généré dans le shutdown handler et loggué, qui t'aidera à trouver le bon log).

    Là c'est du ZF2, mais à part changer l'emplacement de Module.php ça devrait pas changer grand chose.

Discussions similaires

  1. Parallélisation de traitements et récupération des logs
    Par Wise_Sherkaan dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 07/01/2011, 15h23
  2. Réponses: 4
    Dernier message: 14/12/2010, 20h21
  3. Récupération de log sur machine distante
    Par mamax29 dans le forum Linux
    Réponses: 1
    Dernier message: 09/09/2010, 13h45
  4. [Administration] Récupération de log distant
    Par darkrio dans le forum CVS
    Réponses: 0
    Dernier message: 12/11/2007, 16h06
  5. Récupération de log switch cisco
    Par fara morgana dans le forum Développement
    Réponses: 6
    Dernier message: 07/06/2006, 15h07

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