Browse Source

make logging configurable; add logging to syslog

Andrew Dolgov 7 years ago
parent
commit
b367c951b9

+ 37 - 2
classes/logger.php

@@ -1,5 +1,7 @@
 <?php
 class Logger {
+	private static $instance;
+	private $adapter;
 
 	public static $errornames = array(
 		1			=> 'E_ERROR',
@@ -20,11 +22,44 @@ class Logger {
 		32767		=> 'E_ALL');
 
 	function log_error($errno, $errstr, $file, $line, $context) {
-		return false;
+		if ($errno == E_NOTICE) return false;
+
+		if ($this->adapter)
+			return $this->adapter->log_error($errno, $errstr, $file, $line, $context);
+		else
+			return false;
 	}
 
 	function log($string) {
-		return false;
+		if ($this->adapter)
+			return $this->adapter->log($string);
+		else
+			return false;
+	}
+
+	private function __clone() {
+		//
+	}
+
+	function __construct() {
+		switch (LOG_DESTINATION) {
+		case "sql":
+			$this->adapter = new Logger_SQL();
+			break;
+		case "syslog":
+			$this->adapter = new Logger_Syslog();
+			break;
+		default:
+			$this->adapter = false;
+		}
 	}
+
+	public static function get() {
+		if (self::$instance == null)
+			self::$instance = new self();
+
+		return self::$instance;
+	}
+
 }
 ?>

+ 0 - 3
classes/logger/sql.php

@@ -2,9 +2,6 @@
 class Logger_SQL {
 
 	function log_error($errno, $errstr, $file, $line, $context) {
-
-		if ($errno == E_NOTICE) return false;
-
 		if (Db::get() && get_schema_version() > 117) {
 
 			$errno = Db::get()->escape_string($errno);

+ 31 - 0
classes/logger/syslog.php

@@ -0,0 +1,31 @@
+<?php
+class Logger_Syslog {
+
+	function log_error($errno, $errstr, $file, $line, $context) {
+
+		switch ($errno) {
+		case E_ERROR:
+		case E_PARSE:
+		case E_CORE_ERROR:
+		case E_COMPILE_ERROR:
+		case E_USER_ERROR:
+			$priority = LOG_ERR;
+			break;
+		case E_WARNING:
+		case E_CORE_WARNING:
+		case E_COMPILE_WARNING:
+		case E_USER_WARNING:
+			$priority = LOG_WARNING;
+			break;
+		default:
+			$priority = LOG_INFO;
+		}
+
+		$errname = Logger::$errornames[$errno] . " ($errno)";
+
+		syslog($priority, "[tt-rss] $errname ($file:$line) $errstr");
+
+	}
+
+}
+?>

+ 41 - 34
classes/pref/system.php

@@ -24,46 +24,53 @@ class Pref_System extends Handler_Protected {
 		print "<div dojoType=\"dijit.layout.AccordionContainer\" region=\"center\">";
 		print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Error Log')."\">";
 
-		$result = $this->dbh->query("SELECT errno, errstr, filename, lineno,
-			created_at, login FROM ttrss_error_log
-			LEFT JOIN ttrss_users ON (owner_uid = ttrss_users.id)
-			ORDER BY ttrss_error_log.id DESC
-			LIMIT 100");
-
-		print "<button dojoType=\"dijit.form.Button\"
-			onclick=\"updateSystemList()\">".__('Refresh')."</button> ";
-
-		print "<p><table width=\"100%\" cellspacing=\"10\" class=\"prefErrorLog\">";
-
-		print "<tr class=\"title\">
-			<td width='5%'>".__("Error")."</td>
-			<td>".__("Filename")."</td>
-			<td>".__("Message")."</td>
-			<td width='5%'>".__("User")."</td>
-			<td width='5%'>".__("Date")."</td>
-			</tr>";
-
-		while ($line = $this->dbh->fetch_assoc($result)) {
-			print "<tr class=\"errrow\">";
-
-			foreach ($line as $k => $v) {
-				$line[$k] = htmlspecialchars($v);
+		if (LOG_DESTINATION == "sql") {
+
+			$result = $this->dbh->query("SELECT errno, errstr, filename, lineno,
+				created_at, login FROM ttrss_error_log
+				LEFT JOIN ttrss_users ON (owner_uid = ttrss_users.id)
+				ORDER BY ttrss_error_log.id DESC
+				LIMIT 100");
+
+			print "<button dojoType=\"dijit.form.Button\"
+				onclick=\"updateSystemList()\">".__('Refresh')."</button> ";
+
+			print "<p><table width=\"100%\" cellspacing=\"10\" class=\"prefErrorLog\">";
+
+			print "<tr class=\"title\">
+				<td width='5%'>".__("Error")."</td>
+				<td>".__("Filename")."</td>
+				<td>".__("Message")."</td>
+				<td width='5%'>".__("User")."</td>
+				<td width='5%'>".__("Date")."</td>
+				</tr>";
+
+			while ($line = $this->dbh->fetch_assoc($result)) {
+				print "<tr class=\"errrow\">";
+
+				foreach ($line as $k => $v) {
+					$line[$k] = htmlspecialchars($v);
+				}
+
+				print "<td class='errno'>" . Logger::$errornames[$line["errno"]] . " (" . $line["errno"] . ")</td>";
+				print "<td class='filename'>" . $line["filename"] . ":" . $line["lineno"] . "</td>";
+				print "<td class='errstr'>" . $line["errstr"] . "</td>";
+				print "<td class='login'>" . $line["login"] . "</td>";
+
+				print "<td class='timestamp'>" .
+					make_local_datetime(
+					$line["created_at"], false) . "</td>";
+
+				print "</tr>";
 			}
 
-			print "<td class='errno'>" . Logger::$errornames[$line["errno"]] . " (" . $line["errno"] . ")</td>";
-			print "<td class='filename'>" . $line["filename"] . ":" . $line["lineno"] . "</td>";
-			print "<td class='errstr'>" . $line["errstr"] . "</td>";
-			print "<td class='login'>" . $line["login"] . "</td>";
+			print "</table>";
+		} else {
 
-			print "<td class='timestamp'>" .
-				make_local_datetime(
-				$line["created_at"], false) . "</td>";
+			print_notice("Please set LOG_DESTINATION to 'sql' in config.php to enable database logging.");
 
-			print "</tr>";
 		}
 
-		print "</table>";
-
 		print "</div>";
 
 		PluginHost::getInstance()->run_hooks(PluginHost::HOOK_PREFS_TAB,

+ 6 - 0
config.php-dist

@@ -192,6 +192,12 @@
 	// authentication plugin here (auth_*).
 	// Users may enable other user plugins from Preferences/Plugins but may not
 	// disable plugins specified in this list.
+	
+	define('LOG_DESTINATION', 'sql');
+	// Log destination to use. Possible values: sql (uses internal logging
+	// you can read in Preferences -> System), syslog - logs to system log.
+	// Setting this to blank uses PHP logging (usually to http server 
+	// error.log).
 
 	define('CONFIG_VERSION', 26);
 	// Expected config version. Please update this option in config.php

+ 2 - 19
include/errorhandler.php

@@ -1,22 +1,12 @@
 <?php
-// TODO: make configurable
-require_once "classes/logger.php";
-require_once "classes/logger/sql.php";
-
 function ttrss_error_handler($errno, $errstr, $file, $line, $context) {
 	global $logger;
 
 	if (error_reporting() == 0 || !$errno) return false;
 
-	if (!$logger) $logger = new Logger_SQL();
-
 	$file = substr(str_replace(dirname(dirname(__FILE__)), "", $file), 1);
 
-	if ($logger) {
-		return $logger->log_error($errno, $errstr, $file, $line, $context);
-	}
-
-	return false;
+	return Logger::get()->log_error($errno, $errstr, $file, $line, $context);
 }
 
 function ttrss_fatal_handler() {
@@ -36,14 +26,7 @@ function ttrss_fatal_handler() {
 
 		$file = substr(str_replace(dirname(dirname(__FILE__)), "", $file), 1);
 
-		if (!$logger) $logger = new Logger_SQL();
-
-		if ($logger) {
-			if ($logger->log_error($errno, $errstr, $file, $line, $context)) {
-				return true;
-			}
-		}
-		return false;
+		return Logger::get()->log_error($errno, $errstr, $file, $line, $context);
 	}
 
 	return false;

+ 2 - 2
include/sanity_config.php

@@ -1,3 +1,3 @@
-<?php # This file has been generated at:  Tue Apr 16 16:41:13 MSK 2013
+<?php # This file has been generated at:  Fri Apr 19 09:22:33 MSK 2013
 define('GENERATED_CONFIG_CHECK', 26);
-$requred_defines = array('DB_TYPE', 'DB_HOST', 'DB_USER', 'DB_NAME', 'DB_PASS', 'MYSQL_CHARSET', 'SELF_URL_PATH', 'FEED_CRYPT_KEY', 'SINGLE_USER_MODE', 'SIMPLE_UPDATE_MODE', 'PHP_EXECUTABLE', 'LOCK_DIRECTORY', 'CACHE_DIR', 'ICONS_DIR', 'ICONS_URL', 'AUTH_AUTO_CREATE', 'AUTH_AUTO_LOGIN', 'FORCE_ARTICLE_PURGE', 'PUBSUBHUBBUB_HUB', 'PUBSUBHUBBUB_ENABLED', 'SPHINX_ENABLED', 'SPHINX_SERVER', 'SPHINX_INDEX', 'ENABLE_REGISTRATION', 'REG_NOTIFY_ADDRESS', 'REG_MAX_USERS', 'SESSION_COOKIE_LIFETIME', 'SESSION_CHECK_ADDRESS', 'SMTP_FROM_NAME', 'SMTP_FROM_ADDRESS', 'DIGEST_SUBJECT', 'SMTP_SERVER', 'SMTP_LOGIN', 'SMTP_PASSWORD', 'CHECK_FOR_NEW_VERSION', 'ENABLE_GZIP_OUTPUT', 'PLUGINS', 'CONFIG_VERSION'); ?>
+$requred_defines = array( 'DB_TYPE', 'DB_HOST', 'DB_USER', 'DB_NAME', 'DB_PASS', 'MYSQL_CHARSET', 'SELF_URL_PATH', 'FEED_CRYPT_KEY', 'SINGLE_USER_MODE', 'SIMPLE_UPDATE_MODE', 'PHP_EXECUTABLE', 'LOCK_DIRECTORY', 'CACHE_DIR', 'ICONS_DIR', 'ICONS_URL', 'AUTH_AUTO_CREATE', 'AUTH_AUTO_LOGIN', 'FORCE_ARTICLE_PURGE', 'PUBSUBHUBBUB_HUB', 'PUBSUBHUBBUB_ENABLED', 'SPHINX_ENABLED', 'SPHINX_SERVER', 'SPHINX_INDEX', 'ENABLE_REGISTRATION', 'REG_NOTIFY_ADDRESS', 'REG_MAX_USERS', 'SESSION_COOKIE_LIFETIME', 'SESSION_CHECK_ADDRESS', 'SMTP_FROM_NAME', 'SMTP_FROM_ADDRESS', 'DIGEST_SUBJECT', 'SMTP_SERVER', 'SMTP_LOGIN', 'SMTP_PASSWORD', 'CHECK_FOR_NEW_VERSION', 'ENABLE_GZIP_OUTPUT', 'PLUGINS', 'LOG_DESTINATION', 'CONFIG_VERSION'); ?>