Commit 1960cc6c authored by Sebastian Kummer's avatar Sebastian Kummer

Merge pull request #13 in ZP/z-push from feature/ZP-560-add-syslog-option-for-logging to develop

* commit '92857db9':
  ZP-560 Remove newline at end of index.php. Released under the Affero GNU General Public License (AGPL) version 3.
  ZP-560 Add URL for original source. Released under the Affero GNU General Public License (AGPL) version 3.
  ZP-560 Add license information. Released under the Affero GNU General Public License (AGPL) version 3.
  ZP-560 Move zsyslog.php to include. Released under the Affero GNU General Public License (AGPL) version 3.
  feat(ZP-560): Add syslog option for logging
parents 22dd9503 92857db9
...@@ -106,6 +106,16 @@ ...@@ -106,6 +106,16 @@
define('LOGUSERLEVEL', LOGLEVEL_DEVICEID); define('LOGUSERLEVEL', LOGLEVEL_DEVICEID);
$specialLogUsers = array(); $specialLogUsers = array();
// If you want to disable log to file, and log to syslog instead
define('LOG_SYSLOG_ENABLED', false);
// false will log to local syslog, otherwise put the remote syslog IP here
define('LOG_SYSLOG_HOST', false);
// Syslog port
define('LOG_SYSLOG_PORT', 514);
// Program showed in the syslog. Useful if you have more than one instance login to the same syslog
define('LOG_SYSLOG_PROGRAM', '[z-push]');
// Location of the trusted CA, e.g. '/etc/ssl/certs/EmailCA.pem' // Location of the trusted CA, e.g. '/etc/ssl/certs/EmailCA.pem'
// Uncomment and modify the following line if the validation of the certificates fails. // Uncomment and modify the following line if the validation of the certificates fails.
// define('CAINFO', '/etc/ssl/certs/EmailCA.pem'); // define('CAINFO', '/etc/ssl/certs/EmailCA.pem');
......
<?php
/*
* Copyright 2015 Leon van Kammen / Coder of Salvation. All rights reserved.
* Modifications 2015 - Francisco Miguel Biete
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY Leon van Kammen / Coder of Salvation AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Leon van Kammen / Coder of Salvation OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of Leon van Kammen / Coder of Salvation
*
* https://github.com/coderofsalvation/syslog-flexible
*/
class ZSyslog {
private static $hostname = false;
private static $port = 514;
private static $program = "[z-push]";
/**
* Initializes the logging
*
* @access public
* @return boolean
*/
public static function Initialize() {
if (defined('LOG_SYSLOG_HOST'))
self::$hostname = LOG_SYSLOG_HOST;
if (defined('LOG_SYSLOG_PORT'))
self::$port = LOG_SYSLOG_PORT;
if (defined('LOG_SYSLOG_PROGRAM'))
self::$program = LOG_SYSLOG_PROGRAM;
}
/**
* Send a message in the syslog facility.
*
* @params int $zlog_level Z-Push LogLevel
* @params string $message
*
* @access public
* @return boolean
*/
public static function send($zlog_level, $message) {
$level = self::zlogLevel2SyslogLevel($zlog_level);
if ($level === false) {
return false;
}
if (self::$hostname === false) {
return syslog($level, $message);
}
else {
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$facility = 1; // user level
$pri = ($facility*8) + $level; // multiplying the Facility number by 8 + adding the level
foreach (explode("\n", $message) as $line) {
if (strlen(trim($line)) > 0) {
$syslog_message = "<{$pri}>" . date('M d H:i:s ') . self::$program . ': ' . $line;
socket_sendto($sock, $syslog_message, strlen($syslog_message), 0, self::$hostname, self::$port);
}
}
socket_close($sock);
}
return true;
}
/**
* Converts the ZLog level to SYSLOG level.
*
* @params int $loglevel Z-Push LogLevel
*
* @access private
* @return SYSLOG_LEVEL or false
*/
private static function zlogLevel2SyslogLevel($loglevel) {
switch($loglevel) {
case LOGLEVEL_OFF: return false; break;
case LOGLEVEL_FATAL: return LOG_ALERT; break;
case LOGLEVEL_ERROR: return LOG_ERR; break;
case LOGLEVEL_WARN: return LOG_WARNING; break;
case LOGLEVEL_INFO: return LOG_INFO; break;
case LOGLEVEL_DEBUG: return LOG_DEBUG; break;
case LOGLEVEL_WBXML: return LOG_DEBUG; break;
case LOGLEVEL_DEVICEID: return LOG_DEBUG; break;
case LOGLEVEL_WBXMLSTACK: return LOG_DEBUG; break;
}
}
}
...@@ -69,6 +69,7 @@ include_once('lib/core/asdevice.php'); ...@@ -69,6 +69,7 @@ include_once('lib/core/asdevice.php');
include_once('lib/core/statemanager.php'); include_once('lib/core/statemanager.php');
include_once('lib/core/devicemanager.php'); include_once('lib/core/devicemanager.php');
include_once('lib/core/zpush.php'); include_once('lib/core/zpush.php');
include_once('include/z_syslog.php');
include_once('lib/core/zlog.php'); include_once('lib/core/zlog.php');
include_once('lib/core/paddingfilter.php'); include_once('lib/core/paddingfilter.php');
include_once('lib/interface/ibackend.php'); include_once('lib/interface/ibackend.php');
......
...@@ -50,6 +50,7 @@ class ZLog { ...@@ -50,6 +50,7 @@ class ZLog {
static private $lastLogs = array(); static private $lastLogs = array();
static private $userLog = false; static private $userLog = false;
static private $unAuthCache = array(); static private $unAuthCache = array();
static private $syslogEnabled = false;
/** /**
* Initializes the logging * Initializes the logging
...@@ -60,6 +61,11 @@ class ZLog { ...@@ -60,6 +61,11 @@ class ZLog {
static public function Initialize() { static public function Initialize() {
global $specialLogUsers; global $specialLogUsers;
if (defined('LOG_SYSLOG_ENABLED') && LOG_SYSLOG_ENABLED) {
self::$syslogEnabled = true;
ZSyslog::Initialize();
}
// define some constants for the logging // define some constants for the logging
if (!defined('LOGUSERLEVEL')) if (!defined('LOGUSERLEVEL'))
define('LOGUSERLEVEL', LOGLEVEL_OFF); define('LOGUSERLEVEL', LOGLEVEL_OFF);
...@@ -111,7 +117,7 @@ class ZLog { ...@@ -111,7 +117,7 @@ class ZLog {
$data = self::buildLogString($loglevel) . $message . "\n"; $data = self::buildLogString($loglevel) . $message . "\n";
if ($loglevel <= LOGLEVEL) { if ($loglevel <= LOGLEVEL) {
@file_put_contents(LOGFILE, $data, FILE_APPEND); self::writeToLog($loglevel, $data, LOGFILE);
} }
// should we write this into the user log? // should we write this into the user log?
...@@ -123,11 +129,11 @@ class ZLog { ...@@ -123,11 +129,11 @@ class ZLog {
if (self::logToUserFile()) { if (self::logToUserFile()) {
// something was logged before the user was authenticated, write this to the log // something was logged before the user was authenticated, write this to the log
if (!empty(self::$unAuthCache)) { if (!empty(self::$unAuthCache)) {
@file_put_contents(LOGFILEDIR . self::logToUserFile() . ".log", implode('', self::$unAuthCache), FILE_APPEND); self::writeToLog($loglevel, implode('', self::$unAuthCache), LOGFILEDIR . self::logToUserFile() . ".log");
self::$unAuthCache = array(); self::$unAuthCache = array();
} }
// only use plain old a-z characters for the generic log file // only use plain old a-z characters for the generic log file
@file_put_contents(LOGFILEDIR . self::logToUserFile() . ".log", $data, FILE_APPEND); self::writeToLog($loglevel, $data, LOGFILEDIR . self::logToUserFile() . ".log");
} }
// the user is not authenticated yet, we save the log into memory for now // the user is not authenticated yet, we save the log into memory for now
else { else {
...@@ -136,7 +142,7 @@ class ZLog { ...@@ -136,7 +142,7 @@ class ZLog {
} }
if (($loglevel & LOGLEVEL_FATAL) || ($loglevel & LOGLEVEL_ERROR)) { if (($loglevel & LOGLEVEL_FATAL) || ($loglevel & LOGLEVEL_ERROR)) {
@file_put_contents(LOGERRORFILE, $data, FILE_APPEND); self::writeToLog($loglevel, $data, LOGERRORFILE);
} }
if ($loglevel & LOGLEVEL_WBXMLSTACK) { if ($loglevel & LOGLEVEL_WBXMLSTACK) {
...@@ -205,7 +211,10 @@ class ZLog { ...@@ -205,7 +211,10 @@ class ZLog {
if (!isset(self::$devid)) if (!isset(self::$devid))
self::$devid = ''; self::$devid = '';
return Utils::GetFormattedTime() ." ". self::$pidstr . self::getLogLevelString($loglevel, (LOGLEVEL > LOGLEVEL_INFO)) ." ". self::$user . self::$devid; if (self::$syslogEnabled)
return self::$pidstr . self::getLogLevelString($loglevel, (LOGLEVEL > LOGLEVEL_INFO)) . " " . self::$user . self::$devid;
else
return Utils::GetFormattedTime() . " " . self::$pidstr . self::getLogLevelString($loglevel, (LOGLEVEL > LOGLEVEL_INFO)) . " " . self::$user . self::$devid;
} }
/** /**
...@@ -233,6 +242,31 @@ class ZLog { ...@@ -233,6 +242,31 @@ class ZLog {
case LOGLEVEL_WBXMLSTACK: return "[WBXMLSTACK]"; break; case LOGLEVEL_WBXMLSTACK: return "[WBXMLSTACK]"; break;
} }
} }
/**
* Write the message to the log facility.
*
* @param int $loglevel
* @param string $data
* @param string $logfile
*
* @access private
* @return void
*/
static private function writeToLog($loglevel, $data, $logfile = null) {
if (self::$syslogEnabled) {
if (ZSyslog::send($loglevel, $data) === false) {
error_log("Unable to send to syslog");
error_log($data);
}
}
else {
if (@file_put_contents($logfile, $data, FILE_APPEND) === false) {
error_log(sprintf("Unable to write in %s", $logfile));
error_log($data);
}
}
}
} }
/**---------------------------------------------------------------------------------------------------------- /**----------------------------------------------------------------------------------------------------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment