我正在开发我的第一个基于Symfony的WebApp项目.我已将Symfony配置为不仅将日志消息写入不同的日志文件,还将其作为电子邮件立即发送严重错误消息.这很好用.但是,我想在默认日志消息中添加一些其他信息,以便更容易找到实际的错误源.
示例:一个页面的Twig文件从.yml文件加载本地化文本.文本包含一个%about_link%
占位符,应该由关于页面的路径/ URL替换.我忘了这个替换,所以链接没有指向URL而是指向%about_link%
.这导致一个NotFoundHttpException
因为没有溃败%about_link%
可以找到...
没什么大不了.但要找到包含此错误的实际页面/控制器有点棘手.默认日志消息显示以下内容:
[2015-12-14 17:19:36] request.ERROR: Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\NotFoundHttpException: "No route found for "GET /%25about_link%25"" at /long/path/to/symfony/.../RouterListener.php line 176 []
所以RouterListener.php
当试图找到一条路线时,会抛出异常%about_link%
.好的,这并没有给我任何关于这个坏链接所在页面的提示.
当然,对坏路线的呼叫根本不必位于任何页面上.用户可能直接输入了错误的链接.Symfony必须存储/记住最后一页,以提供有关可能来源的任何提示.那么,是否可以包含这些信息呢?
另外,我想添加有关报告问题的主机的信息.我运行在WebApp的两个实例:www.my_web_app.xy
和betatest.my_web_app.xy
,这将是一个很大的帮助,如果如果它来自日志消息将显示www
或betatest
.
将此信息添加到我自己创建的日志消息中是没有问题的,但是如何将此信息添加到Symfony或第三方代码生成的消息中?我必须在它到达日志处理程序之前以某种方式拦截日志消息.这可能吗?
如果要向日志条目添加额外信息,可以使用处理器执行此操作.使用处理器,您可以在格式化程序解析之前修改记录数组.额外部分显示在日志条目的末尾.
requestStack = $requestStack; } public function processRecord(array $record) { $request = $this->requestStack->getCurrentRequest(); if ($request) { $record['extra']['host'] = $request->getHost(); $record['extra']['url'] = $request->getRequestUri(); // ... } return $record; } }
现在将其添加到您services.yml
的注册表中以获取所有日志条目:
app.monolog.processor.web: class: AppBundle\Monolog\WebProcessor arguments: ["@request_stack"] tags: - { name: monolog.processor, method: processRecord }
不要重新发明轮子!没有必要编写自己的WebProcessor,因为Monolog 已经拥有它.
您唯一需要做的就是将其添加到您的服务中并使用以下标记进行标记monolog.processor
:
# app/config/services.yml services: Monolog\Processor\WebProcessor: tags: ['monolog.processor']
Monolog有更多可以使用的内置处理器.我决定在我的应用程序中添加多个处理器:
# app/config/services/monolog.yml (I included services/*.yml in config.yml) services: _defaults: tags: ['monolog.processor'] Monolog\Processor\WebProcessor: ~ Monolog\Processor\GitProcessor: ~ Monolog\Processor\MemoryUsageProcessor: ~ Monolog\Processor\MemoryPeakUsageProcessor: ~ Monolog\Processor\IntrospectionProcessor: ~