2013-04-04 17 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记录仪,适应模拟文件处理程序。因此,它满足接口

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

最后,写综合记录仪:

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

Wh!感谢这个详细的答案,我会仔细看看。但是,通过快速浏览我意识到,这是不允许写多个日志文件。o)我打算编写不同的日志文件,具有不同的内容。我想要一个“error.log”和一个“audit.log”文件,记录不同的事情。在我看来,我无法用Analog的静态实现来做到这一点。 – 2013-04-05 10:44:15

+0

@RobertG。我害怕,我不太清楚Analog能否说出来。 – Gordon 2013-04-05 11:30:45

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') 
))); 
相关问题