Как правильно организовать структуру фабрики логгера? Для логирования в проекте выбрал psr-3 совместимую библиотеку - Monolog (библиотека не имеет значения к вопросу). Пока логи планирую записывать в файлы. В дальнейшем, хотелось бы логи перенести в elasticsearch. Библиотека Monolog - достаточно много конфигурации имеет, чтобы каждый раз не конфигурировать, хотелось бы создать Фабрику, которая будет создавать логгер, сконфигурированный по умолчанию (но при этом иметь возможность изменить конфиг, т.е. иметь доступ к самому объекту логгера-monolog). Также, нужно, чтобы в будущем, я смог изменить конфиг логгера, чтобы записывать логи не в файл и в elastic. Как можно создать такую фабрику ? Хотелось бы увидеть пример.
Для создания фабрики логгера с помощью Monolog можно использовать следующий подход:
Создайте класс LoggerFactory, который будет отвечать за создание и конфигурацию логгера Monolog:<?php use Monolog\Logger; use Monolog\Handler\StreamHandler; class LoggerFactory { public static function createDefaultLogger($logFilePath) { $logger = new Logger('default'); $logger->pushHandler(new StreamHandler($logFilePath, Logger::DEBUG)); return $logger; } }Создайте класс LoggerConfigurator, который будет отвечать за изменение конфигурации логгера (например, изменение хендлера для записи логов в Elasticsearch):<?php use Monolog\Handler\ElasticsearchHandler; class LoggerConfigurator { public static function configureElasticsearchHandler(Logger $logger, $elasticsearchConfig) { $elasticHandler = new ElasticsearchHandler($elasticsearchConfig); $logger->pushHandler($elasticHandler); } }Используйте фабрику для создания логгера, сконфигурированного по умолчанию, и для изменения конфигурации (например, добавления ElasticsearchHandler):<?php $logFilePath = '/path/to/logfile.log'; $logger = LoggerFactory::createDefaultLogger($logFilePath); $elasticsearchConfig = ['hosts' => ['localhost:9200']]; LoggerConfigurator::configureElasticsearchHandler($logger, $elasticsearchConfig); // Теперь логгер сконфигурирован для записи логов как в файл, так и в Elasticsearch
Таким образом, вы создали фабрику LoggerFactory, которая позволяет создавать логгеры с различной конфигурацией, и класс LoggerConfigurator, который позволяет изменять конфигурацию уже созданного логгера. Это позволит вам легко добавлять и изменять хендлеры для записи логов в различные источники.
Для создания фабрики логгера с помощью Monolog можно использовать следующий подход:
Создайте класс LoggerFactory, который будет отвечать за создание и конфигурацию логгера Monolog:<?phpuse Monolog\Logger;
use Monolog\Handler\StreamHandler;
class LoggerFactory
{
public static function createDefaultLogger($logFilePath)
{
$logger = new Logger('default');
$logger->pushHandler(new StreamHandler($logFilePath, Logger::DEBUG));
return $logger;
}
}Создайте класс LoggerConfigurator, который будет отвечать за изменение конфигурации логгера (например, изменение хендлера для записи логов в Elasticsearch):<?php
use Monolog\Handler\ElasticsearchHandler;
class LoggerConfigurator
{
public static function configureElasticsearchHandler(Logger $logger, $elasticsearchConfig)
{
$elasticHandler = new ElasticsearchHandler($elasticsearchConfig);
$logger->pushHandler($elasticHandler);
}
}Используйте фабрику для создания логгера, сконфигурированного по умолчанию, и для изменения конфигурации (например, добавления ElasticsearchHandler):<?php
$logFilePath = '/path/to/logfile.log';
$logger = LoggerFactory::createDefaultLogger($logFilePath);
$elasticsearchConfig = ['hosts' => ['localhost:9200']];
LoggerConfigurator::configureElasticsearchHandler($logger, $elasticsearchConfig);
// Теперь логгер сконфигурирован для записи логов как в файл, так и в Elasticsearch
Таким образом, вы создали фабрику LoggerFactory, которая позволяет создавать логгеры с различной конфигурацией, и класс LoggerConfigurator, который позволяет изменять конфигурацию уже созданного логгера. Это позволит вам легко добавлять и изменять хендлеры для записи логов в различные источники.