Laravel 4 Log::listen 混淆 for 循环

Laravel 4 Log::listen confuses a for loop

首先,对于复杂的标题,我很抱歉,但我找不到任何其他合适的标题来表示错误。

我正在为我的项目使用 Laravel 4。

我的 global.php 文件中有一个 Log::listen

Log::listen(function($level, $message, $context){
    switch($level){
        case 'info':
            Log::useFiles(storage_path().'/logs/laravel.info.log');
            break;

        case 'error':
            Log::useFiles(storage_path().'/logs/laravel.error.log');
            break;
    }
});

当我运行这段代码

for($i = 1; $i <= 5; $i++){
    Log::info($i);
}

它的输出是这样的

[2015-04-15 11:54:07] production.INFO: 1 [] []
[2015-04-15 11:54:07] production.INFO: 2 [] []
[2015-04-15 11:54:07] production.INFO: 2 [] []
[2015-04-15 11:54:07] production.INFO: 3 [] []
[2015-04-15 11:54:07] production.INFO: 3 [] []
[2015-04-15 11:54:07] production.INFO: 3 [] []
[2015-04-15 11:54:07] production.INFO: 4 [] []
[2015-04-15 11:54:07] production.INFO: 4 [] []
[2015-04-15 11:54:07] production.INFO: 4 [] []
[2015-04-15 11:54:07] production.INFO: 4 [] []
[2015-04-15 11:54:07] production.INFO: 5 [] []
[2015-04-15 11:54:07] production.INFO: 5 [] []
[2015-04-15 11:54:07] production.INFO: 5 [] []
[2015-04-15 11:54:07] production.INFO: 5 [] []
[2015-04-15 11:54:07] production.INFO: 5 [] []

我发现当我删除 Log::listen 并简单地添加 Log::useFiles(storage_path().'/logs/laravel.log'); 时,问题就解决了。

但是我必须使用侦听器和 for 循环。

感谢任何帮助。

提前谢谢你。

问题是每次 Log::userFiles() 调用都会向堆栈添加一个新的处理程序。如果您有 2、3、4 个处理程序,则相同的消息将被写入 2、3、4 次。

我不确定这是否是一个好方法,但它应该有效:
(实际上我几乎可以肯定必须有更好的方法,但我无法立即找到它)

Log::listen(function($level, $message, $context){
    $monolog = Log::getMonolog();
    // clear all existing log handlers
    for($i=0; $i<count($monolog->getHandlers()); $i++){
        $monolog->popHandler();
    }
    Log::useFiles(storage_path().'/logs/laravel.' . $level . '.log');
});

如您所见,我还通过直接使用文件名中的关卡使 switch case 过时了。