XOOPS  2.6.0
debugbarlogger.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 
17 
32 class DebugbarLogger implements LoggerInterface
33 {
37  private $debugbar = false;
38 
42  private $renderer = false;
43 
47  private $activated = false;
48 
52  private $quietmode = false;
53 
57  public function __construct()
58  {
59  Logger::getInstance()->addLogger($this);
60  }
61 
67  public static function getInstance()
68  {
69  static $instance;
70  if (!isset($instance)) {
71  $class = __CLASS__;
72  $instance = new $class();
73  }
74 
75  return $instance;
76  }
77 
83  public function getDebugbar()
84  {
85  return $this->debugbar;
86  }
87 
93  public function disable()
94  {
95  //error_reporting(0);
96  $this->activated = false;
97  }
98 
107  public function enable()
108  {
109  error_reporting(E_ALL | E_STRICT);
110 
111  $this->activated = true;
112 
113  $this->enableRendering();
114 
115  if (!$this->debugbar) {
116  $this->debugbar = new StandardDebugBar();
117  $this->renderer = $this->debugbar->getJavascriptRenderer();
118 
119  //$this->debugbar->addCollector(new MessagesCollector('Errors'));
120  $this->debugbar->addCollector(new MessagesCollector('Deprecated'));
121  $this->debugbar->addCollector(new MessagesCollector('Blocks'));
122  $this->debugbar->addCollector(new MessagesCollector('Extra'));
123  //$this->debugbar->addCollector(new MessagesCollector('Queries'));
124 
126  $debugStack = $xoops->db()->getConfiguration()->getSQLLogger();
127  $this->debugbar->addCollector(new DebugBar\Bridge\DoctrineCollector($debugStack));
128  //$this->debugbar->setStorage(new DebugBar\Storage\FileStorage(\XoopsBaseConfig::get('var-path').'/debugbar'));
129  }
130  $this->addToTheme();
131  }
132 
138  public function isEnable()
139  {
140  return $this->activated;
141  }
142 
148  public function quiet()
149  {
150  //$this->debugbar->sendDataInHeaders();
151  $this->quietmode = true;
152  }
153 
159  private function addToTheme()
160  {
161  static $addedResource = false;
162 
163  if ($this->activated && !$addedResource) {
164  if (isset($GLOBALS['xoTheme'])) {
165  // get asset information provided by debugbar
166  // don't include vendors - jquery already available, need workaround for font-awesome
167  $this->renderer->setIncludeVendors(true);
168  $this->renderer->setEnableJqueryNoConflict(false);
169  list($cssAssets, $jsAssets) = $this->renderer->getAssets();
170 
171  // font-awesome requires some special handling with cssmin
172  // see: https://code.google.com/p/cssmin/issues/detail?id=52&q=font
173  // using our own copy of full css instead of minified version packaged
174  // with debugbar avoids the issue.
175 
176  // Supress unwanted assets - exclude anything containing these strings
177  $excludes = array(
178  '/vendor/font-awesome/', // font-awsome needs special process
179  //'/vendor/highlightjs/', // highlightjs has some negative side effects
180  '/vendor/jquery/', // jquery is already available
181  );
182 
183  $cssAssets = array_filter(
184  $cssAssets,
185  function ($filename) use ($excludes) {
186  foreach ($excludes as $exclude) {
187  if (false !== strpos($filename, $exclude)) {
188  return false;
189  }
190  }
191  return true;
192  }
193  );
194 
195  $jsAssets = array_filter(
196  $jsAssets,
197  function ($filename) use ($excludes) {
198  foreach ($excludes as $exclude) {
199  if (false !== strpos($filename, $exclude)) {
200  return false;
201  }
202  }
203  return true;
204  }
205  );
206  $cssAssets[] = 'modules/debugbar/assets/css/font-awesome.css';
207 
209  $xoops->theme()->addStylesheetAssets($cssAssets, 'cssembed,?cssmin');
210  $xoops->theme()->addScriptAssets($jsAssets, '?jsmin');
211 
212  $addedResource = true;
213  }
214  }
215  }
216 
225  public function startTime($name = 'XOOPS', $label = null)
226  {
227  if ($this->activated) {
228  try {
229  $this->debugbar['time']->startMeasure($name, $label);
230  } catch (Exception $e) {
231  $this->addException($e);
232  }
233  }
234  }
235 
243  public function stopTime($name = 'XOOPS')
244  {
245  $this->addToTheme();
246 
247  if ($this->activated) {
248  try {
249  $this->debugbar['time']->stopMeasure($name);
250  } catch (Exception $e) {
251  $this->addException($e);
252  }
253  }
254  }
255 
266  public function addQuery($sql, $error = null, $errno = null, $query_time = null)
267  {
268  if ($this->activated) {
269  $level = LogLevel::INFO;
270  if (!empty($error)) {
271  $level = LogLevel::ERROR;
272  }
273  $context = array(
274  'channel'=>'Queries',
275  'error'=>$error,
276  'errno'=>$errno,
277  'query_time'=>$query_time
278  );
279  $this->log($level, $sql, $context);
280  }
281  }
282 
292  public function addBlock($name, $cached = false, $cachetime = 0)
293  {
294  if ($this->activated) {
295  $context = array('channel'=>'Blocks', 'cached'=>$cached, 'cachetime'=>$cachetime);
296  $this->log(LogLevel::INFO, $name, $context);
297  }
298  }
299 
308  public function addExtra($name, $msg)
309  {
310  if ($this->activated) {
311  $context = array('channel'=>'Extra', 'name'=>$name);
312  $this->log(LogLevel::INFO, $msg, $context);
313  }
314  }
315 
323  public function addDeprecated($msg)
324  {
325  if ($this->activated) {
326  $this->log(LogLevel::WARNING, $msg, array('channel'=>'Deprecated'));
327  }
328  }
329 
337  public function addException($e)
338  {
339  if ($this->activated) {
340  $this->debugbar['exceptions']->addException($e);
341  }
342  }
343 
349  public function addSmarty()
350  {
351  if ($this->activated) {
352  $data = Xoops::getInstance()->tpl()->getTemplateVars();
353  // fix values that don't display properly
354  foreach ($data as $k => $v) {
355  if ($v === '') {
356  $data[$k] = '(empty string)';
357  } elseif ($v === null) {
358  $data[$k] = 'NULL';
359  } elseif ($v === true) { // just to be consistent with false
360  $data[$k] = 'bool TRUE';
361  } elseif ($v === false) {
362  $data[$k] = 'bool FALSE';
363  }
364  }
365  ksort($data, SORT_NATURAL | SORT_FLAG_CASE);
366  $this->debugbar->addCollector(
367  new DebugBar\DataCollector\ConfigCollector($data, 'Smarty')
368  );
369  }
370  }
371 
379  public function dump($var)
380  {
381  $this->log(LogLevel::DEBUG, $var);
382  }
383 
389  public function stackData()
390  {
391  if ($this->activated) {
392  $this->debugbar->stackData();
393  $this->activated=false;
394  $this->renderingEnabled = false;
395  }
396  }
397 
406  public function enableRendering()
407  {
408  $this->renderingEnabled = true;
409  }
410 
418  public function render($output)
419  {
420  if (!$this->activated) {
421  return $output;
422  }
423 
425  $head = '</script>'.$this->renderer->renderHead().'<script>';
426  $xoops->theme()->addScript(null, null, $head);
427 
428  $log = $this->renderer->render();
429  $this->renderingEnabled = $this->activated = false;
430 
431  $pattern = '<!--{xo-logger-output}-->';
432  $pos = strpos($output, $pattern);
433  if ($pos !== false) {
434  return substr($output, 0, $pos) . $log . substr($output, $pos + strlen($pattern));
435  } else {
436  return $output . $log;
437  }
438  }
439 
443  public function __destruct()
444  {
445  if ($this->activated) {
446  // include any queued time data from Xmf\Debug
447  $queue = \Xmf\Debug::dumpQueuedTimers(true);
448  if (!empty($queue)) {
449  foreach ($queue as $q) {
450  $this->debugbar['time']->addMeasure($q['label'], $q['start'], $q['start'] + $q['elapsed']);
451  }
452  }
453  $this->addToTheme();
454  $this->addExtra(_MD_DEBUGBAR_PHP_VERSION, PHP_VERSION);
455  $this->addExtra(_MD_DEBUGBAR_INCLUDED_FILES, (string) count(get_included_files()));
456  if (false === $this->quietmode) {
457  if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
458  && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
459  // default for ajax, do not initialize a new toolbar, just add dataset
460  $log = $this->renderer->render(false);
461  } else {
462  $log = $this->renderer->render();
463  }
464  echo $log;
465  } else {
466  $this->debugbar->sendDataInHeaders();
467  }
468  }
469  }
470 
479  public function emergency($message, array $context = array())
480  {
481  if ($this->activated) {
482  $this->log(LogLevel::EMERGENCY, $message, $context);
483  }
484  }
485 
497  public function alert($message, array $context = array())
498  {
499  if ($this->activated) {
500  $this->log(LogLevel::ALERT, $message, $context);
501  }
502  }
503 
514  public function critical($message, array $context = array())
515  {
516  if ($this->activated) {
517  $this->log(LogLevel::CRITICAL, $message, $context);
518  }
519  }
520 
530  public function error($message, array $context = array())
531  {
532  if ($this->activated) {
533  $this->log(LogLevel::ERROR, $message, $context);
534  }
535  }
536 
548  public function warning($message, array $context = array())
549  {
550  if ($this->activated) {
551  $this->log(LogLevel::WARNING, $message, $context);
552  }
553  }
554 
563  public function notice($message, array $context = array())
564  {
565  if ($this->activated) {
566  $this->log(LogLevel::NOTICE, $message, $context);
567  }
568  }
569 
580  public function info($message, array $context = array())
581  {
582  if ($this->activated) {
583  $this->log(LogLevel::INFO, $message, $context);
584  }
585  }
586 
595  public function debug($message, array $context = array())
596  {
597  if ($this->activated) {
598  $this->log(LogLevel::DEBUG, $message, $context);
599  }
600  }
601 
611  public function log($level, $message, array $context = array())
612  {
613  if (!$this->activated) {
614  return;
615  }
616 
617  $channel = 'messages';
618  $msg = $message;
619 
624  if (isset($context['channel'])) {
625  $chan = strtolower($context['channel']);
626  switch ($chan) {
627  case 'blocks':
628  $channel = 'Blocks';
629  $msg = $message . ': ';
630  if ($context['cached']) {
631  $msg .= sprintf(_MD_DEBUGBAR_CACHED, intval($context['cachetime']));
632  } else {
634  }
635  break;
636  case 'deprecated':
637  $channel = 'Deprecated';
638  $msg = $message;
639  break;
640  case 'extra':
641  $channel = 'Extra';
642  $msg = $context['name'] . ': ' . $message;
643  break;
644  case 'queries':
645  $channel = 'Queries';
646  $msg = $message;
647  $qt = empty($context['query_time']) ?
648  '' : sprintf('%0.6f - ', $context['query_time']);
649  if ($level == LogLevel::ERROR) {
650  //if (!is_scalar($context['errno']) || !is_scalar($context['errno'])) {
651  // \Xmf\Debug::dump($context);
652  //}
653  $msg .= ' -- Error number: '
654  . (is_scalar($context['errno']) ? $context['errno'] : '?')
655  . ' Error message: '
656  . (is_scalar($context['error']) ? $context['error'] : '?');
657  }
658  $msg = $qt . $msg;
659  break;
660  }
661  }
662  switch ($level) {
663  case LogLevel::EMERGENCY:
664  $this->debugbar[$channel]->emergency($msg);
665  break;
666  case LogLevel::ALERT:
667  $this->debugbar[$channel]->alert($msg);
668  break;
669  case LogLevel::CRITICAL:
670  $this->debugbar[$channel]->critical($msg);
671  break;
672  case LogLevel::ERROR:
673  $this->debugbar[$channel]->error($msg);
674  break;
675  case LogLevel::WARNING:
676  $this->debugbar[$channel]->warning($msg);
677  break;
678  case LogLevel::NOTICE:
679  $this->debugbar[$channel]->notice($msg);
680  break;
681  case LogLevel::INFO:
682  $this->debugbar[$channel]->info($msg);
683  break;
684  case LogLevel::DEBUG:
685  default:
686  $this->debugbar[$channel]->debug($msg);
687  break;
688  }
689  }
690 }
if(empty($settings['ROOT_PATH'])) elseif(empty($settings['DB_PARAMETERS'])) $error
error($message, array $context=array())
static getInstance()
Definition: Xoops.php:160
$_SERVER['REQUEST_URI']
critical($message, array $context=array())
static getInstance()
addExtra($name, $msg)
const _MD_DEBUGBAR_PHP_VERSION
Definition: main.php:21
emergency($message, array $context=array())
$xoops
Definition: admin.php:25
const _MD_DEBUGBAR_CACHED
Definition: main.php:33
const _MD_DEBUGBAR_NOT_CACHED
Definition: main.php:32
warning($message, array $context=array())
notice($message, array $context=array())
addQuery($sql, $error=null, $errno=null, $query_time=null)
alert($message, array $context=array())
$sql
Definition: pda.php:32
const WARNING
Definition: install.php:39
debug($message, array $context=array())
stopTime($name= 'XOOPS')
$GLOBALS['xoops']
Definition: common.php:33
startTime($name= 'XOOPS', $label=null)
if(!is_object($module)||!$module->getVar('isactive')) $msg
Definition: groupperm.php:38
$var
Definition: userinfo.php:125
static dumpQueuedTimers($returnOnly=false)
Definition: Debug.php:192
const _MD_DEBUGBAR_INCLUDED_FILES
Definition: main.php:20
log($level, $message, array $context=array())
addBlock($name, $cached=false, $cachetime=0)
info($message, array $context=array())