ILIAS  release_4-3 Revision
 All Data Structures Namespaces Files Functions Variables Groups Pages
daemon.php
Go to the documentation of this file.
1 <?php
18 class Log_daemon extends Log
19 {
24  var $_name = LOG_DAEMON;
25 
30  var $_socket;
31 
37  var $_ip = '127.0.0.1';
38 
44  var $_proto = 'udp';
45 
50  var $_port = 514;
51 
56  var $_maxsize = 4096;
57 
62  var $_timeout = 1;
63 
64 
74  function Log_daemon($name, $ident = '', $conf = array(),
75  $level = PEAR_LOG_DEBUG)
76  {
77  /* Ensure we have a valid integer value for $name. */
78  if (empty($name) || !is_int($name)) {
79  $name = LOG_SYSLOG;
80  }
81 
82  $this->_id = md5(microtime());
83  $this->_name = $name;
84  $this->_ident = $ident;
85  $this->_mask = Log::UPTO($level);
86 
87  if (isset($conf['ip'])) {
88  $this->_ip = $conf['ip'];
89  }
90  if (isset($conf['proto'])) {
91  $this->_proto = $conf['proto'];
92  }
93  if (isset($conf['port'])) {
94  $this->_port = $conf['port'];
95  }
96  if (isset($conf['maxsize'])) {
97  $this->_maxsize = $conf['maxsize'];
98  }
99  if (isset($conf['timeout'])) {
100  $this->_timeout = $conf['timeout'];
101  }
102  $this->_proto = $this->_proto . '://';
103 
104  register_shutdown_function(array(&$this, '_Log_daemon'));
105  }
106 
112  function _Log_daemon()
113  {
114  $this->close();
115  }
116 
122  function open()
123  {
124  if (!$this->_opened) {
125  $this->_opened = (bool)($this->_socket = @fsockopen(
126  $this->_proto . $this->_ip,
127  $this->_port,
128  $errno,
129  $errstr,
130  $this->_timeout));
131  }
132  return $this->_opened;
133  }
134 
139  function close()
140  {
141  if ($this->_opened) {
142  $this->_opened = false;
143  return fclose($this->_socket);
144  }
145  return true;
146  }
147 
160  function log($message, $priority = null)
161  {
162  /* If a priority hasn't been specified, use the default value. */
163  if ($priority === null) {
164  $priority = $this->_priority;
165  }
166 
167  /* Abort early if the priority is above the maximum logging level. */
168  if (!$this->_isMasked($priority)) {
169  return false;
170  }
171 
172  /* If the connection isn't open and can't be opened, return failure. */
173  if (!$this->_opened && !$this->open()) {
174  return false;
175  }
176 
177  /* Extract the string representation of the message. */
178  $message = $this->_extractMessage($message);
179 
180  /* Set the facility level. */
181  $facility_level = intval($this->_name) +
182  intval($this->_toSyslog($priority));
183 
184  /* Prepend ident info. */
185  if (!empty($this->_ident)) {
186  $message = $this->_ident . ' ' . $message;
187  }
188 
189  /* Check for message length. */
190  if (strlen($message) > $this->_maxsize) {
191  $message = substr($message, 0, ($this->_maxsize) - 10) . ' [...]';
192  }
193 
194  /* Write to socket. */
195  fwrite($this->_socket, '<' . $facility_level . '>' . $message . "\n");
196 
197  $this->_announce(array('priority' => $priority, 'message' => $message));
198  }
199 
214  function _toSyslog($priority)
215  {
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
225  );
226 
227  /* If we're passed an unknown priority, default to LOG_INFO. */
228  if (!is_int($priority) || !in_array($priority, $priorities)) {
229  return LOG_INFO;
230  }
231 
232  return $priorities[$priority];
233  }
234 
235 }