From f93d6f0837c93f32b2bde36dd7062cb72988cb0b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 4 Jul 2011 21:32:33 +0200 Subject: [PATCH] Added IntrospectionProcessor: Adds the line/file/class/method from which the log call originated --- README.mdown | 1 + .../Processor/IntrospectionProcessor.php | 52 +++++++++++++++ .../Processor/IntrospectionProcessorTest.php | 64 +++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 src/Monolog/Processor/IntrospectionProcessor.php create mode 100644 tests/Monolog/Processor/IntrospectionProcessorTest.php diff --git a/README.mdown b/README.mdown index 1867bd70..0b63370f 100644 --- a/README.mdown +++ b/README.mdown @@ -60,6 +60,7 @@ Formatters Processors ---------- +- _IntrospectionProcessor_: Adds the line/file/class/method from which the log call originated. - _WebProcessor_: Adds the current request URI, request method and client IP to a log record. About diff --git a/src/Monolog/Processor/IntrospectionProcessor.php b/src/Monolog/Processor/IntrospectionProcessor.php new file mode 100644 index 00000000..7d58cfac --- /dev/null +++ b/src/Monolog/Processor/IntrospectionProcessor.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects line/file:class/function where the log message came from + * + * @author Jordi Boggiano + */ +class IntrospectionProcessor +{ + /** + * @param array $record + * @return array + */ + public function __invoke(array $record) + { + $trace = debug_backtrace(); + + // skip first since it's always the current method + array_shift($trace); + // the call_user_func call is also skipped + array_shift($trace); + + $i = 0; + while (isset($trace[$i]['class']) && false !== strpos($trace[$i]['class'], 'Monolog\\')) { + $i++; + } + + // we should have the call source now + $record['extra'] = array_merge( + $record['extra'], + array( + 'file' => isset($trace[$i-1]['file']) ? $trace[$i-1]['file'] : null, + 'line' => isset($trace[$i-1]['line']) ? $trace[$i-1]['line'] : null, + 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, + 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, + ) + ); + + return $record; + } +} diff --git a/tests/Monolog/Processor/IntrospectionProcessorTest.php b/tests/Monolog/Processor/IntrospectionProcessorTest.php new file mode 100644 index 00000000..be78df84 --- /dev/null +++ b/tests/Monolog/Processor/IntrospectionProcessorTest.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\TestCase; +use Monolog\Handler\TestHandler; + +class IntrospectionProcessorTest extends TestCase +{ + public function getHandler() + { + $processor = new IntrospectionProcessor(); + $handler = new TestHandler(); + $handler->pushProcessor($processor); + return $handler; + } + + public function testProcessorFromClass() + { + $handler = $this->getHandler(); + $tester = new \Acme\Tester; + $tester->test($handler, $this->getRecord()); + list($record) = $handler->getRecords(); + $this->assertEquals(__FILE__, $record['extra']['file']); + $this->assertEquals(57, $record['extra']['line']); + $this->assertEquals('Acme\Tester', $record['extra']['class']); + $this->assertEquals('test', $record['extra']['function']); + } + + public function testProcessorFromFunc() + { + $handler = $this->getHandler(); + \Acme\tester($handler, $this->getRecord()); + list($record) = $handler->getRecords(); + $this->assertEquals(__FILE__, $record['extra']['file']); + $this->assertEquals(63, $record['extra']['line']); + $this->assertEquals(null, $record['extra']['class']); + $this->assertEquals('Acme\tester', $record['extra']['function']); + } +} + +namespace Acme; + +class Tester +{ + function test($handler, $record) + { + $handler->handle($record); + } +} + +function tester($handler, $record) +{ + $handler->handle($record); +} \ No newline at end of file