XOOPS  2.6.0
monologlogger.php
Go to the documentation of this file.
1 <?php
2 /*
3  You may not change or alter any portion of this comment or credits
4  of supporting developers from this source code or any supporting source code
5  which is considered copyrighted (c) material of the original comment or credit authors.
6 
7  This program is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 */
11 
12 use Monolog\Logger as MLogger;
14 //use Monolog\Handler\FirePHPHandler;
21 
36 class MonologLogger implements LoggerInterface
37 {
41  private $monolog = false;
42 
46  private $activated = false;
47 
51  private $starttimes = array();
52 
56  private $configs = false;
57 
61  public function __construct()
62  {
63  Logger::getInstance()->addLogger($this);
64  }
65 
71  public static function getInstance()
72  {
73  static $instance;
74  if (!isset($instance)) {
75  $class = __CLASS__;
76  $instance = new $class();
77  }
78 
79  return $instance;
80  }
81 
87  public function disable()
88  {
89  //error_reporting(0);
90  $this->activated = false;
91  }
92 
98  public function enable()
99  {
100  error_reporting(E_ALL | E_STRICT);
101 
102  $this->activated = true;
103 
104  if (!$this->monolog) {
105  // Create the logger
106  $this->monolog = new \Monolog\Logger('app');
107  $proc = new WebProcessor();
108  $this->monolog->pushProcessor($proc);
109  $this->monolog->pushProcessor(array($this,'xoopsDataProcessor'));
110 
111  $formatter = new LineFormatter();
112  //$formatter = new LogstashFormatter;
113  switch ($this->configs['logging_threshold']) {
114  case 'error':
115  $threshold=MLogger::ERROR;
116  break;
117  case 'warning':
118  $threshold=MLogger::WARNING;
119  break;
120  case 'info':
121  $threshold=MLogger::INFO;
122  break;
123  case 'debug':
124  default:
125  $threshold=MLogger::DEBUG;
126  break;
127  }
128  if (intval($this->configs['max_versions']) == 0) {
129  $stream = new StreamHandler($this->configs['log_file_path'], $threshold);
130  } else {
131  $stream = new RotatingFileHandler(
132  $this->configs['log_file_path'],
133  $this->configs['max_versions'],
134  $threshold
135  );
136  }
137  $stream->setFormatter($formatter);
138  $this->monolog->pushHandler($stream);
139  }
140  //if ($this->monolog && $this->configs['phpfire_enable']) {
141  // $firephp = new FirePHPHandler();
142  // $this->monolog->pushHandler($firephp);
143  //}
144  }
145 
153  public function xoopsDataProcessor($record)
154  {
156  $record['extra']['user'] = '?';
157  @$record['extra']['user'] = $xoops->isUser() ? $xoops->user->getVar('uname') : 'n/a';
158  return $record;
159  }
160 
168  public function setConfigs($configs)
169  {
170  $this->configs=$configs;
171  }
172 
178  public function isEnable()
179  {
180  return $this->activated;
181  }
182 
188  public function quiet()
189  {
190  //$this->activated = false;
191  }
192 
200  public function startTime($name = 'XOOPS')
201  {
202  $this->starttimes[$name] = microtime(true);
203  }
204 
212  public function stopTime($name = 'XOOPS')
213  {
214  if ($this->activated) {
215  if (array_key_exists($name, $this->starttimes)) {
216  $elapsed = microtime(true) - $this->starttimes[$name];
217  $msg = sprintf(_MD_MONOLOG_TIMETOLOAD, htmlspecialchars($name), $elapsed);
218  $context = array(
219  'channel'=>'Timers',
220  );
221  $this->log(LogLevel::INFO, $msg, $context);
222  }
223  }
224  }
225 
236  public function addQuery($sql, $error = null, $errno = null, $query_time = null)
237  {
238  if ($this->activated) {
239  $level = LogLevel::INFO;
240  if (!empty($error)) {
241  $level = LogLevel::ERROR;
242  }
243  $context = array(
244  'channel'=>'Queries',
245  'error'=>$error,
246  'errno'=>$errno,
247  'query_time'=>$query_time
248  );
249  $this->log($level, $sql, $context);
250  }
251  }
252 
262  public function addBlock($name, $cached = false, $cachetime = 0)
263  {
264  if ($this->activated) {
265  $context = array('channel'=>'Blocks', 'cached'=>$cached, 'cachetime'=>$cachetime);
266  $this->log(LogLevel::INFO, $name, $context);
267  }
268  }
269 
278  public function addExtra($name, $msg)
279  {
280  if ($this->activated) {
281  $context = array('channel'=>'Extra', 'name'=>$name);
282  $this->log(LogLevel::INFO, $msg, $context);
283  }
284  }
285 
293  public function addDeprecated($msg)
294  {
295  if ($this->activated) {
296  $this->log(LogLevel::WARNING, $msg, array('channel'=>'Deprecated'));
297  }
298  }
299 
307  public function addException($e)
308  {
309  if ($this->activated) {
310  $this->error(
311  sprintf(
312  $this->messageTag('_MD_MONOLOG_EXCEPTION', 'Exception* : %s : file %s line %s'),
313  $e->getMessage(),
314  $this->sanitizePath($e->getFile()),
315  $e->getLine()
316  ),
317  array('exception' => $e)
318  );
319  }
320  }
321 
329  public function sanitizePath($path)
330  {
331  $path = str_replace(
332  array('\\', \XoopsBaseConfig::get('root-path'), str_replace('\\', '/', realpath(\XoopsBaseConfig::get('root-path')))),
333  array('/', '', ''),
334  $path
335  );
336  return $path;
337  }
338 
347  public function emergency($message, array $context = array())
348  {
349  if ($this->activated) {
350  $this->log(LogLevel::EMERGENCY, $message, $context);
351  }
352  }
353 
365  public function alert($message, array $context = array())
366  {
367  if ($this->activated) {
368  $this->log(LogLevel::ALERT, $message, $context);
369  }
370  }
371 
382  public function critical($message, array $context = array())
383  {
384  if ($this->activated) {
385  $this->log(LogLevel::CRITICAL, $message, $context);
386  }
387  }
388 
398  public function error($message, array $context = array())
399  {
400  if ($this->activated) {
401  $this->log(LogLevel::ERROR, $message, $context);
402  }
403  }
404 
416  public function warning($message, array $context = array())
417  {
418  if ($this->activated) {
419  $this->log(LogLevel::WARNING, $message, $context);
420  }
421  }
422 
431  public function notice($message, array $context = array())
432  {
433  if ($this->activated) {
434  $this->log(LogLevel::NOTICE, $message, $context);
435  }
436  }
437 
448  public function info($message, array $context = array())
449  {
450  if ($this->activated) {
451  $this->log(LogLevel::INFO, $message, $context);
452  }
453  }
454 
463  public function debug($message, array $context = array())
464  {
465  if ($this->activated) {
466  $this->log(LogLevel::DEBUG, $message, $context);
467  }
468  }
469 
480  private function messageTag($tag, $default)
481  {
482  return defined($tag) ? constant($tag) : $default;
483  }
484 
494  public function log($level, $message, array $context = array())
495  {
496  if (!$this->activated) {
497  return;
498  }
499 
500  $channel = 'messages';
501  $msg = $message;
502 
507  if (isset($context['channel'])) {
508  $chan = strtolower($context['channel']);
509  switch ($chan) {
510  case 'blocks':
511  if (!$this->configs['include_blocks']) {
512  return;
513  }
514  //$channel = 'Blocks';
515  $msg = _MD_MONOLOG_BLOCKS . ' : ' . $message . ': ';
516  if ($context['cached']) {
517  $msg .= sprintf(_MD_MONOLOG_CACHED, intval($context['cachetime']));
518  } else {
520  }
521  break;
522  case 'deprecated':
523  if (!$this->configs['include_deprecated']) {
524  return;
525  }
526  //$channel = 'Deprecated';
527  $msg = $this->messageTag('_MD_MONOLOG_DEPRECATED', 'Deprecated*') . ' : ' . $message;
528  //$msg = _MD_MONOLOG_DEPRECATED . ' : ' . $message;
529  break;
530  case 'extra':
531  if (!$this->configs['include_extra']) {
532  return;
533  }
534  //$channel = 'Extra';
535  $msg = _MD_MONOLOG_EXTRA . ' : ' . $context['name'] . ': ' . $message;
536  break;
537  case 'queries':
538  if (!$this->configs['include_queries']) {
539  return;
540  }
541  //$channel = 'Queries';
542  $msg = $message;
543  $qt = empty($context['query_time']) ?
544  '' : sprintf('%0.6f - ', $context['query_time']);
545  if ($level == LogLevel::ERROR) {
546  //if (!is_scalar($context['errno']) || !is_scalar($context['errno'])) {
547  // \Xmf\Debug::dump($context);
548  //}
549  $msg .= ' -- Error number: '
550  . (is_scalar($context['errno']) ? $context['errno'] : '?')
551  . ' Error message: '
552  . (is_scalar($context['error']) ? $context['error'] : '?');
553  }
554  $msg = $this->messageTag('_MD_MONOLOG_QUERIES', 'Queries*') . ' : ' . $qt . $msg;
555  break;
556  case 'timers':
557  if (!$this->configs['include_timers']) {
558  return;
559  }
560  $msg = $this->messageTag('_MD_MONOLOG_TIMERS', 'Timers*') . ' : ' . $message;
561  break;
562  default:
563  $msg = $this->messageTag('_MD_MONOLOG_ERRORS', 'Errors*') . ' : ' . $message;
564  break;
565  }
566  } else {
567  $msg = $this->messageTag('_MD_MONOLOG_MESSAGES', 'Message*') . ' : ' . $message;
568  }
569  switch ($level) {
570  case LogLevel::EMERGENCY:
571  $this->monolog->emergency($msg, $context);
572  break;
573  case LogLevel::ALERT:
574  $this->monolog->alert($msg, $context);
575  break;
576  case LogLevel::CRITICAL:
577  $this->monolog->critical($msg, $context);
578  break;
579  case LogLevel::ERROR:
580  $this->monolog->error($msg, $context);
581  break;
582  case LogLevel::WARNING:
583  $this->monolog->warning($msg, $context);
584  break;
585  case LogLevel::NOTICE:
586  $this->monolog->notice($msg, $context);
587  break;
588  case LogLevel::INFO:
589  $this->monolog->info($msg, $context);
590  break;
591  case LogLevel::DEBUG:
592  default:
593  $this->monolog->debug($msg, $context);
594  break;
595  }
596  }
597 }
$path
Definition: execute.php:31
if(empty($settings['ROOT_PATH'])) elseif(empty($settings['DB_PARAMETERS'])) $error
error($message, array $context=array())
static getInstance()
Definition: Xoops.php:160
addBlock($name, $cached=false, $cachetime=0)
notice($message, array $context=array())
debug($message, array $context=array())
alert($message, array $context=array())
emergency($message, array $context=array())
critical($message, array $context=array())
log($level, $message, array $context=array())
$xoops
Definition: admin.php:25
const _MD_MONOLOG_CACHED
Definition: main.php:35
addExtra($name, $msg)
const _MD_MONOLOG_EXTRA
Definition: main.php:30
setConfigs($configs)
const _MD_MONOLOG_TIMETOLOAD
Definition: main.php:32
static get($name)
info($message, array $context=array())
addQuery($sql, $error=null, $errno=null, $query_time=null)
$sql
Definition: pda.php:32
const WARNING
Definition: install.php:39
warning($message, array $context=array())
if(!is_object($module)||!$module->getVar('isactive')) $msg
Definition: groupperm.php:38
messageTag($tag, $default)
const _MD_MONOLOG_BLOCKS
Definition: main.php:29
static getInstance()
stopTime($name= 'XOOPS')
startTime($name= 'XOOPS')
xoopsDataProcessor($record)
const _MD_MONOLOG_NOT_CACHED
Definition: main.php:34