]> source.dussan.org Git - nextcloud-server.git/commitdiff
Improvements and bug fix for log reading, fixes bug oc-982
authorMichael Gapczynski <mtgap@owncloud.com>
Fri, 6 Jul 2012 19:51:01 +0000 (15:51 -0400)
committerMichael Gapczynski <mtgap@owncloud.com>
Wed, 11 Jul 2012 23:38:56 +0000 (19:38 -0400)
lib/log/owncloud.php

index 92914af8fca167bd311f6ebe3e4de0baf71584b0..42ae7867ff01d244eb49fbc9828ed839fe814cc0 100644 (file)
@@ -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;
        }