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 �clair�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    432
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 432
    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.

  2. #2
    Membre �clair� 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
    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 �m�rite Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    F�vrier 2009
    Messages
    561
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37
    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
    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