PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.8
Booking for Appointments and Events Calendar – Amelia v2.4.8
2.4.9 2.4.8 2.4.7 2.4.6 2.4.5 2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / src / Infrastructure / Services / Logger / MonologLoggerFactory.php
ameliabooking / src / Infrastructure / Services / Logger Last commit date
JsonLineFormatter.php 6 days ago LogDirectoryManager.php 6 days ago LogRetentionCleanupService.php 6 days ago LogSanitizer.php 6 days ago MonologChannelLogger.php 6 days ago MonologLoggerFactory.php 6 days ago RequestIdProcessor.php 6 days ago
MonologLoggerFactory.php
123 lines
1 <?php
2
3 namespace AmeliaBooking\Infrastructure\Services\Logger;
4
5 use AmeliaBooking\Domain\Services\Settings\SettingsService;
6 use AmeliaVendor\Monolog\Formatter\LineFormatter;
7 use AmeliaVendor\Monolog\Handler\NullHandler;
8 use AmeliaVendor\Monolog\Handler\RotatingFileHandler;
9 use AmeliaVendor\Monolog\Handler\StreamHandler;
10 use AmeliaVendor\Monolog\Handler\WhatFailureGroupHandler;
11 use AmeliaVendor\Monolog\Logger;
12 use AmeliaVendor\Psr\Log\LoggerInterface as Psr3LoggerInterface;
13
14 /**
15 * Class MonologLoggerFactory
16 *
17 * Builds (and caches, per channel) the Monolog stack: daily-rotating JSON file handler,
18 * request-id + sanitizer processors, optional WP_DEBUG_LOG mirror for ERROR+.
19 *
20 * @package AmeliaBooking\Infrastructure\Services\Logger
21 */
22 class MonologLoggerFactory
23 {
24 private const DEFAULT_MIN_LEVEL = 'debug';
25
26 /** @var array<string, Psr3LoggerInterface> */
27 private array $loggers = [];
28
29 private SettingsService $settingsService;
30
31 public function __construct(SettingsService $settingsService)
32 {
33 $this->settingsService = $settingsService;
34 }
35
36 public function getLogger(string $channel): Psr3LoggerInterface
37 {
38 if (isset($this->loggers[$channel])) {
39 return $this->loggers[$channel];
40 }
41
42 $logger = new Logger($channel);
43
44 if (!$this->isEnabled()) {
45 $logger->pushHandler(new NullHandler());
46
47 return $this->loggers[$channel] = $logger;
48 }
49
50 $logger->pushProcessor(new RequestIdProcessor());
51 $logger->pushProcessor(new LogSanitizer());
52
53 $directory = LogDirectoryManager::ensureDirectory();
54 $fileHandler = new RotatingFileHandler(
55 $directory . '/' . LogDirectoryManager::getLogBasename($channel),
56 0,
57 $this->resolveMinLevel(),
58 true,
59 null,
60 true
61 );
62 $fileHandler->setFormatter(new JsonLineFormatter());
63 $logger->pushHandler(new WhatFailureGroupHandler([$fileHandler]));
64
65 $debugLogHandler = $this->createDebugLogHandler();
66
67 if ($debugLogHandler !== null) {
68 $logger->pushHandler($debugLogHandler);
69 }
70
71 return $this->loggers[$channel] = $logger;
72 }
73
74 /**
75 * Clear per-channel cache (tests / long-running workers).
76 */
77 public function reset(): void
78 {
79 $this->loggers = [];
80 }
81
82 private function isEnabled(): bool
83 {
84 return (bool) $this->settingsService->getSetting('logging', 'enabled', true);
85 }
86
87 private function resolveMinLevel(): int
88 {
89 $configured = $this->settingsService->getSetting('logging', 'minLevel', self::DEFAULT_MIN_LEVEL);
90 $levelName = is_string($configured) && $configured !== ''
91 ? strtolower($configured)
92 : self::DEFAULT_MIN_LEVEL;
93
94 try {
95 return Logger::toMonologLevel($levelName);
96 } catch (\Throwable $e) {
97 return Logger::ERROR;
98 }
99 }
100
101 private function createDebugLogHandler(): ?StreamHandler
102 {
103 $debugLogEnabled = defined('WP_DEBUG_LOG') && WP_DEBUG_LOG;
104
105 if (!$debugLogEnabled) {
106 return null;
107 }
108
109 $path = is_string(WP_DEBUG_LOG)
110 ? WP_DEBUG_LOG
111 : (defined('WP_CONTENT_DIR') ? WP_CONTENT_DIR . '/debug.log' : null);
112
113 if ($path === null) {
114 return null;
115 }
116
117 $handler = new StreamHandler($path, Logger::ERROR);
118 $handler->setFormatter(new LineFormatter(null, null, true, true));
119
120 return $handler;
121 }
122 }
123