5 * @version $Revision: 250926 $
10 * The Log_daemon class is a concrete implementation of the Log::
11 * abstract class which sends messages to syslog daemon on UNIX-like machines.
12 * This class uses the syslog protocol: http://www.ietf.org/rfc/rfc3164.txt
14 * @author Bart van der Schans <schans@dds.nl>
15 * @version $Revision: 250926 $
18 class Log_daemon
extends Log
21 * Integer holding the log facility to use.
24 var $_name = LOG_DAEMON
;
27 * Var holding the resource pointer to the socket
33 * The ip address or servername
34 * @see http://www.php.net/manual/en/transports.php
37 var $_ip = '127.0.0.1';
40 * Protocol to use (tcp, udp, etc.)
41 * @see http://www.php.net/manual/en/transports.php
53 * Maximum message length in bytes
59 * Socket timeout in seconds
66 * Constructs a new syslog object.
68 * @param string $name The syslog facility.
69 * @param string $ident The identity string.
70 * @param array $conf The configuration array.
71 * @param int $maxLevel Maximum level at which to log.
74 function Log_daemon($name, $ident = '', $conf = array(),
75 $level = PEAR_LOG_DEBUG
)
77 /* Ensure we have a valid integer value for $name. */
78 if (empty($name) ||
!is_int($name)) {
82 $this->_id
= md5(microtime());
84 $this->_ident
= $ident;
85 $this->_mask
= Log
::UPTO($level);
87 if (isset($conf['ip'])) {
88 $this->_ip
= $conf['ip'];
90 if (isset($conf['proto'])) {
91 $this->_proto
= $conf['proto'];
93 if (isset($conf['port'])) {
94 $this->_port
= $conf['port'];
96 if (isset($conf['maxsize'])) {
97 $this->_maxsize
= $conf['maxsize'];
99 if (isset($conf['timeout'])) {
100 $this->_timeout
= $conf['timeout'];
102 $this->_proto
= $this->_proto
. '://';
104 register_shutdown_function(array(&$this, '_Log_daemon'));
112 function _Log_daemon()
118 * Opens a connection to the system logger, if it has not already
119 * been opened. This is implicitly called by log(), if necessary.
124 if (!$this->_opened
) {
125 $this->_opened
= (bool)($this->_socket
= @fsockopen
(
126 $this->_proto
. $this->_ip
,
132 return $this->_opened
;
136 * Closes the connection to the system logger, if it is open.
141 if ($this->_opened
) {
142 $this->_opened
= false;
143 return fclose($this->_socket
);
149 * Sends $message to the currently open syslog connection. Calls
150 * open() if necessary. Also passes the message along to any Log_observer
151 * instances that are observing this Log.
153 * @param string $message The textual message to be logged.
154 * @param int $priority (optional) The priority of the message. Valid
155 * values are: LOG_EMERG, LOG_ALERT, LOG_CRIT,
156 * LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO,
157 * and LOG_DEBUG. The default is LOG_INFO.
160 function log($message, $priority = null)
162 /* If a priority hasn't been specified, use the default value. */
163 if ($priority === null) {
164 $priority = $this->_priority
;
167 /* Abort early if the priority is above the maximum logging level. */
168 if (!$this->_isMasked($priority)) {
172 /* If the connection isn't open and can't be opened, return failure. */
173 if (!$this->_opened
&& !$this->open()) {
177 /* Extract the string representation of the message. */
178 $message = $this->_extractMessage($message);
180 /* Set the facility level. */
181 $facility_level = intval($this->_name
) +
182 intval($this->_toSyslog($priority));
184 /* Prepend ident info. */
185 if (!empty($this->_ident
)) {
186 $message = $this->_ident
. ' ' . $message;
189 /* Check for message length. */
190 if (strlen($message) > $this->_maxsize
) {
191 $message = substr($message, 0, ($this->_maxsize
) - 10) . ' [...]';
194 /* Write to socket. */
195 fwrite($this->_socket
, '<' . $facility_level . '>' . $message . "\n");
197 $this->_announce(array('priority' => $priority, 'message' => $message));
201 * Converts a PEAR_LOG_* constant into a syslog LOG_* constant.
203 * This function exists because, under Windows, not all of the LOG_*
204 * constants have unique values. Instead, the PEAR_LOG_* were introduced
205 * for global use, with the conversion to the LOG_* constants kept local to
206 * to the syslog driver.
208 * @param int $priority PEAR_LOG_* value to convert to LOG_* value.
210 * @return The LOG_* representation of $priority.
214 function _toSyslog($priority)
216 static $priorities = array(
217 PEAR_LOG_EMERG
=> LOG_EMERG
,
218 PEAR_LOG_ALERT
=> LOG_ALERT
,
219 PEAR_LOG_CRIT
=> LOG_CRIT
,
220 PEAR_LOG_ERR
=> LOG_ERR
,
221 PEAR_LOG_WARNING
=> LOG_WARNING
,
222 PEAR_LOG_NOTICE
=> LOG_NOTICE
,
223 PEAR_LOG_INFO
=> LOG_INFO
,
224 PEAR_LOG_DEBUG
=> LOG_DEBUG
227 /* If we're passed an unknown priority, default to LOG_INFO. */
228 if (!is_int($priority) ||
!in_array($priority, $priorities)) {
232 return $priorities[$priority];