XML_SaxFilters
[ class tree: XML_SaxFilters ] [ index: XML_SaxFilters ] [ all elements ]

Source for file errorlogviewer.php

Documentation is available at errorlogviewer.php

  1. #!/usr/local/bin/php -q
  2. <?php
  3. /**
  4. * Shows simple usage of SaxFilters to parse an XML error log
  5. */
  6. # require_once 'XML/SaxFilters.php'; // This is the normal way to do it
  7.  
  8. # Done to help development
  9. if !@include_once 'XML/SaxFilters.php' {
  10.     define('XML_SAXFILTERS''../../');
  11.     include_once XML_SAXFILTERS . 'SaxFilters.php';
  12. }
  13.  
  14. if ($argc < 2 || in_array($argv[1]array('--help''-help''-h''-?'))) {
  15. ?>
  16.     Usage:      <?php echo $argv[0]?> <log_filename>
  17.                     [-l=<level>]
  18.                     [-s=<error_script>]
  19.                     [-m=<message>]
  20.     
  21.     <log_filename>: name of the log file to parse
  22.     <level>: PHP error level to filter for e.g. E_USER_WARNING
  23.     <error_script>: name of PHP script where error occurred
  24.     <message>: string to compare with error messages
  25. <?
  26.     die();
  27. }
  28.  
  29. if (version_compare(phpversion(), '4.3.0', '<') ||
  30.     php_sapi_name() == 'cgi') {
  31.     define('STDOUT', fopen('php://stdout', 'w'));
  32.     define('STDERR', fopen('php://stderr', 'w'));
  33.     register_shutdown_function(
  34.         create_function('', 'fclose(STDOUT); fclose(STDERR); return true;'));
  35. }
  36.  
  37. //---------------------------------------------------------------------
  38. // Define a customer handler class - just displays stuff
  39. class LogFilter extends XML_SaxFilters_AbstractFilter {
  40.     var $filename;   
  41.     var $inError = FALSE;
  42.     var $displayError = TRUE;
  43.     var $buffer = '';
  44.     
  45.     function LogFilter($filename,$level=NULL,$errorscript=NULL,$message=NULL) {
  46.         $this->filename = $filename;
  47.  
  48.         if ( $errorscript ) $this->errorscript = $errorscript;
  49.         if ( $message ) $this->message = $message;
  50.     }
  51.  
  52.     function startDoc() {
  53.         fwrite(STDOUT,"Parsing {$this->filename}\n\n");
  54.     }
  55.     
  56.     function open(& $tag,& $attribs) {
  57.         if ( $this->inError ) {
  58.             $this->child->open($tag,$attribs);
  59.         } else if ( strtolower($tag) == 'error' ) {
  60.             $this->inError = TRUE;
  61.             $this->displayError = TRUE;
  62.             $this->buffer = '';
  63.         }
  64.     }
  65.  
  66.     function close(& $tag) {
  67.         if ( strtolower($tag) == 'error' ) {
  68.             $this->inError = FALSE;
  69.             if ( $this->displayError ) {
  70.                 fwrite(STDOUT,$this->buffer."\n");
  71.             }
  72.         }
  73.         if ( $this->inError ) {
  74.             $this->child->close($tag);
  75.         }
  76.     }
  77.     function data(& $data) {
  78.         if ( $this->inError ) {
  79.             $this->displayError = $this->displayError & $this->child->data($data);
  80.             $data = trim($data);
  81.             if ( !empty($data) ) {
  82.                 $this->buffer.= $data . ' ';
  83.             }
  84.         }
  85.     }
  86.     function endDoc() {
  87.         fwrite(STDOUT,"\nParsing complete\n");
  88.     }
  89. }
  90. //---------------------------------------------------------------------
  91. class ErrorLevelFilter extends XML_SaxFilters_AbstractFilter {
  92.     var $level = NULL;
  93.     var $inLevel = FALSE;
  94.     function ErrorLevelFilter($level = NULL) {
  95.         $levels = array (
  96.             'E_ERROR',
  97.             'E_WARNING',
  98.             'E_NOTICE',        
  99.             'E_USER_ERROR',
  100.             'E_USER_WARNING',
  101.             'E_USER_NOTICE',
  102.         );
  103.         if ( in_array($level,$levels) ) $this->level = $level;   
  104.     }
  105.     function open(& $tag,& $attribs) {
  106.         if ( strtolower($tag) == 'level' ) {
  107.             $this->inLevel = TRUE;
  108.         } else {
  109.             $this->child->open($tag,$attribs);
  110.         }
  111.     }
  112.     function close(& $tag) {
  113.         if ( strtolower($tag) == 'level' ) {
  114.             $this->inLevel = FALSE;
  115.         } else {
  116.             $this->child->close($tag);
  117.         }
  118.     }
  119.     function data(& $data) {
  120.         if ( $this->inLevel ) {  
  121.             if ( $this->level ) {
  122.                 if ( $this->level == $data ) {
  123.                     return TRUE;
  124.                 } else {
  125.                     return FALSE;
  126.                 }
  127.             } else {
  128.                 return TRUE;
  129.             }
  130.         } else {
  131.             return $this->child->data($data);
  132.         }
  133.     }
  134. }
  135. //---------------------------------------------------------------------
  136. class ErrorScriptFilter extends XML_SaxFilters_AbstractFilter {
  137.     var $errorscript = NULL;
  138.     var $inFile = FALSE;
  139.     function ErrorScriptFilter($errorscript = NULL) {
  140.         if ( $errorscript ) $this->errorscript = $errorscript;
  141.     }
  142.     function open(& $tag,& $attribs) {
  143.         if ( strtolower($tag) == 'file' ) {
  144.             $this->inFile = TRUE;
  145.         } else {
  146.             $this->child->open($tag,$attribs);
  147.         }
  148.     }
  149.     function close(& $tag) {
  150.         if ( strtolower($tag) == 'file' ) {
  151.             $this->inFile = FALSE;
  152.         } else {
  153.             $this->child->close($tag);
  154.         }
  155.     }
  156.     function data(& $data) {
  157.         if ( $this->inFile ) {
  158.             if ( $this->errorscript ) {
  159.                 if ( !strpos ( $data, $this->errorscript ) === FALSE ) {
  160.                     return TRUE;
  161.                 } else {
  162.                     return FALSE;
  163.                 }
  164.             } else {
  165.                 return TRUE;
  166.             }
  167.         } else {                    
  168.             return $this->child->data($data);
  169.         }
  170.     }
  171. }
  172. //---------------------------------------------------------------------
  173. class MessageFilter extends XML_SaxFilters_AbstractFilter {
  174.     var $message = NULL;
  175.     var $inMessage = FALSE;
  176.     function ErrorScriptFilter($message = NULL) {
  177.         if ( $message ) $this->message = $message;
  178.     }
  179.     function open(& $tag,& $attribs) {
  180.         if ( strtolower($tag) == 'message' ) {
  181.             $this->inMessage = TRUE;
  182.         } else {
  183.             $this->child->open($tag,$attribs);
  184.         }
  185.     }
  186.     function close(& $tag) {
  187.         if ( strtolower($tag) == 'message' ) {
  188.             $this->inMessage = FALSE;
  189.         } else {
  190.             $this->child->close($tag);
  191.         }
  192.     }
  193.     function data(& $data) {
  194.         if ( $this->inMessage ) {
  195.             if ( $this->message ) {
  196.                 if ( FALSE !== strpos ( $data, $this->message ) ) {
  197.                     return TRUE;
  198.                 } else {
  199.                     return FALSE;
  200.                 }
  201.             } else {
  202.                 return TRUE;
  203.             }
  204.         } else {
  205.             return $this->child->data($data);
  206.         }
  207.     }
  208. }
  209. //---------------------------------------------------------------------
  210. //---------------------------------------------------------------------
  211. class PassThruFilter extends XML_SaxFilters_AbstractFilter {
  212.     function data(& $data) {
  213.         return TRUE;
  214.     }
  215. }
  216. //---------------------------------------------------------------------
  217. // Create the parser
  218. $logfile = $argv[1];
  219. $parser = & XML_SaxFilters_createParser('Expat','File',$logfile);
  220.  
  221. $opts = array('l'=>NULL,'s'=>NULL,'m'=>NULL);
  222. $args = array_slice($argv,2);
  223. foreach ( $args as $arg ) {
  224.     if ( strpos($arg,'-') === 0 ) {
  225.         $arg = substr($arg,1);
  226.     }
  227.     $arg = explode('=',$arg);
  228.     if ( array_key_exists($arg[0],$opts) ) {
  229.         $opts[$arg[0]] = $arg[1];
  230.     }
  231. }
  232.  
  233. $filters = array();
  234. $filters[]= & new LogFilter($logfile);
  235. if ( isset($opts['l']) ) {
  236.     $filters[]= & new ErrorLevelFilter($opts['l']);
  237. }
  238. if ( isset($opts['s']) ) {
  239.     $filters[]= & new ErrorScriptFilter($opts['s']);
  240. }
  241. if ( isset($opts['m']) ) {
  242.     $filters[]= & new MessageFilter($opts['m']);
  243. }
  244. $filters[]= & new PassThruFilter();
  245.  
  246. XML_SaxFilters_buildChain($parser,$filters);
  247.  
  248. // Parse
  249. if ( ! $parser->parse() ) {
  250.     $error = $parser->getError();
  251.     fwrite (STDERR,$error->getMessage());
  252. }
  253. ?>

Documentation generated on Mon, 11 Mar 2019 10:15:10 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.