Laravel 5 > 使用独白内省处理器
Laravel 5 > Using monolog introspection processor
我已将 Laravel 5 配置为使用自定义日志记录配置(默认设置太简单了)。我添加了 monolog 的 IntrospectionProcessor 来记录日志调用的文件名和行号。
问题是所有行都得到相同的文件和行号:
[2015-06-29 17:31:46] local.DEBUG (/home/vagrant/project/vendor/laravel/framework/src/Illuminate/Log/Writer.php#201): Loading view... [192.168.10.1 - GET /loans/create]
有没有办法配置 IntrospectionProcessor 来打印实际行而不是外观行?
如果我这样做 Log::getMonolog()->info('Hello');
它会工作并打印正确的文件和行号......但我不知道避免调用 Writer.writeLog function 有多安全,因为它会触发日志事件(不触发该事件是否安全?)。
这实际上是预期的功能,除非您让处理程序直接处理日志(查看 IntrospectionProcessor.php 顶部的注释)。我的猜测是您在记录器周围有一个包装函数,并且您是从 Writer.php 调用它的——但是
如果您查看 IntrospectionProcessor.php 的代码,您会在第 81 到 87 行看到一些代码,这些代码决定如何格式化该堆栈跟踪,并且它仍然可以访问堆栈。如果你将 $trace[$i - 1] / $trace[$i] 的 $i 值提高一个(又名 $trace[$i]/$trace[$i + 1] 分别)你可以 'climb' 堆栈回到你想要的地方。
重要的是要注意跟踪的 'class' 和 'function' 部分需要比 'file' 和 'line.'[= 高一级堆栈10=]
关于个人(请不要 mod 我兄弟)注意,我希望看到在登录时包含堆栈偏移量的功能。我知道如果出现错误我想责怪哪个功能当我写 error_log('ut oh') 时突然出现,但我可能(会)在 'ut oh' 出现时忘记它。
(只在 Laravel 4.2 试过!)
将内省处理器推送到 Monolog 时,可以将 skipClassesPartial 数组作为内省处理器构造函数中的第二个参数。使用此数组,可以跳过 Laravel Illuminate classes 并且记录器记录 class 调用日志方法。
$log->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, array('Illuminate\')));
另见:https://github.com/Seldaek/monolog/blob/master/src/Monolog/Processor/IntrospectionProcessor.php
我知道这是一个老问题,但我想我会快速更新一下,因为现在很容易完成。
我还没有尝试使用 Laravel,但我自己的日志记录机制在 LoggingService
包装器 class 中。因此,内省仅提供有关服务而不是调用者的详细信息。
阅读 Matt Topolski 的回答后,我查看了 IntrospectionProcessor.php
。构造函数如下所示:
__construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0)
我所要做的就是像这样添加处理器:
log->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, array(), 1));
我已将 Laravel 5 配置为使用自定义日志记录配置(默认设置太简单了)。我添加了 monolog 的 IntrospectionProcessor 来记录日志调用的文件名和行号。
问题是所有行都得到相同的文件和行号:
[2015-06-29 17:31:46] local.DEBUG (/home/vagrant/project/vendor/laravel/framework/src/Illuminate/Log/Writer.php#201): Loading view... [192.168.10.1 - GET /loans/create]
有没有办法配置 IntrospectionProcessor 来打印实际行而不是外观行?
如果我这样做 Log::getMonolog()->info('Hello');
它会工作并打印正确的文件和行号......但我不知道避免调用 Writer.writeLog function 有多安全,因为它会触发日志事件(不触发该事件是否安全?)。
这实际上是预期的功能,除非您让处理程序直接处理日志(查看 IntrospectionProcessor.php 顶部的注释)。我的猜测是您在记录器周围有一个包装函数,并且您是从 Writer.php 调用它的——但是
如果您查看 IntrospectionProcessor.php 的代码,您会在第 81 到 87 行看到一些代码,这些代码决定如何格式化该堆栈跟踪,并且它仍然可以访问堆栈。如果你将 $trace[$i - 1] / $trace[$i] 的 $i 值提高一个(又名 $trace[$i]/$trace[$i + 1] 分别)你可以 'climb' 堆栈回到你想要的地方。
重要的是要注意跟踪的 'class' 和 'function' 部分需要比 'file' 和 'line.'[= 高一级堆栈10=]
关于个人(请不要 mod 我兄弟)注意,我希望看到在登录时包含堆栈偏移量的功能。我知道如果出现错误我想责怪哪个功能当我写 error_log('ut oh') 时突然出现,但我可能(会)在 'ut oh' 出现时忘记它。
(只在 Laravel 4.2 试过!)
将内省处理器推送到 Monolog 时,可以将 skipClassesPartial 数组作为内省处理器构造函数中的第二个参数。使用此数组,可以跳过 Laravel Illuminate classes 并且记录器记录 class 调用日志方法。
$log->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, array('Illuminate\')));
另见:https://github.com/Seldaek/monolog/blob/master/src/Monolog/Processor/IntrospectionProcessor.php
我知道这是一个老问题,但我想我会快速更新一下,因为现在很容易完成。
我还没有尝试使用 Laravel,但我自己的日志记录机制在 LoggingService
包装器 class 中。因此,内省仅提供有关服务而不是调用者的详细信息。
阅读 Matt Topolski 的回答后,我查看了 IntrospectionProcessor.php
。构造函数如下所示:
__construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0)
我所要做的就是像这样添加处理器:
log->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, array(), 1));