1 <?php |
|
2 /** |
|
3 * Licensed to the Apache Software Foundation (ASF) under one or more |
|
4 * contributor license agreements. See the NOTICE file distributed with |
|
5 * this work for additional information regarding copyright ownership. |
|
6 * The ASF licenses this file to You under the Apache License, Version 2.0 |
|
7 * (the "License"); you may not use this file except in compliance with |
|
8 * the License. You may obtain a copy of the License at |
|
9 * |
|
10 * http://www.apache.org/licenses/LICENSE-2.0 |
|
11 * |
|
12 * Unless required by applicable law or agreed to in writing, software |
|
13 * distributed under the License is distributed on an "AS IS" BASIS, |
|
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
15 * See the License for the specific language governing permissions and |
|
16 * limitations under the License. |
|
17 */ |
|
18 |
|
19 /** |
|
20 * Log events to a system log using the PHP syslog() function. |
|
21 * |
|
22 * This appenders requires a layout. |
|
23 * |
|
24 * ## Configurable parameters: ## |
|
25 * |
|
26 * - **ident** - The ident of the syslog message. |
|
27 * - **priority** - The priority for the syslog message (used when overriding |
|
28 * priority). |
|
29 * - **facility** - The facility for the syslog message |
|
30 * - **overridePriority** - If set to true, the message priority will always |
|
31 * use the value defined in {@link $priority}, otherwise the priority will |
|
32 * be determined by the message's log level. |
|
33 * - **option** - The option value for the syslog message. |
|
34 * |
|
35 * Recognised syslog options are: |
|
36 * |
|
37 * - CONS - if there is an error while sending data to the system logger, write directly to the system console |
|
38 * - NDELAY - open the connection to the logger immediately |
|
39 * - ODELAY - delay opening the connection until the first message is logged (default) |
|
40 * - PERROR - print log message also to standard error |
|
41 * - PID - include PID with each message |
|
42 * |
|
43 * Multiple options can be set by delimiting them with a pipe character, |
|
44 * e.g.: "CONS|PID|PERROR". |
|
45 * |
|
46 * Recognised syslog priorities are: |
|
47 * |
|
48 * - EMERG |
|
49 * - ALERT |
|
50 * - CRIT |
|
51 * - ERR |
|
52 * - WARNING |
|
53 * - NOTICE |
|
54 * - INFO |
|
55 * - DEBUG |
|
56 * |
|
57 * Levels are mapped as follows: |
|
58 * |
|
59 * - <b>FATAL</b> to LOG_ALERT |
|
60 * - <b>ERROR</b> to LOG_ERR |
|
61 * - <b>WARN</b> to LOG_WARNING |
|
62 * - <b>INFO</b> to LOG_INFO |
|
63 * - <b>DEBUG</b> to LOG_DEBUG |
|
64 * - <b>TRACE</b> to LOG_DEBUG |
|
65 * |
|
66 * @version $Revision: 1337820 $ |
|
67 * @package log4php |
|
68 * @subpackage appenders |
|
69 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 |
|
70 * @link http://logging.apache.org/log4php/docs/appenders/syslog.html Appender documentation |
|
71 */ |
|
72 class LoggerAppenderSyslog extends LoggerAppender { |
|
73 |
|
74 /** |
|
75 * The ident string is added to each message. Typically the name of your application. |
|
76 * |
|
77 * @var string |
|
78 */ |
|
79 protected $ident = "Apache log4php"; |
|
80 |
|
81 /** |
|
82 * The syslog priority to use when overriding priority. This setting is |
|
83 * required if {@link overridePriority} is set to true. |
|
84 * |
|
85 * @var string |
|
86 */ |
|
87 protected $priority; |
|
88 |
|
89 /** |
|
90 * The option used when opening the syslog connection. |
|
91 * |
|
92 * @var string |
|
93 */ |
|
94 protected $option = 'PID|CONS'; |
|
95 |
|
96 /** |
|
97 * The facility value indicates the source of the message. |
|
98 * |
|
99 * @var string |
|
100 */ |
|
101 protected $facility = 'USER'; |
|
102 |
|
103 /** |
|
104 * If set to true, the message priority will always use the value defined |
|
105 * in {@link $priority}, otherwise the priority will be determined by the |
|
106 * message's log level. |
|
107 * |
|
108 * @var string |
|
109 */ |
|
110 protected $overridePriority = false; |
|
111 |
|
112 /** |
|
113 * Holds the int value of the {@link $priority}. |
|
114 * @var int |
|
115 */ |
|
116 private $intPriority; |
|
117 |
|
118 /** |
|
119 * Holds the int value of the {@link $facility}. |
|
120 * @var int |
|
121 */ |
|
122 private $intFacility; |
|
123 |
|
124 /** |
|
125 * Holds the int value of the {@link $option}. |
|
126 * @var int |
|
127 */ |
|
128 private $intOption; |
|
129 |
|
130 /** |
|
131 * Sets the {@link $ident}. |
|
132 * |
|
133 * @param string $ident |
|
134 */ |
|
135 public function setIdent($ident) { |
|
136 $this->ident = $ident; |
|
137 } |
|
138 |
|
139 /** |
|
140 * Sets the {@link $priority}. |
|
141 * |
|
142 * @param string $priority |
|
143 */ |
|
144 public function setPriority($priority) { |
|
145 $this->priority = $priority; |
|
146 } |
|
147 |
|
148 /** |
|
149 * Sets the {@link $facility}. |
|
150 * |
|
151 * @param string $facility |
|
152 */ |
|
153 public function setFacility($facility) { |
|
154 $this->facility = $facility; |
|
155 } |
|
156 |
|
157 /** |
|
158 * Sets the {@link $overridePriority}. |
|
159 * |
|
160 * @param string $overridePriority |
|
161 */ |
|
162 public function setOverridePriority($overridePriority) { |
|
163 $this->overridePriority = $overridePriority; |
|
164 } |
|
165 |
|
166 /** |
|
167 * Sets the 'option' parameter. |
|
168 * |
|
169 * @param string $option |
|
170 */ |
|
171 public function setOption($option) { |
|
172 $this->option = $option; |
|
173 } |
|
174 |
|
175 /** |
|
176 * Returns the 'ident' parameter. |
|
177 * |
|
178 * @return string $ident |
|
179 */ |
|
180 public function getIdent() { |
|
181 return $this->ident; |
|
182 } |
|
183 |
|
184 /** |
|
185 * Returns the 'priority' parameter. |
|
186 * |
|
187 * @return string |
|
188 */ |
|
189 public function getPriority() { |
|
190 return $this->priority; |
|
191 } |
|
192 |
|
193 /** |
|
194 * Returns the 'facility' parameter. |
|
195 * |
|
196 * @return string |
|
197 */ |
|
198 public function getFacility() { |
|
199 return $this->facility; |
|
200 } |
|
201 |
|
202 /** |
|
203 * Returns the 'overridePriority' parameter. |
|
204 * |
|
205 * @return string |
|
206 */ |
|
207 public function getOverridePriority() { |
|
208 return $this->overridePriority; |
|
209 } |
|
210 |
|
211 /** |
|
212 * Returns the 'option' parameter. |
|
213 * |
|
214 * @return string |
|
215 */ |
|
216 public function getOption() { |
|
217 return $this->option; |
|
218 } |
|
219 |
|
220 |
|
221 public function activateOptions() { |
|
222 $this->intPriority = $this->parsePriority(); |
|
223 $this->intOption = $this->parseOption(); |
|
224 $this->intFacility = $this->parseFacility(); |
|
225 |
|
226 $this->closed = false; |
|
227 } |
|
228 |
|
229 public function close() { |
|
230 if ($this->closed != true) { |
|
231 closelog(); |
|
232 $this->closed = true; |
|
233 } |
|
234 } |
|
235 |
|
236 /** |
|
237 * Appends the event to syslog. |
|
238 * |
|
239 * Log is opened and closed each time because if it is not closed, it |
|
240 * can cause the Apache httpd server to log to whatever ident/facility |
|
241 * was used in openlog(). |
|
242 * |
|
243 * @see http://www.php.net/manual/en/function.syslog.php#97843 |
|
244 */ |
|
245 public function append(LoggerLoggingEvent $event) { |
|
246 $priority = $this->getSyslogPriority($event->getLevel()); |
|
247 $message = $this->layout->format($event); |
|
248 |
|
249 openlog($this->ident, $this->intOption, $this->intFacility); |
|
250 syslog($priority, $message); |
|
251 closelog(); |
|
252 } |
|
253 |
|
254 /** Determines which syslog priority to use based on the given level. */ |
|
255 private function getSyslogPriority(LoggerLevel $level) { |
|
256 if ($this->overridePriority) { |
|
257 return $this->intPriority; |
|
258 } |
|
259 return $level->getSyslogEquivalent(); |
|
260 } |
|
261 |
|
262 /** Parses a syslog option string and returns the correspodning int value. */ |
|
263 private function parseOption() { |
|
264 $value = 0; |
|
265 $options = explode('|', $this->option); |
|
266 |
|
267 foreach ($options as $option) { |
|
268 if (!empty($option)) { |
|
269 $constant = "LOG_" . trim($option); |
|
270 if (defined($constant)) { |
|
271 $value |= constant($constant); |
|
272 } else { |
|
273 trigger_error("log4php: Invalid syslog option provided: $option. Whole option string: {$this->option}.", E_USER_WARNING); |
|
274 } |
|
275 } |
|
276 } |
|
277 return $value; |
|
278 } |
|
279 |
|
280 /** Parses the facility string and returns the corresponding int value. */ |
|
281 private function parseFacility() { |
|
282 if (!empty($this->facility)) { |
|
283 $constant = "LOG_" . trim($this->facility); |
|
284 if (defined($constant)) { |
|
285 return constant($constant); |
|
286 } else { |
|
287 trigger_error("log4php: Invalid syslog facility provided: {$this->facility}.", E_USER_WARNING); |
|
288 } |
|
289 } |
|
290 } |
|
291 |
|
292 /** Parses the priority string and returns the corresponding int value. */ |
|
293 private function parsePriority() { |
|
294 if (!empty($this->priority)) { |
|
295 $constant = "LOG_" . trim($this->priority); |
|
296 if (defined($constant)) { |
|
297 return constant($constant); |
|
298 } else { |
|
299 trigger_error("log4php: Invalid syslog priority provided: {$this->priority}.", E_USER_WARNING); |
|
300 } |
|
301 } |
|
302 } |
|
303 } |
|