diff options
Diffstat (limited to 'plugins/debug_logger/runlog/runlog.php')
| -rw-r--r-- | plugins/debug_logger/runlog/runlog.php | 227 | 
1 files changed, 227 insertions, 0 deletions
diff --git a/plugins/debug_logger/runlog/runlog.php b/plugins/debug_logger/runlog/runlog.php new file mode 100644 index 000000000..0c766a13c --- /dev/null +++ b/plugins/debug_logger/runlog/runlog.php @@ -0,0 +1,227 @@ +<?php + +/** + * runlog  + *  + * @author Ziba Scott <ziba@umich.edu>  + */ +class runlog { + +    private $start_time = FALSE; + +    private $parent_stack = array(); + +    public $print_to_console = FALSE; + +    private $file_handles = array(); + +    private $indent = 0; + +    public $threshold = 0; + +    public $tag_count = array(); + +    public $timestamp = "d-M-Y H:i:s O"; + +    public $max_line_size = 150; + +    private $run_log = array(); + +    function runlog() +    { +        $this->start_time = microtime( TRUE ); +    } + +    public function start( $name, $tag = FALSE  ) +    { +        $this->run_log[] = array( 'type' => 'start', +                                  'tag' => $tag, +                                  'index' => count($this->run_log), +                                  'value' => $name, +                                  'time' => microtime( TRUE ), +                                  'parents' => $this->parent_stack, +                                  'ended' => false, +                                   ); +        $this->parent_stack[] = $name; + +        $this->print_to_console("start: ".$name, $tag, 'start'); +        $this->print_to_file("start: ".$name, $tag, 'start'); +        $this->indent++; +    } + +    public function end() +    { +        $name = array_pop( $this->parent_stack ); +        foreach ( $this->run_log as $k => $entry ) { +            if ( $entry['value'] == $name && $entry['type'] == 'start'  && $entry['ended'] == false) { +                $lastk = $k; +            } +        } +        $start = $this->run_log[$lastk]['time']; +        $this->run_log[$lastk]['duration'] = microtime( TRUE ) - $start; +        $this->run_log[$lastk]['ended'] = true; + +        $this->run_log[] = array( 'type' => 'end', +                                  'tag' =>  $this->run_log[$lastk]['tag'], +                                  'index' => $lastk, +                                  'value' => $name, +                                  'time' => microtime( TRUE ), +                                  'duration' => microtime( TRUE ) - $start, +                                  'parents' => $this->parent_stack, +                                   ); +        $this->indent--; +        if($this->run_log[$lastk]['duration'] >= $this->threshold){  +            $tag_report = ""; +            foreach($this->tag_count as $tag=>$count){ +                $tag_report .= "$tag: $count, "; +            } +            if(!empty($tag_report)){ +//                $tag_report = "\n$tag_report\n"; +            } +            $end_txt = sprintf("end: $name - %0.4f seconds $tag_report", $this->run_log[$lastk]['duration'] );  +            $this->print_to_console($end_txt, $this->run_log[$lastk]['tag'] , 'end'); +            $this->print_to_file($end_txt,  $this->run_log[$lastk]['tag'], 'end'); +        } +    } + +    public function increase_tag_count($tag){ +            if(!isset($this->tag_count[$tag])){ +                $this->tag_count[$tag] = 0; +            } +            $this->tag_count[$tag]++; +    } + +    public function get_text(){ +        $text = ""; +        foreach($this->run_log as $entry){ +           $text .= str_repeat("   ",count($entry['parents'])); +           if($entry['tag'] != 'text'){ +            $text .= $entry['tag'].': '; +           } +           $text .= $entry['value']; + +           if($entry['tag'] == 'end'){ +            $text .= sprintf(" - %0.4f seconds", $entry['duration'] );  +           } + +           $text .= "\n";  +        } +        return $text; +    } + +    public function set_file($filename, $tag = 'master'){ +        if(!isset($this->file_handle[$tag])){ +            $this->file_handles[$tag] = fopen($filename, 'a'); +            if(!$this->file_handles[$tag]){ +                trigger_error('Could not open file for writing: '.$filename); +            } +        } +    } + +    public function note( $msg, $tag = FALSE ) +    { +        if($tag){ +            $this->increase_tag_count($tag); +        } +        if ( is_array( $msg )) { +            $msg = '<pre>' . print_r( $msg, TRUE ) . '</pre>'; +        } +        $this->debug_messages[] = $msg; +        $this->run_log[] = array( 'type' => 'note', +                                  'tag' => $tag ? $tag:"text", +                                  'value' => htmlentities($msg), +                                  'time' => microtime( TRUE ), +                                  'parents' => $this->parent_stack, +             ); + +       $this->print_to_file($msg, $tag); +       $this->print_to_console($msg, $tag); + +    } + +    public function print_to_file($msg, $tag = FALSE, $type = FALSE){ +       if(!$tag){ +        $file_handle_tag = 'master'; +       } +       else{ +            $file_handle_tag = $tag; +       } +       if($file_handle_tag != 'master' && isset($this->file_handles[$file_handle_tag])){ +           $buffer = $this->get_indent(); +           $buffer .= "$msg\n"; +           if(!empty($this->timestamp)){ +                $buffer = sprintf("[%s] %s",date($this->timestamp, mktime()), $buffer); +           } +           fwrite($this->file_handles[$file_handle_tag], wordwrap($buffer, $this->max_line_size, "\n     ")); +        } +       if(isset($this->file_handles['master']) && $this->file_handles['master']){ +           $buffer = $this->get_indent(); +           if($tag){ +            $buffer .= "$tag: "; +           } +           $msg = str_replace("\n","",$msg); +           $buffer .= "$msg"; +           if(!empty($this->timestamp)){ +                $buffer = sprintf("[%s] %s",date($this->timestamp, mktime()), $buffer); +           } +           if(strlen($buffer) > $this->max_line_size){ +                $buffer = substr($buffer,0,$this->max_line_size - 3)."..."; +           } +           fwrite($this->file_handles['master'], $buffer."\n"); +       } +    } + +    public function print_to_console($msg, $tag=FALSE){ +        if($this->print_to_console){ +            if(is_array($this->print_to_console)){ +                if(in_array($tag, $this->print_to_console)){ +                    echo $this->get_indent(); +                    if($tag){ +                        echo "$tag: "; +                    } +                    echo "$msg\n"; +                } +            } +            else{ +                echo $this->get_indent(); +                if($tag){ +                    echo "$tag: "; +                } +                echo "$msg\n"; +            } +        } +    } + +    public function print_totals(){ +        $totals = array(); +        foreach ($this->run_log as $entry) { +            if ( $entry['type'] == 'start'  && $entry['ended'] == true) { +                $totals[$entry['value']]['duration'] += $entry['duration']; +                $totals[$entry['value']]['count'] += 1; +            } +        } +       if($this->file_handle){ +           foreach($totals as $name=>$details){ +            fwrite($this->file_handle,$name.": ".number_format($details['duration'],4)."sec,  ".$details['count']." calls \n"); +           } +        } +    } + +    private function get_indent(){ +           $buf = ""; +           for($i = 0; $i < $this->indent; $i++){ +               $buf .= "  ";  +           } +           return $buf; +    } + + +   function  __destruct(){ +       foreach($this->file_handles as $handle){ +            fclose($handle); +        } +    } + +} + +?>  | 
