2009-08-11 6 views
1

J'utilise Zend_Log pour créer et consigner des messages. Cela fonctionne bien pour stocker des messages de journal dans un flux (un nouveau nom de fichier défini), bien je veux stocker ces messages dans la matrice de mémoire tampon.Comment nous pouvons transmettre le message en tant que tableau en utilisant Zend_Log

Pour cela, je visite: http://framework.zend.com/wiki/display/ZFPROP/Zend_Log+Rewrite#Zend_LogRewrite-1.Overview mais ne parviennent à obtenir leurs points .............

Merci: Rob Chevalier

Mais je veux quelque chose comme;

Si j'écris $ logger-> info ('Message d'information'); Dans toute ligne de mon fichier .php, le message qui s'affichera doit contenir le texte du message avec le numéro de ligne. Supposons que j'écris $ logger-> info ('Nom existe déjà'); au numéro de ligne 116 de mon fichier test.php. Ensuite, le résultat journal doit être comme: INFO: "nom existe déjà", Ligne: 116, Fichier: test.php

+0

J'ai mis à jour ma réponse à inclure le numéro de ligne et nom de fichier. –

Répondre

0

Utilisez Zend_Log_Writer_Mock. La page de documentation que vous avez liée à ci-dessus n'est pas la page de manuel réelle pour Zend_Log - suivez mon lien et vous obtiendrez la documentation complète.

Utilisation:

$logger = new Zend_Log(); 
$writer = new Zend_Log_Writer_Mock(); 

$logger->addWriter($writer); 

$logger->info('My message'); 
// access messages via $writer->events 

Pour inclure le nom de fichier et le numéro de ligne, procédez comme suit:

function LogMessage($logger, $message, $line, $file) { 
    $logger->write("INFO: {$message} at line {$line} of file {$file}"); 
} 

LogMessage($logger, 'Informational message', __LINE__, __FILE__); 

Il suffit d'appeler la fonction LogMessage pour la journalisation des messages, en passant dans le cas de l'enregistreur que nous avons préparé plus tôt.

0

Voilà comment je résolu le même problème, mais vous devez faire abstraction la journalisation des appels il vous évite de taper de toute façon

dans votre bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 

    protected function _initLogging() { 
     $log = new Zend_Log(); 

     $writer_log = new Zend_Log_Writer_Stream(APPLICATION_PATH.'/../logs/'.APPLICATION_ENV.'.log');    
     $formatter = new Zend_Log_Formatter_Xml(); 
     $writer_log->setFormatter($formatter); 
     $log->addWriter($writer_log); 
     Zend_Registry::set('logger', $log);    
    } 

} 

et quelque part avec portée globale

function debug($message, $level = Zend_Log::DEBUG) { 
    $backtrace = debug_backtrace(); 
    Zend_Registry::get('logger')->setEventItem('file', $backtrace[1]['file']);  
    Zend_Registry::get('logger')->setEventItem('class', $backtrace[1]['class']); 
    Zend_Registry::get('logger')->setEventItem('function', $backtrace[1]['function']); 
    Zend_Registry::get('logger')->setEventItem('line', $backtrace[1]['line']); 
    Zend_Registry::get('logger')->log($message, $level); 
} 

le décalage dans le tableau backtrace de $ est d'utiliser la fonction ci-dessus une Called, jetez un oeil à la sortie de debug_backtrace si vous avez besoin de regarder ailleurs

il est utilisé comme celui-ci

class SomeClass { 
    function func { 
     debug("Message"); 
    } 
} 

et sort comme ceci (formatage ajouté)

<logEntry> 
    <timestamp>2010-01-01T00::00+00:00</timestamp> 
    <message>Message</message> 
    <priority>7</priority> 
    <priorityName>DEBUG</priorityName> 
    <class>SomeClass</class> 
    <function>func</function> 
    <line>2</line> 
</logEntry> 
2

Voici une photo. Avec cette méthode, vous n'avez pas besoin d'écrire des fonctions d'utilitaire globales. Vous pouvez utiliser l'interface Zend_Log pour tous vos appels de méthode.

Dans votre bootstrap, initialisez votre enregistreur. Assurez-vous d'inclure les types d'événement file et line dans votre formateur. Ensuite, créez le Logger avec un writer personnalisé, qui définira les valeurs des types d'événement file et line lors de l'exécution.

$format = '%file% %line% %message%' . PHP_EOL; 
$formatter = new Zend_Log_Formatter_Simple($format); 
$writer = new My_Log_Writer_Stream('file://' . $traceLogPath); 
$writer->setFormatter($formatter); 
$log = new Zend_Log($writer); 

Dans l'écrivain personnalisé, passer par le backtrace et trouver la première classe qui ne sont pas liés à vos bibliothèques d'exploitation forestière. Il y a probablement une manière plus élégante d'écrire cette pièce, mais elle semble fonctionner dans mon environnement (je vous voterai pour de bonnes suggestions). Lorsque vous avez trouvé l'élément souhaité dans le backtrace, ajoutez-le au tableau d'événements, puis appelez la méthode d'écriture du parent. Si vous avez initialisé le formateur correctement, il écrira les valeurs d'événement dans la chaîne de journal.

class My_Log_Writer_Stream extends Zend_Log_Writer_Stream { 

    protected function _write($event) { 

     $backtrace = debug_backtrace(); 

     foreach($backtrace as $traceItem) { 
      $class = $traceItem['class']; 
      if(!is_subclass_of($class, 'Zend_Log') && 
         !is_subclass_of($class, 'Zend_Log_Writer_Abstract') && 
         $class !== 'Zend_Log' && 
         $class !== 'Zend_Log_Writer_Abstract') { 
       break; 
      } 
     } 

     $event['file'] = $traceItem['file']; 
     $event['line'] = $traceItem['line']; 

     parent::_write($event); 
    } 
0

J'ai ajouté/changé en classe My_Log_Writer_Stream les suivantes:

$event['file'] = basename($traceItem['file']); // only the filename when path is too long 
$event['pid']= getmypid(); // process ID 

Ainsi, de cette façon mon format pour Zend_Log_Formatter_Simple est

format='%timestamp% [%pid%] %priorityName% :%file%:%line%:%message%'.PHP_EOL 
Questions connexes