2023-03-11 12:04:29 +03:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Zend Framework (http://framework.zend.com/)
|
|
|
|
*
|
|
|
|
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
2023-04-01 09:03:34 +03:00
|
|
|
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
2023-03-11 12:04:29 +03:00
|
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Zend\Log\Writer;
|
|
|
|
|
|
|
|
use Traversable;
|
|
|
|
use Zend\Log\Exception;
|
|
|
|
use Zend\Log\Formatter\Simple as SimpleFormatter;
|
|
|
|
use Zend\Log\Logger;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Writes log messages to syslog
|
|
|
|
*/
|
|
|
|
class Syslog extends AbstractWriter
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Maps Zend\Log priorities to PHP's syslog priorities
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $priorities = array(
|
|
|
|
Logger::EMERG => LOG_EMERG,
|
|
|
|
Logger::ALERT => LOG_ALERT,
|
|
|
|
Logger::CRIT => LOG_CRIT,
|
|
|
|
Logger::ERR => LOG_ERR,
|
|
|
|
Logger::WARN => LOG_WARNING,
|
|
|
|
Logger::NOTICE => LOG_NOTICE,
|
|
|
|
Logger::INFO => LOG_INFO,
|
|
|
|
Logger::DEBUG => LOG_DEBUG,
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The default log priority - for unmapped custom priorities
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $defaultPriority = LOG_NOTICE;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Last application name set by a syslog-writer instance
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected static $lastApplication;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Last facility name set by a syslog-writer instance
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected static $lastFacility;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Application name used by this syslog-writer instance
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $appName = 'Zend\Log';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Facility used by this syslog-writer instance
|
|
|
|
*
|
|
|
|
* @var int
|
|
|
|
*/
|
|
|
|
protected $facility = LOG_USER;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Types of program available to logging of message
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $validFacilities = array();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*
|
|
|
|
* @param array $params Array of options; may include "application" and "facility" keys
|
|
|
|
* @return Syslog
|
|
|
|
*/
|
|
|
|
public function __construct($params = null)
|
|
|
|
{
|
|
|
|
if ($params instanceof Traversable) {
|
|
|
|
$params = iterator_to_array($params);
|
|
|
|
}
|
|
|
|
|
|
|
|
$runInitializeSyslog = true;
|
|
|
|
|
|
|
|
if (is_array($params)) {
|
|
|
|
parent::__construct($params);
|
|
|
|
|
|
|
|
if (isset($params['application'])) {
|
|
|
|
$this->appName = $params['application'];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($params['facility'])) {
|
|
|
|
$this->setFacility($params['facility']);
|
|
|
|
$runInitializeSyslog = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($runInitializeSyslog) {
|
|
|
|
$this->initializeSyslog();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->formatter === null) {
|
|
|
|
$this->setFormatter(new SimpleFormatter('%message%'));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize values facilities
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
protected function initializeValidFacilities()
|
|
|
|
{
|
|
|
|
$constants = array(
|
|
|
|
'LOG_AUTH',
|
|
|
|
'LOG_AUTHPRIV',
|
|
|
|
'LOG_CRON',
|
|
|
|
'LOG_DAEMON',
|
|
|
|
'LOG_KERN',
|
|
|
|
'LOG_LOCAL0',
|
|
|
|
'LOG_LOCAL1',
|
|
|
|
'LOG_LOCAL2',
|
|
|
|
'LOG_LOCAL3',
|
|
|
|
'LOG_LOCAL4',
|
|
|
|
'LOG_LOCAL5',
|
|
|
|
'LOG_LOCAL6',
|
|
|
|
'LOG_LOCAL7',
|
|
|
|
'LOG_LPR',
|
|
|
|
'LOG_MAIL',
|
|
|
|
'LOG_NEWS',
|
|
|
|
'LOG_SYSLOG',
|
|
|
|
'LOG_USER',
|
|
|
|
'LOG_UUCP'
|
|
|
|
);
|
|
|
|
|
|
|
|
foreach ($constants as $constant) {
|
|
|
|
if (defined($constant)) {
|
|
|
|
$this->validFacilities[] = constant($constant);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize syslog / set application name and facility
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
protected function initializeSyslog()
|
|
|
|
{
|
|
|
|
static::$lastApplication = $this->appName;
|
|
|
|
static::$lastFacility = $this->facility;
|
|
|
|
openlog($this->appName, LOG_PID, $this->facility);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set syslog facility
|
|
|
|
*
|
|
|
|
* @param int $facility Syslog facility
|
|
|
|
* @return Syslog
|
|
|
|
* @throws Exception\InvalidArgumentException for invalid log facility
|
|
|
|
*/
|
|
|
|
public function setFacility($facility)
|
|
|
|
{
|
|
|
|
if ($this->facility === $facility) {
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!count($this->validFacilities)) {
|
|
|
|
$this->initializeValidFacilities();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!in_array($facility, $this->validFacilities)) {
|
|
|
|
throw new Exception\InvalidArgumentException(
|
|
|
|
'Invalid log facility provided; please see http://php.net/openlog for a list of valid facility values'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ('WIN' == strtoupper(substr(PHP_OS, 0, 3))
|
|
|
|
&& ($facility !== LOG_USER)
|
|
|
|
) {
|
|
|
|
throw new Exception\InvalidArgumentException(
|
|
|
|
'Only LOG_USER is a valid log facility on Windows'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->facility = $facility;
|
|
|
|
$this->initializeSyslog();
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set application name
|
|
|
|
*
|
|
|
|
* @param string $appName Application name
|
|
|
|
* @return Syslog
|
|
|
|
*/
|
|
|
|
public function setApplicationName($appName)
|
|
|
|
{
|
|
|
|
if ($this->appName === $appName) {
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->appName = $appName;
|
|
|
|
$this->initializeSyslog();
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Close syslog.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function shutdown()
|
|
|
|
{
|
|
|
|
closelog();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Write a message to syslog.
|
|
|
|
*
|
|
|
|
* @param array $event event data
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
protected function doWrite(array $event)
|
|
|
|
{
|
|
|
|
if (array_key_exists($event['priority'], $this->priorities)) {
|
|
|
|
$priority = $this->priorities[$event['priority']];
|
|
|
|
} else {
|
|
|
|
$priority = $this->defaultPriority;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->appName !== static::$lastApplication
|
|
|
|
|| $this->facility !== static::$lastFacility
|
|
|
|
) {
|
|
|
|
$this->initializeSyslog();
|
|
|
|
}
|
|
|
|
|
|
|
|
$message = $this->formatter->format($event);
|
|
|
|
|
|
|
|
syslog($priority, $message);
|
|
|
|
}
|
|
|
|
}
|