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 过时了。
首先,对于复杂的标题,我很抱歉,但我找不到任何其他合适的标题来表示错误。
我正在为我的项目使用 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 过时了。