1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
14:
15: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
16:
17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
39: class cLog {
40:
41: 42: 43: 44: 45:
46: const EMERG = 0;
47:
48: 49: 50: 51: 52:
53: const ALERT = 1;
54:
55: 56: 57: 58: 59:
60: const CRIT = 2;
61:
62: 63: 64: 65: 66:
67: const ERR = 3;
68:
69: 70: 71: 72: 73:
74: const WARN = 4;
75:
76: 77: 78: 79: 80:
81: const NOTICE = 5;
82:
83: 84: 85: 86: 87:
88: const INFO = 6;
89:
90: 91: 92: 93: 94:
95: const DEBUG = 7;
96:
97: 98: 99: 100: 101:
102: protected $_writer;
103:
104: 105: 106: 107: 108:
109: protected $_shortcutHandlers = array();
110:
111: 112: 113: 114: 115:
116: protected $_priorities = array();
117:
118: 119: 120: 121: 122:
123: protected $_defaultPriorities = array();
124:
125: 126: 127: 128: 129:
130: protected $_buffer = array();
131:
132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151:
152: public function __construct($writer = false) {
153: global $cfg;
154:
155: $createWriter = false;
156:
157: if ($writer == false) {
158: $createWriter = true;
159: } else if (!is_object($writer) || ($writer instanceof cLogWriter) == false) {
160: cWarning(__FILE__, __LINE__, "The passed class is not a subclass of cLogWriter. Creating new one.");
161: $createWriter = true;
162: }
163:
164: if ($createWriter == true) {
165: $options = array('destination' => $cfg['path']['contenido_logs'] . 'data/contenido.log');
166: $writer = cLogWriter::factory("File", $options);
167: }
168:
169: $this->setWriter($writer);
170: $this->setShortcutHandler("%date", array($this, "shDate"));
171: $this->setShortcutHandler("%level", array($this, "shLevel"));
172: $this->setShortcutHandler("%message", array($this, "shMessage"));
173:
174: $this->getWriter()->setOption('log_format', '[%date] [%level] %message', false);
175:
176: $reflection = new ReflectionClass($this);
177: $this->_priorities = $this->_defaultPriorities = array_flip($reflection->getConstants());
178: }
179:
180: 181: 182: 183: 184:
185: public function getWriter() {
186: return $this->_writer;
187: }
188:
189: 190: 191: 192: 193: 194:
195: public function setWriter(cLogWriter $writer) {
196: $this->_writer = $writer;
197: }
198:
199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214:
215: public function setShortcutHandler($shortcut, $handler) {
216: if ($shortcut == '') {
217: throw new cInvalidArgumentException('The shortcut name must not be empty.');
218: }
219:
220: if (cString::getPartOfString($shortcut, 0, 1) == "%") {
221: $shortcut = cString::getPartOfString($shortcut, 1);
222: }
223:
224: if (is_callable($handler) == false) {
225: throw new cInvalidArgumentException('The specified shortcut handler does not exist.');
226: }
227:
228: if (array_key_exists($shortcut, $this->_shortcutHandlers)) {
229: throw new cInvalidArgumentException('The shortcut ' . $shortcut . ' is already in use!');
230: }
231:
232: $this->_shortcutHandlers[$shortcut] = $handler;
233:
234: return true;
235: }
236:
237: 238: 239: 240: 241: 242: 243: 244: 245:
246: public function unsetShortcutHandler($shortcut) {
247: if (!in_array($shortcut, $this->_shortcutHandlers)) {
248: throw new cInvalidArgumentException('The specified shortcut handler does not exist.');
249: }
250:
251: unset($this->_shortcutHandlers[$shortcut]);
252: return true;
253: }
254:
255: 256: 257: 258: 259: 260: 261: 262:
263: public function buffer($message, $priority = NULL) {
264: $this->_buffer[] = array($message, $priority);
265: }
266:
267: 268: 269: 270: 271: 272: 273: 274:
275: public function commit($revoke = true) {
276: if (count($this->_buffer) == 0) {
277: cWarning(__FILE__, __LINE__, "There are no buffered messages to commit.");
278: return false;
279: }
280:
281: foreach ($this->_buffer as $bufferInfo) {
282: $this->log($bufferInfo[0], $bufferInfo[1]);
283: }
284:
285: if ($revoke == true) {
286: $this->revoke();
287: }
288: }
289:
290: 291: 292:
293: public function revoke() {
294: $this->_buffer = array();
295: }
296:
297: 298: 299: 300: 301: 302: 303: 304:
305: public function log($message, $priority = NULL) {
306: if ($priority && is_int($priority) == false && in_array($priority, $this->_priorities)) {
307: $priority = array_search($priority, $this->_priorities);
308: }
309:
310: if ($priority === NULL || array_key_exists($priority, $this->_priorities) == false) {
311: $priority = $this->getWriter()->getOption('default_priority');
312: }
313:
314: $logMessage = $this->getWriter()->getOption('log_format');
315: $lineEnding = $this->getWriter()->getOption('line_ending');
316:
317: foreach ($this->_shortcutHandlers as $shortcut => $handler) {
318: if (cString::getPartOfString($shortcut, 0, 1) != "%") {
319: $shortcut = "%" . $shortcut;
320: }
321:
322: $info = array(
323: 'message' => $message,
324: 'priority' => $priority
325: );
326:
327: $value = call_user_func($handler, $info);
328:
329: $logMessage = str_replace($shortcut, $value, $logMessage);
330: }
331:
332: $this->getWriter()->write($logMessage . $lineEnding, $priority);
333: }
334:
335: 336: 337: 338: 339: 340: 341: 342: 343: 344:
345: public function addPriority($name, $value) {
346: if ($name == '') {
347: throw new cInvalidArgumentException('Priority name must not be empty.');
348: }
349:
350: if (in_array($name, $this->_priorities)) {
351: throw new cInvalidArgumentException('The given priority name already exists.');
352: }
353:
354: if (array_key_exists($value, $this->_priorities)) {
355: throw new cInvalidArgumentException('The priority value already exists.');
356: }
357:
358: $this->_priorities[$value] = $name;
359: }
360:
361: 362: 363: 364: 365: 366: 367: 368: 369:
370: public function removePriority($name) {
371: if ($name == '') {
372: throw new cInvalidArgumentException('Priority name must not be empty.');
373: }
374:
375: if (in_array($name, $this->_priorities) == false) {
376: throw new cInvalidArgumentException('Priority name does not exist.');
377: }
378:
379: if (in_array($name, $this->_defaultPriorities) == true) {
380: throw new cInvalidArgumentException('Removing default priorities is not allowed.');
381: }
382:
383: $priorityIndex = array_search($name, $this->_priorities);
384:
385: unset($this->_priorities[$priorityIndex]);
386: }
387:
388: 389: 390: 391: 392: 393: 394: 395: 396: 397:
398: public function __call($method, $arguments) {
399: $priorityName = cString::toUpperCase($method);
400:
401: if (in_array($priorityName, $this->_priorities) == false) {
402: throw new cInvalidArgumentException('The given priority ' . $priorityName . ' is not supported.');
403: }
404:
405: $priorityIndex = array_search($priorityName, $this->_priorities);
406:
407: $this->log($arguments[0], $priorityIndex);
408: }
409:
410: 411: 412: 413: 414: 415: 416:
417: public function shDate() {
418: return date("Y-m-d H:i:s");
419: }
420:
421: 422: 423: 424: 425: 426: 427: 428: 429: 430:
431: public function shLevel($info) {
432: $logLevel = $info['priority'];
433: return str_pad($this->_priorities[$logLevel], 10, " ", STR_PAD_BOTH);
434: }
435:
436: 437: 438: 439: 440: 441: 442: 443:
444: public function shMessage($info) {
445: return $info['message'];
446: }
447: }
448: