diff --git a/Model/Cache/InvalidateLogger.php b/Model/Cache/InvalidateLogger.php index a23c9a4..6b3e769 100644 --- a/Model/Cache/InvalidateLogger.php +++ b/Model/Cache/InvalidateLogger.php @@ -8,11 +8,74 @@ namespace Magento\CloudComponents\Model\Cache; +use Magento\Framework\App\Request\Http as HttpRequest; +use Psr\Log\LoggerInterface as Logger; +use Magento\CloudComponents\Model\DebugTrace; + /** * Log cache invalidation to a file */ class InvalidateLogger extends \Magento\Framework\Cache\InvalidateLogger { + /** + * @var string[] + */ + private $tagsToLog = [ + 'cat_p', + 'cat_c', + 'PRODUCT_PRICE', + 'cms_b', + 'cms_p', + 'config_scopes', + 'eav', + 'eav_attribute', + 'fpc', + 'review_block', + 'SEARCH_QUERY', + 'search_query', + 'store_group', + 'store', + 'store_relations', + 'website', + 'CORE_DESIGN', + 'core_design', + 'WEBSERVICE', + 'webservice', + 'banner', + 'catalog_event', + 'config', + 'block_html', + 'COLLECTION_DATA', + 'collection_data', + 'collections', + 'layout_general_cache_tag', + 'layout', + 'compiled_config', + 'acl_cache', + 'reflection', + 'db_ddl', + 'all' + ]; + + /** + * @var DebugTrace + */ + private $debugTrace; + + /** + * @param HttpRequest $request + * @param Logger $logger + * @param DebugTrace $debugTrace + */ + public function __construct( + HttpRequest $request, + Logger $logger, + DebugTrace $debugTrace + ) { + parent::__construct($request, $logger); + $this->debugTrace = $debugTrace; + } + /** * Log cache invalidation to a file * @@ -20,15 +83,18 @@ class InvalidateLogger extends \Magento\Framework\Cache\InvalidateLogger */ public function execute($invalidateInfo) { - if (is_array($invalidateInfo)) { - $invalidateInfo['trace'] = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - } elseif (is_string($invalidateInfo)) { - $invalidateInfo = [ - 'main' => $invalidateInfo, - 'trace' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) - ]; - } + $needTrace = false; + if (is_array($invalidateInfo) && isset($invalidateInfo['tags'])) { + foreach ($invalidateInfo['tags'] as $tag) { + if (in_array(strtolower($tag), $this->tagsToLog)) { + $needTrace = true; + } + } + if ($needTrace) { + $invalidateInfo['trace'] = $this->debugTrace->getTrace(); + } + } parent::execute($invalidateInfo); } } diff --git a/Model/DebugTrace.php b/Model/DebugTrace.php new file mode 100644 index 0000000..043ae17 --- /dev/null +++ b/Model/DebugTrace.php @@ -0,0 +1,87 @@ + $line) { + if (!isset($line['function'], $line['class'], $line['file'])) { + continue; + } + if (in_array($line['function'], $this->notAllowedFunctions) + || in_array($line['class'], $this->notAllowedClasses) + || strpos($line['file'], 'Interceptor.php') !== false + ) { + unset($trace[$index]); + } + unset($trace[$index]['type']); + } + + if (function_exists('gzcompress')) { + return bin2hex( + gzcompress( + print_r( + $trace, + true + ) + ) + ); + } + return $trace; + } +} diff --git a/Model/Indexation/Logger.php b/Model/Indexation/Logger.php index e43f43a..a200c9b 100644 --- a/Model/Indexation/Logger.php +++ b/Model/Indexation/Logger.php @@ -8,6 +8,7 @@ namespace Magento\CloudComponents\Model\Indexation; +use Magento\CloudComponents\Model\DebugTrace; use Magento\Framework\Indexer\ActionInterface; use Psr\Log\LoggerInterface; @@ -21,12 +22,21 @@ class Logger */ private $logger; + /** + * @var DebugTrace + */ + private $debugTrace; + /** * @param LoggerInterface $logger + * @param DebugTrace $debugTrace */ - public function __construct(LoggerInterface $logger) - { + public function __construct( + LoggerInterface $logger, + DebugTrace $debugTrace + ) { $this->logger = $logger; + $this->debugTrace = $debugTrace; } /** @@ -39,7 +49,7 @@ public function afterExecuteFull(ActionInterface $subject) $this->logger->debug( 'full_indexation: ' . get_class($subject), [ - 'trace' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) + 'trace' => $this->debugTrace->getTrace() ] ); }