improve loggers

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-02-20 16:22:57 -05:00
parent c3241862ca
commit a576d85d74
3 changed files with 73 additions and 1 deletions

View File

@@ -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
*/

View File

@@ -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); }

View 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);
}
}