Laravel 5>使用monolog自省处理器

时间:2015-06-29 18:03:15

标签: php laravel logging laravel-5 monolog

我已将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是多么安全,因为它会触发日志事件(不发射该事件是否安全?)。

3 个答案:

答案 0 :(得分:3)

(仅在Laravel 4.2中尝试过!)

将Introspection处理器推送到Monolog时,可以在IntrospectionProcessor构造函数中将skipClassesPartial数组作为第二个参数。使用此数组,可以跳过Laravel Illuminate类,并且记录器记录调用log方法的类。

$log->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, array('Illuminate\\')));

另见:https://github.com/Seldaek/monolog/blob/master/src/Monolog/Processor/IntrospectionProcessor.php

答案 1 :(得分:2)

这实际上是预期的功能,除非您让处理程序直接处理日志(请查看IntrospectionProcessor.php顶部的注释)。我的猜测是你在记录器周围有一个包装函数,你从Writer.php调用它 - 但是

如果你看一下IntrospectionProcessor.php的代码,你会看到第81到87行的一些代码决定了如何格式化堆栈跟踪,它仍然可以访问堆栈。如果你将$ trace [$ i - 1] / $ trace [$ i]的$ i值分别上升一个(也就是$ trace [$ i] / $ trace [$ i + 1]),你就可以'攀登'堆叠回你想要的地方。

重要的是要注意,跟踪的“类”和“函数”部分需要比“文件”和“行”更高的堆栈级别。

在个人(plz dont mod me bruhs)上注意,我希望在投入登录时看到包含堆栈偏移的功能。我知道如果在我写入时出现错误,我想要责备什么功能error_log('ut oh')但是当'ut oh'来的时候我可能会忘记它。

答案 2 :(得分:0)

我知道这是一个古老的问题,但是我想快速更新一下,因为现在很容易完成此操作。

我还没有尝试过使用Laravel,但是我自己的日志记录机制位于OpenThemeData()包装类中。因此,自省只提供有关服务的详细信息,而不是调用方。

在阅读了Matt Topolski的答案之后,我看了LoggingService。构造函数如下:

IntrospectionProcessor.php

我要做的就是添加这样的处理器:

__construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0)