diff --git a/src/Util/Logger/FriendicaProcessor.php b/src/Util/Logger/FriendicaProcessor.php new file mode 100644 index 0000000000..5b2487d8b2 --- /dev/null +++ b/src/Util/Logger/FriendicaProcessor.php @@ -0,0 +1,84 @@ +level = Logger::toMonologLevel($level); + $this->skipStackFramesCount = $skipStackFramesCount; + } + + public function __invoke(array $record) + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + + // 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 ($this->isSkippedFunction($trace, $i)) { + if (in_array($trace[$i]['function'], $this->skipFunctions)) { + $i++; + + continue; + } + + break; + } + + $i += $this->skipStackFramesCount; + + // we should have the call source now + $record['extra'] = array_merge( + $record['extra'], + [ + 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, + 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, + 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, + ] + ); + + return $record; + } + + private function isSkippedFunction(array $trace, $index) + { + if (!isset($trace[$index])) { + return false; + } + + return in_array($trace[$index]['function'], $this->skipFunctions); + } +} diff --git a/src/Util/LoggerFactory.php b/src/Util/LoggerFactory.php index 1e7bdcd160..88b6fe8c81 100644 --- a/src/Util/LoggerFactory.php +++ b/src/Util/LoggerFactory.php @@ -4,6 +4,7 @@ namespace Friendica\Util; use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Util\Logger\FriendicaDevelopHandler; +use Friendica\Util\Logger\FriendicaProcessor; use Monolog; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; @@ -27,9 +28,7 @@ class LoggerFactory $logger = new Monolog\Logger($channel); $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor()); $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor()); - - // Add more information in case of a warning and more - $logger->pushProcessor(new Monolog\Processor\IntrospectionProcessor(LogLevel::WARNING, [], 1)); + $logger->pushProcessor(new FriendicaProcessor(LogLevel::DEBUG, 1)); return $logger; } @@ -52,8 +51,8 @@ class LoggerFactory $logger = new Monolog\Logger($channel); $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor()); $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor()); + $logger->pushProcessor(new FriendicaProcessor(LogLevel::DEBUG, 1)); - $logger->pushProcessor(new Monolog\Processor\IntrospectionProcessor(Loglevel::DEBUG, [], 1)); $logger->pushHandler(new FriendicaDevelopHandler($developerIp));