如何对接口内的逻辑流程做日志记录(请求响应及数据库)

Caesar-Tang

希望对接口的逻辑流程做日志记录,控制器请求 -> 数据库操作 -> 控制器响应 等一块内容记录在一个文件中。

  1. 在 middleware 中,可记录控制的请求及响应,但在此处使用数据库监听,数据库语句会累计增加
  2. 在 bootstrap 中,可记录数据库语句,但无法知道它来源于哪个控制器

针对以上,该如何实现,大家有没有好的想法,谢教。

899 4 0
4个回答

2548a

有想法,不过我自己没试过.给个思路你去实现看看.

建一个静态类,在中间件开始 生成一个uuid,存到静态类里面去

在 bootstrap 里面
Db::listen(function(){
读取静态类uuid,有uuid就把sql写入静态类里去
})

在中间件响应那,读取静态类里面sql并且清掉uuid.

  • tanhongbin 2022-09-09

    我现在也在考虑这个问题呢,也是想着在中间件中处理这些,就是不好拿sql,数据好拿

evilk

老大不是专门写了一个webman日志插件吗?
去看看那个插件

Caesar-Tang

目前所实现的:
截图

  • tanhongbin 2022-09-09

    这个可以呀,兄弟是怎么实现的,按照群主的哪个搞得嘛?

  • Caesar-Tang 2022-09-09
    1. 使用全局中间件,在请求处理前,生成一个uuid,传参给控制器,如:$request->requestId = $uuid
    2. 在 bootstrap 的数据库监听中,通过 request 助手函数判断当前是否有 requestId 对象并且不为空,如:!empty(request()->requestId)
    3. 使用 Log 在中间件和监听处记录日志

    因为 数据库监听是针对所有数据库操作, 和 控制的逻辑按顺序处理响应 是不同的,所以在并发情况下,记录写入会存在问题,所以在每个记录处都显式的记录了uuid便于对应。但显然这个方案是无法使用的。

    我再去研究下。

  • 2548a 2022-09-09

    你所说的的并发无效是错误的,数据库监听是针对当前进程的数据库操作,而不是所有的数据库操作,所以,当并发时,当前进程监听的只能是当前进程执行的sql.然而webman是同步阻塞的,当前进程只能执行一个请求,我并没看到有哪里会导致无法使用.

  • Caesar-Tang 2022-09-09

    如下图

Caesar-Tang

写入问题,如下图:
截图

  • 2548a 2022-09-09

    我现在没空,晚上或者后天我会自己写一个测试看看的.

  • nitron 2022-09-09

    写入不是顺序的问题不大啊,requestId不就是为了做过滤的么

    cat abc.log | grep 'request-id'

    就可以看到单次请求的全过程

  • nitron 2022-09-09

    单个worker的写入是顺序的,但是各个worker之间不是顺序的,很正常

  • 2548a 2022-09-11

    我在自己项目本地加上去测过了,一秒内十几个请求,我没看到有一个sql 串了请求的.

  • nitron 2022-09-11

    要复现也简单,开2worker,一个worker内处理一个长耗时请求,一个worker处理多个短耗时请求,这样你就能看到了

年代过于久远,无法发表回答
🔝