157 lines
2.7 KiB
PHP
157 lines
2.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Class MC4WP_Debug_Log_Reader
|
|
*/
|
|
class MC4WP_Debug_Log_Reader {
|
|
|
|
|
|
/**
|
|
* @var resource|null
|
|
*/
|
|
private $handle;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private static $regex = '/^(\[[\d \-\:]+\]) (\w+\:) (.*)$/S';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private static $html_template = '<span class="time">$1</span> <span class="level">$2</span> <span class="message">$3</span>';
|
|
|
|
/**
|
|
* @var string The log file location.
|
|
*/
|
|
private $file;
|
|
|
|
/**
|
|
* MC4WP_Debug_Log_Reader constructor.
|
|
*
|
|
* @param $file
|
|
*/
|
|
public function __construct( $file ) {
|
|
$this->file = $file;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function all() {
|
|
return file_get_contents( $this->file );
|
|
}
|
|
|
|
/**
|
|
* Sets file pointer to $n of lines from the end of file.
|
|
*
|
|
* @param int $n
|
|
*/
|
|
private function seek_line_from_end( $n ) {
|
|
$line_count = 0;
|
|
|
|
// get line count
|
|
while ( ! feof( $this->handle ) ) {
|
|
fgets( $this->handle );
|
|
++$line_count;
|
|
}
|
|
|
|
// rewind to beginning
|
|
rewind( $this->handle );
|
|
|
|
// calculate target
|
|
$target = $line_count - $n;
|
|
$target = $target > 1 ? $target : 1; // always skip first line because oh PHP header
|
|
$current = 0;
|
|
|
|
// keep reading until we're at target
|
|
while ( $current < $target ) {
|
|
fgets( $this->handle );
|
|
++$current;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return string|null
|
|
*/
|
|
public function read() {
|
|
|
|
// open file if not yet opened
|
|
if ( ! is_resource( $this->handle ) ) {
|
|
|
|
// doesn't exist?
|
|
if ( ! file_exists( $this->file ) ) {
|
|
return null;
|
|
}
|
|
|
|
$this->handle = @fopen( $this->file, 'r' );
|
|
|
|
// unable to read?
|
|
if ( ! is_resource( $this->handle ) ) {
|
|
return null;
|
|
}
|
|
|
|
// set pointer to 1000 files from EOF
|
|
$this->seek_line_from_end( 1000 );
|
|
}
|
|
|
|
// stop reading once we're at the end
|
|
if ( feof( $this->handle ) ) {
|
|
fclose( $this->handle );
|
|
$this->handle = null;
|
|
return null;
|
|
}
|
|
|
|
// read line, up to 8kb
|
|
$text = fgets( $this->handle );
|
|
|
|
// strip tags & trim
|
|
$text = strip_tags( $text );
|
|
$text = trim( $text );
|
|
|
|
return $text;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function read_as_html() {
|
|
$line = $this->read();
|
|
|
|
// null means end of file
|
|
if ( is_null( $line ) ) {
|
|
return null;
|
|
}
|
|
|
|
// empty string means empty line, but not yet eof
|
|
if ( empty( $line ) ) {
|
|
return '';
|
|
}
|
|
|
|
$line = preg_replace( self::$regex, self::$html_template, $line );
|
|
return $line;
|
|
}
|
|
|
|
/**
|
|
* Reads X number of lines.
|
|
*
|
|
* If $start is negative, reads from end of log file.
|
|
*
|
|
* @param int $start
|
|
* @param int $number
|
|
* @return string
|
|
*/
|
|
public function lines( $start, $number ) {
|
|
$handle = fopen( $start, 'r' );
|
|
$lines = '';
|
|
|
|
$current_line = 0;
|
|
while ( $current_line < $number ) {
|
|
$lines .= fgets( $handle );
|
|
}
|
|
|
|
fclose( $handle );
|
|
return $lines;
|
|
}
|
|
}
|