From 466d7c0d99eab914960295f27496a9380cd8d125 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Fri, 6 Jul 2012 15:51:01 -0400 Subject: [PATCH] Improvements and bug fix for log reading, fixes bug oc-982 --- lib/log/owncloud.php | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/lib/log/owncloud.php b/lib/log/owncloud.php index 92914af8fc..42ae7867ff 100644 --- a/lib/log/owncloud.php +++ b/lib/log/owncloud.php @@ -63,25 +63,38 @@ class OC_Log_Owncloud { self::init(); $minLevel=OC_Config::getValue( "loglevel", OC_Log::WARN ); $entries = array(); - $handle = @fopen(self::$logFile, 'r'); + $handle = @fopen(self::$logFile, 'rb'); if ($handle) { - // Just a guess to set the file pointer to the right spot - $maxLineLength = 150; - fseek($handle, -($limit * $maxLineLength + $offset * $maxLineLength), SEEK_END); - // Skip first line, because it is most likely a partial line - fgets($handle); - while (!feof($handle)) { - $line = fgets($handle); - if (!empty($line)) { - $entry = json_decode($line); - if ($entry->level >= $minLevel) { - $entries[] = $entry; + fseek($handle, 0, SEEK_END); + $pos = ftell($handle); + $line = ''; + $entriesCount = 0; + $lines = 0; + // Loop through each character of the file looking for new lines + while ($pos >= 0 && $entriesCount < $limit) { + fseek($handle, $pos); + $ch = fgetc($handle); + if ($ch == "\n" || $pos == 0) { + if ($line != '') { + // Add the first character if at the start of the file, because it doesn't hit the else in the loop + if ($pos == 0) { + $line = $ch.$line; + } + $lines++; + $entry = json_decode($line); + // Add the line as an entry if it is passed the offset and is equal or above the log level + if ($lines > $offset && $entry->level >= $minLevel) { + $entries[] = $entry; + $entriesCount++; + } + $line = ''; } + } else { + $line = $ch.$line; } + $pos--; } fclose($handle); - // Extract the needed entries and reverse the order - $entries = array_reverse(array_slice($entries, -($limit + $offset), $limit)); } return $entries; }