84 lines
2.0 KiB
PHP
84 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace OpenTelemetry\SDK\Logs;
|
|
|
|
use Psr\Log\InvalidArgumentException;
|
|
use Psr\Log\LoggerInterface;
|
|
use Psr\Log\LoggerTrait;
|
|
use Psr\Log\LogLevel;
|
|
use ReflectionClass;
|
|
use Throwable;
|
|
|
|
class SimplePsrFileLogger implements LoggerInterface
|
|
{
|
|
use LoggerTrait;
|
|
|
|
private const DEFAULT_LOGGER_NAME = 'otel';
|
|
|
|
private static ?array $logLevels = null;
|
|
|
|
private string $filename;
|
|
|
|
private string $loggerName ;
|
|
|
|
/**
|
|
* @param string $filename
|
|
*/
|
|
public function __construct(string $filename, string $loggerName = self::DEFAULT_LOGGER_NAME)
|
|
{
|
|
$this->filename = $filename;
|
|
$this->loggerName = $loggerName;
|
|
}
|
|
|
|
/**
|
|
* @psalm-suppress MoreSpecificImplementedParamType
|
|
*/
|
|
public function log($level, $message, array $context = []): void
|
|
{
|
|
$level = strtolower($level);
|
|
|
|
if (!in_array($level, self::getLogLevels(), true)) {
|
|
throw new InvalidArgumentException(
|
|
sprintf('Invalid Log level: "%s"', $level)
|
|
);
|
|
}
|
|
|
|
file_put_contents($this->filename, $this->formatLog((string) $level, (string) $message, $context), FILE_APPEND);
|
|
}
|
|
|
|
/**
|
|
* @param string $level
|
|
* @param string $message
|
|
* @param array $context
|
|
* @return string
|
|
*/
|
|
private function formatLog(string $level, string $message, array $context = []): string
|
|
{
|
|
try {
|
|
$encodedContext = json_encode($context, JSON_THROW_ON_ERROR);
|
|
} catch (Throwable $t) {
|
|
$encodedContext = sprintf('(Could not encode context: %s)', $t->getMessage());
|
|
}
|
|
|
|
return sprintf(
|
|
'[%s] %s %s: %s %s%s',
|
|
date(DATE_RFC3339_EXTENDED),
|
|
$this->loggerName,
|
|
$level,
|
|
$message,
|
|
$encodedContext,
|
|
PHP_EOL
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
private static function getLogLevels(): array
|
|
{
|
|
return self::$logLevels ?? self::$logLevels = (new ReflectionClass(LogLevel::class))->getConstants();
|
|
}
|
|
}
|