JezK
Edit File: SimpleLoggerFactory.php
<?php declare (strict_types=1); namespace FcfVendor\WPDesk\Logger; use FcfVendor\Monolog\Handler\FingersCrossedHandler; use FcfVendor\Monolog\Handler\HandlerInterface; use FcfVendor\Monolog\Logger; use FcfVendor\Monolog\Handler\ErrorLogHandler; use FcfVendor\Monolog\Processor\PsrLogMessageProcessor; use FcfVendor\Monolog\Processor\UidProcessor; use FcfVendor\Psr\Log\LogLevel; use FcfVendor\WPDesk\Logger\WC\WooCommerceHandler; final class SimpleLoggerFactory implements LoggerFactory { /** * @var array{ * level?: string, * action_level?: string|null, * } */ private $options; /** @var string */ private $channel; /** @var Logger */ private $logger; /** * Valid options are: * * level (default debug): Default logging level * * action_level: If value is set, it will act as the minimum level at which logger will be triggered using FingersCrossedHandler {@see https://seldaek.github.io/monolog/doc/02-handlers-formatters-processors.html#wrappers--special-handlers} */ public function __construct(string $channel, $options = null) { $this->channel = $channel; $options = $options ?? new Settings(); if ($options instanceof Settings) { $options = $options->to_array(); } $this->options = array_merge(['level' => LogLevel::DEBUG, 'action_level' => null], $options); } public function getLogger($name = null): Logger { if ($this->logger) { return $this->logger; } $this->logger = new Logger($this->channel, [], [new PsrLogMessageProcessor(null, \true), new UidProcessor()], wp_timezone()); if (\function_exists('wc_get_logger') && \did_action('woocommerce_init')) { $this->set_wc_handler(); } else { \add_action('woocommerce_init', [$this, 'set_wc_handler']); } // In the worst-case scenario, when WC logs are not available (yet, or at all), // fallback to WP logs, but only when enabled. if (empty($this->logger->getHandlers()) && defined('WP_DEBUG_LOG') && \WP_DEBUG_LOG) { $this->set_handler($this->logger, new ErrorLogHandler(ErrorLogHandler::OPERATING_SYSTEM, $this->options['level'])); } return $this->logger; } /** * @internal */ public function set_wc_handler(): void { $this->set_handler($this->logger, new WooCommerceHandler(\wc_get_logger(), $this->channel)); } private function set_handler(Logger $logger, HandlerInterface $handler): void { if (is_string($this->options['action_level'])) { $handler = new FingersCrossedHandler($handler, $this->options['action_level']); } // Purposefully replace all existing handlers. $logger->setHandlers([$handler]); } }