1
0
mirror of https://github.com/maximebf/php-debugbar.git synced 2025-07-09 11:04:01 +02:00

added possibility to name monolog and messages collectors as well as aggregate them into a messages collector

This commit is contained in:
maximebf
2013-08-12 11:23:48 +10:00
parent 966a8e2d66
commit fefcd17ddb
5 changed files with 120 additions and 25 deletions

View File

@ -14,6 +14,7 @@ use Monolog\Logger;
use Monolog\Handler\AbstractProcessingHandler; use Monolog\Handler\AbstractProcessingHandler;
use DebugBar\DataCollector\DataCollectorInterface; use DebugBar\DataCollector\DataCollectorInterface;
use DebugBar\DataCollector\Renderable; use DebugBar\DataCollector\Renderable;
use DebugBar\DataCollector\MessagesAggregateInterface;
/** /**
* A monolog handler as well as a data collector * A monolog handler as well as a data collector
@ -22,21 +23,40 @@ use DebugBar\DataCollector\Renderable;
* $debugbar->addCollector(new MonologCollector($logger)); * $debugbar->addCollector(new MonologCollector($logger));
* </code> * </code>
*/ */
class MonologCollector extends AbstractProcessingHandler implements DataCollectorInterface, Renderable class MonologCollector extends AbstractProcessingHandler implements DataCollectorInterface, Renderable, MessagesAggregateInterface
{ {
protected $name;
protected $records = array(); protected $records = array();
public function __construct(Logger $logger, $level = Logger::DEBUG, $bubble = true) /**
* @param Logger $logger
* @param int $level
* @param boolean $bubble
* @param string $name
*/
public function __construct(Logger $logger = null, $level = Logger::DEBUG, $bubble = true, $name = 'monolog')
{ {
parent::__construct($level, $bubble); parent::__construct($level, $bubble);
$logger->pushHandler($this); $this->name = $name;
if ($logger !== null) {
$this->addLogger($logger);
}
} }
/**
* Adds logger which messages you want to log
*
* @param Logger $logger
*/
public function addLogger(Logger $logger) public function addLogger(Logger $logger)
{ {
$logger->pushHandler($this); $logger->pushHandler($this);
} }
/**
* {@inheritDoc}
*/
protected function write(array $record) protected function write(array $record)
{ {
$this->records[] = array( $this->records[] = array(
@ -47,6 +67,14 @@ class MonologCollector extends AbstractProcessingHandler implements DataCollecto
); );
} }
/**
* {@inheritDoc}
*/
public function getMessages()
{
return $this->records;
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@ -63,7 +91,7 @@ class MonologCollector extends AbstractProcessingHandler implements DataCollecto
*/ */
public function getName() public function getName()
{ {
return 'monolog'; return $this->name;
} }
/** /**
@ -71,14 +99,15 @@ class MonologCollector extends AbstractProcessingHandler implements DataCollecto
*/ */
public function getWidgets() public function getWidgets()
{ {
$name = $this->getName();
return array( return array(
"logs" => array( $name => array(
"widget" => "PhpDebugBar.Widgets.MessagesWidget", "widget" => "PhpDebugBar.Widgets.MessagesWidget",
"map" => "monolog.records", "map" => "$name.records",
"default" => "[]" "default" => "[]"
), ),
"logs:badge" => array( "$name:badge" => array(
"map" => "monolog.count", "map" => "$name.count",
"default" => "null" "default" => "null"
) )
); );

View File

@ -0,0 +1,21 @@
<?php
/*
* This file is part of the DebugBar package.
*
* (c) 2013 Maxime Bouroumeau-Fuseau
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace DebugBar\DataCollector;
interface MessagesAggregateInterface
{
/**
* Returns collected messages
*
* @return array
*/
public function getMessages();
}

View File

@ -15,16 +15,20 @@ use Psr\Log\AbstractLogger;
/** /**
* Provides a way to log messages * Provides a way to log messages
*/ */
class MessagesCollector extends AbstractLogger implements DataCollectorInterface, Renderable class MessagesCollector extends AbstractLogger implements DataCollectorInterface, MessagesAggregateInterface, Renderable
{ {
protected $name;
protected $messages = array(); protected $messages = array();
protected $aggregates = array();
/** /**
* {@inheritDoc} * @param string $name
*/ */
public function log($level, $message, array $context = array()) public function __construct($name = 'messages')
{ {
$this->addMessage($message, $level); $this->name = $name;
} }
/** /**
@ -41,19 +45,51 @@ class MessagesCollector extends AbstractLogger implements DataCollectorInterface
'message' => print_r($message, true), 'message' => print_r($message, true),
'is_string' => is_string($message), 'is_string' => is_string($message),
'label' => $label, 'label' => $label,
'time' => microtime(true), 'time' => microtime(true)
'memory_usage' => memory_get_usage()
); );
} }
/** /**
* Returns all messages * Aggregates messages from other collectors
* *
* @return array * @param MessagesAggregateInterface $messages
*/
public function aggregate(MessagesAggregateInterface $messages)
{
$this->aggregates[] = $messages;
}
/**
* {@inheritDoc}
*/ */
public function getMessages() public function getMessages()
{ {
return $this->messages; $messages = $this->messages;
foreach ($this->aggregates as $collector) {
$msgs = array_map(function($m) use ($collector) {
$m['collector'] = $collector->getName();
return $m;
}, $collector->getMessages());
$messages = array_merge($messages, $msgs);
}
// sort messages by their timestamp
usort($messages, function($a, $b) {
if ($a['time'] === $b['time']) {
return 0;
}
return $a['time'] < $b['time'] ? -1 : 1;
});
return $messages;
}
/**
* {@inheritDoc}
*/
public function log($level, $message, array $context = array())
{
$this->addMessage($message, $level);
} }
/** /**
@ -61,9 +97,10 @@ class MessagesCollector extends AbstractLogger implements DataCollectorInterface
*/ */
public function collect() public function collect()
{ {
$messages = $this->getMessages();
return array( return array(
'count' => count($this->messages), 'count' => count($messages),
'messages' => $this->messages 'messages' => $messages
); );
} }
@ -72,7 +109,7 @@ class MessagesCollector extends AbstractLogger implements DataCollectorInterface
*/ */
public function getName() public function getName()
{ {
return 'messages'; return $this->name;
} }
/** /**
@ -80,14 +117,15 @@ class MessagesCollector extends AbstractLogger implements DataCollectorInterface
*/ */
public function getWidgets() public function getWidgets()
{ {
$name = $this->getName();
return array( return array(
"messages" => array( "$name" => array(
"widget" => "PhpDebugBar.Widgets.MessagesWidget", "widget" => "PhpDebugBar.Widgets.MessagesWidget",
"map" => "messages.messages", "map" => "$name.messages",
"default" => "[]" "default" => "[]"
), ),
"messages:badge" => array( "$name:badge" => array(
"map" => "messages.count", "map" => "$name.count",
"default" => "null" "default" => "null"
) )
); );

View File

@ -174,7 +174,7 @@ div.phpdebugbar-widgets-messages {
font-size: 11px; font-size: 11px;
color: red; color: red;
} }
div.phpdebugbar-widgets-messages li.list-item a.backtrace, div.phpdebugbar-widgets-messages li.list-item span.collector,
div.phpdebugbar-widgets-messages li.list-item span.label { div.phpdebugbar-widgets-messages li.list-item span.label {
float: right; float: right;
font-size: 12px; font-size: 12px;
@ -183,6 +183,10 @@ div.phpdebugbar-widgets-messages {
margin: 0 2px; margin: 0 2px;
text-decoration: none; text-decoration: none;
} }
div.phpdebugbar-widgets-messages li.list-item span.collector {
color: #555;
font-style: italic;
}
div.phpdebugbar-widgets-messages div.toolbar { div.phpdebugbar-widgets-messages div.toolbar {
position: fixed; position: fixed;
bottom: 0; bottom: 0;

View File

@ -231,6 +231,9 @@ if (typeof(PhpDebugBar) == 'undefined') {
} }
$('<span class="label" />').text(value.label).appendTo(li); $('<span class="label" />').text(value.label).appendTo(li);
if (value.collector) {
$('<span class="collector" />').text(value.collector).appendTo(li);
}
}}); }});
this.$list.$el.appendTo(this.$el); this.$list.$el.appendTo(this.$el);