improve loggers
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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); }
|
||||
|
||||
62
core/lib/Logger/PlainFileLogger.php
Normal file
62
core/lib/Logger/PlainFileLogger.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace KTXC\Logger;
|
||||
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
/**
|
||||
* Simple file-based PSR-3 logger that writes plain-text lines.
|
||||
*
|
||||
* Each entry is formatted as:
|
||||
* 2026-02-20 12:34:56.123456 message text
|
||||
*/
|
||||
class PlainFileLogger implements LoggerInterface
|
||||
{
|
||||
private string $logFile;
|
||||
|
||||
/**
|
||||
* @param string $logDir Directory where log files are written
|
||||
* @param string $channel Logical channel name (used in filename)
|
||||
*/
|
||||
public function __construct(string $logDir, string $channel = 'app')
|
||||
{
|
||||
if (!is_dir($logDir)) {
|
||||
@mkdir($logDir, 0775, true);
|
||||
}
|
||||
$this->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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user