2013-04-04 2 views
2

Я ищу достойный, простой в использовании вспомогательный класс для ведения журнала.Можно ли использовать аналоговую библиотеку для создания нескольких файлов журнала?

Я обнаружил Analog и нашел, что это именно то, что мне нужно, несмотря на то, что он может использоваться только для одного файла журнала одновременно.

Я не прав?!

Знаете ли вы какой-то похожий (по размеру/функциональности) проект, который позволяет записывать несколько журналов? Может быть, есть Аналоговая ветка? Я уже посмотрел на log4php, KLogger и Monolog.

ответ

2

Судя по исходному коду на

вы должны быть в состоянии использовать несколько обработчиков файлов одновременно. Попробуйте что-то вдоль линий этого:

Analog::handler(Analog\Handler\Multi::init(array(
    Analog::ERROR => Analog\Handler\File::init('/path/to/logs/errors.log'), 
    Analog::WARNING => Analog\Handler\File::init('/path/to/logs/warnings.log'), 
    Analog::DEBUG => Analog\Handler\File::init('/path/to/logs/debug.log') 
))); 

Если вы не можете заставить его работать с Analog\Handler\Multi, вы можете написать свой собственный Composite Logger, адаптируя Analog хендлер. Чтобы сделать это, необходимо сначала создать интерфейс, определяющий, как вы хотите использовать Лесоруб в приложении:

interface Logger 
{ 
    const ERROR = 'error'; 
    const WARNING = 'warning'; 
    const DEBUG = 'debug'; 

    public function log($message, $level); 
} 

Затем создать адаптер для аналогового так, чтобы он удовлетворял интерфейс:

class AnalogAdapter implements Logger 
{ 
    private $adaptee; 

    public function __construct(Analog $analog) 
    { 
     $this->adaptee = $analog; 
    } 

    public function log($message, $level) 
    { 
     $adaptee = $this->adaptee; 
     $adaptee::log($message, $adaptee::$level); 
    } 
} 

Наконец, написать Композитный Logger:

class CompositeLogger implements Logger 
{ 
    private $loggers = array; 

    public function registerLogger(Logger $logger) 
    { 
     $this->loggers[] = $logger; 
    } 

    public function log($message, $level) 
    { 
     foreach ($this->loggers as $logger) 
     { 
      $logger->log($message, $level); 
     } 
    } 
} 

Затем вы создаете обработчик аналоговые файлов и зарегистрировать их Композит:

$logger = new CompositeLogger; 
$logger->registerLogger(
    new AnalogAdapter(
     Analog\Handler\File::init('/path/to/logs/errors.log') 
    ) 
); 

// … add more Loggers in the same way 

$logger->log('This is a warning', Logger::WARNING); 

Предупреждение затем будет записано всем зарегистрированным регистраторам.

+0

Whoo! Спасибо за этот подробный ответ, я поближе посмотрю на это. Но то, что я понимаю, быстро взглянув, то есть не позволяет писать mulitple logfiles eiter .. o) Я хотел написать разные файлы журналов с различным контентом. Я хотел бы иметь файл «error.log» и «audit.log», записывая разные вещи. Мне кажется, я не могу сделать это с помощью статической реализации Analog. –

+0

@RobertG. Я боюсь, я не знаю Analog достаточно хорошо, чтобы сказать. – Gordon

0

Да, он отлично работает. И вы можете создавать различные функции журнала для разных типов журналов.

EG. Это приведет к ошибкам электронной почты. Но пишите предупреждения в журнал.

Analog::handler(Analog\Handler\Multi::init(array(
    Analog::ERROR => Analog\Handler\Buffer::init (
    Analog\Handler\Mail::init (
     '[email protected]', 
     'Log messages', 
     '[email protected]' 
    ) 
) 
    ,Analog::WARNING => Analog\Handler\File::init(__DIR__.'/log/warning.log') 
    //Analog::DEBUG => Analog\Handler\File::init('/path/to/logs/debug.log') 
))); 
Смежные вопросы