From a576d85d74294dcc11fb789af88e9ddd60e817bd Mon Sep 17 00:00:00 2001 From: Sebastian Krupinski Date: Fri, 20 Feb 2026 16:22:57 -0500 Subject: [PATCH] improve loggers Signed-off-by: Sebastian Krupinski --- core/lib/Application.php | 10 +++++ core/lib/Logger/FileLogger.php | 2 +- core/lib/Logger/PlainFileLogger.php | 62 +++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 core/lib/Logger/PlainFileLogger.php diff --git a/core/lib/Application.php b/core/lib/Application.php index ef48cc3..b280928 100644 --- a/core/lib/Application.php +++ b/core/lib/Application.php @@ -105,6 +105,16 @@ class Application return $this->rootDir . '/modules'; } + public function varDir(): string + { + return $this->rootDir . '/var'; + } + + public function logDir(): string + { + return $this->varDir() . '/logs'; + } + /** * Get configuration value */ diff --git a/core/lib/Logger/FileLogger.php b/core/lib/Logger/FileLogger.php index b3d2988..4662079 100644 --- a/core/lib/Logger/FileLogger.php +++ b/core/lib/Logger/FileLogger.php @@ -26,7 +26,7 @@ class FileLogger implements LoggerInterface if (!is_dir($logDir)) { @mkdir($logDir, 0775, true); } - $this->logFile = rtrim($logDir, '/').'/'.$channel.'.log'; + $this->logFile = rtrim($logDir, '/').'/'.$channel.'.jsonl'; } public function emergency($message, array $context = []): void { $this->log(LogLevel::EMERGENCY, $message, $context); } diff --git a/core/lib/Logger/PlainFileLogger.php b/core/lib/Logger/PlainFileLogger.php new file mode 100644 index 0000000..89b5bce --- /dev/null +++ b/core/lib/Logger/PlainFileLogger.php @@ -0,0 +1,62 @@ +logFile = rtrim($logDir, '/') . '/' . $channel . '.log'; + } + + public function emergency($message, array $context = []): void { $this->log('emergency', $message, $context); } + public function alert($message, array $context = []): void { $this->log('alert', $message, $context); } + public function critical($message, array $context = []): void { $this->log('critical', $message, $context); } + public function error($message, array $context = []): void { $this->log('error', $message, $context); } + public function warning($message, array $context = []): void { $this->log('warning', $message, $context); } + public function notice($message, array $context = []): void { $this->log('notice', $message, $context); } + public function info($message, array $context = []): void { $this->log('info', $message, $context); } + public function debug($message, array $context = []): void { $this->log('debug', $message, $context); } + + public function log($level, $message, array $context = []): void + { + $dt = \DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', microtime(true))); + $timestamp = $dt?->format('Y-m-d H:i:s.u') ?? date('Y-m-d H:i:s'); + + $line = $timestamp . ' ' . $this->interpolate((string) $message, $context) . PHP_EOL; + + @file_put_contents($this->logFile, $line, FILE_APPEND | LOCK_EX); + } + + private function interpolate(string $message, array $context): string + { + if (!str_contains($message, '{')) { + return $message; + } + $replace = []; + foreach ($context as $key => $val) { + if (is_array($val) || (is_object($val) && !method_exists($val, '__toString'))) { + continue; + } + $replace['{' . $key . '}'] = (string) $val; + } + return strtr($message, $replace); + } +}