Monolog 自动填充 RequestId / TraceId 请求链路追踪标识

字节旅人
• 阅读 4874

在记录业务日志时,我们经常需要为每一条日志都补充上类似 RequestId 类的唯一标识串,方便后期快速的将某请求的相关的日志流 聚合 查询出来。首先,RequestId 是要单例贯穿整个请求生命周期的,如果在整个请求处理过程中,包括不同的服务层、模块,我都需要将 RequestId 透传或作为参数显示的传入 logger中,那代码简直不要太美观。

Monolog 作为最为流行的 PHP 日志组件,如果可以实现为每一条日志自动填充 RequestId,那使用起来是非常舒服的。

MonologpushProcessor 方法可以方便我们实现这一需求,pushProcessor 中的 processor 会对你记录的每一条日志进行处理并返回。

在请求的初始阶段,为本次请求生成一个全局的 RequestId,我是放在 Request 对象上,不同框架获取请求会话的 Request 单例对象的方法可能不同,大家理解就好。或者你可以单独使用一个单例对象去维护 RequestId,只要保证对当前请求是单例模式(放在 DI Container 中最好)。

<?php

use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler::class;
use Monolog\Formatter\LineFormatter::class;

class Log
$logger = new Logger('default');

// 添加处理器
$rfHandler = new RotatingFileHandler(__DIR__ . '/app_default.log', Logger::DEBUG);

$format = "[%datetime%] %channel%.%level_name%: %extra% %message% %context%\n";
$dateFormat = 'Y-m-d H:i:s';
$lFormatter = new LineFormatter($format, $dateFormat, true);

$rfHandler->setFormatter($lFormatter)
$logger->pushHandler($rfHandler);

// 就是在这里做处理啦 $request->getRequestId 自己去实现
$logger->pushProcessor(function ($log) {
    /** @var Request $request */
    $request = \request();//webman的
    $log['extra']['request-id'] = $request->getRequestId();
    return $log;
});
<?php
// 现在你就可以用日志服务了
$logger->info('this is monolog example');
$logger->info('this is log will auto fill requestId');

记得把 RequestId 返回给前端,这样问题反馈就容易追踪请求链路了。

点赞
收藏
评论区
推荐文章
虾米大王 虾米大王
3年前
java代码092
code092.jsp通过FindServlet类查询分页数据所有图书信息ID图书名称价格数量作者<%Listlist1(List)request.getAttribute("list");for(code089book:list1)%
虾米大王 虾米大王
3年前
java代码012
code012.jspInserttitlehere<%JSP内置对象1.request用于处理HTTP请求中的各项参数。如,删除可以通过request对象的getParameter()方法获取如,request.getParameter("id")在请求转发时,需要把一些数据传递到转发后的页面处理。就需要用到request的se
虾米大王 虾米大王
3年前
java代码008
code008.jsp请求转发标识<%通过jsp:forward动作标识可以将请求转发到其他的web资源,如JSP页面、html页面、servlet等。执行请求转发后,当前页面将不再被执行,而是去执行该标识指定的目标页面。jsp:forwardpage"url"举例新建一个index.jsp文件,内容如下,就放置一个转发标识
虾米大王 虾米大王
3年前
java代码099
code099.jspInserttitlehere$pageScope.user.name
虾米大王 虾米大王
3年前
java代码013
code013.jsprequest对象获取请求参数处理页
虾米大王 虾米大王
3年前
java代码009
code009.jsp传递参数标识
Stella981 Stella981
4年前
Dubbo + Zipkin + Brave实现全链路追踪
DubboZipkinBrave实现全链路追踪最近写了一个链路追踪Demo分享下,实现了链路追踪过程中数据的记录,还有能扩展的地方,后期再继续补充。原理参考上面文章《Dubbo链路追踪——生成全局ID(traceId)》(https://my.oschina.net/Luc
Stella981 Stella981
4年前
Dubbo链路追踪——生成全局ID(traceId)
全局traceId关于链路追踪,在微服务的趋势下,一次调用的日志信息分布在不同的机器上或目录下,当需要看一条链路调用所有的日志信息时,这是个比较困难的地方,我们虽然有ELK,Sentry等日志异常收集分析工具,但是如何把信息串起来也是一个关键的问题。我们一般的做法是在系统调用开始时生成一个traceId,并且它伴随着一
Stella981 Stella981
4年前
PowerDesigner列名、注释内容互换
在用PowerDesigner时,常常在NAME或Comment中写中文在Code中写英文,Name只会显示给我们看,Code会使用在代码中,但Comment中的文字会保存到数据库TABLE的Description中,有时候我们写好了Name再写一次Comment很麻烦,以下两段代码就可以解决这个问题。在PowerDesigner中PowerDesig
技术分享-日志链路追踪
1.背景简述在技术运维过程中,很难从某服务庞杂的日志中,单独找寻出某次API调用的全部日志。为提高排查问题的效率,在多个系统及应用内根据统一的TraceId查找同一次请求链路上的日志,根据日志快速定位问题,同时需对业务代码无侵入,特别是在高频请求下,也可以
五、飞鹅官网API接口文档
接口列表1.获取网站信息请求方法:GET请求URL:/api/site/getSiteInfo请求参数无返回结果json"code":1,"data":"id":1,//id"title":"SampleSiteName",//网站名称"intro":"T