diff --git a/lib/log/owncloud.php b/lib/log/owncloud.php
index 0b7a231d3045aa76de1432c8446be0dba25d9cdb..5913d8b5b8360c1ea2491578fb5d3c1b4563d03d 100644
--- a/lib/log/owncloud.php
+++ b/lib/log/owncloud.php
@@ -62,23 +62,26 @@ class OC_Log_Owncloud {
 	public static function getEntries($limit=50, $offset=0){
 		self::init();
 		$minLevel=OC_Config::getValue( "loglevel", OC_Log::WARN );
-		$entries=array();
-		if(!file_exists(self::$logFile)) {
-			return array();
-		}
-		$contents=file(self::$logFile);
-		if(!$contents) {//error while reading log
-			return array();
-		}
-		$end=max(count($contents)-$offset-1, 0);
-		$start=max($end-$limit,0);
-		$i=$end;
-		while($i>$start){
-			$entry=json_decode($contents[$i]);
-			if($entry->level>=$minLevel){
-				$entries[]=$entry;
+		$entries = array();
+		$handle = fopen(self::$logFile, 'r');
+		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;
+					}
+				}
 			}
-			$i--;
+			fclose($handle);
+			// Extract the needed entries and reverse the order
+			$entries = array_reverse(array_slice($entries, -($limit + $offset), $limit));
 		}
 		return $entries;
 	}