webman中自定义进程会存在偶尔不记录日志问题

Tinywan

使用自定义进程

use support\Log;
Log::debug(' [x] 观众在线人数统计 ');

以上日志会存在偶尔不记录日志问题

1051 2 0
2个回答

walkor

打印下看下执行到Log::debug没。monolog应该不会有这么明显的bug

  • Tinywan 2022-01-01

    Log::debug 后面的数据都插入成功了

chaz6chez

monolog\src\Monolog\Handler\StreamHandler.php的第158行

$stream = $this->stream;
        if (!is_resource($stream)) {
            throw new \LogicException('No stream was opened yet');
        }

        if ($this->useLocking) {
            // ignoring errors here, there's not much we can do about them
            flock($stream, LOCK_EX);
        }

        $this->streamWrite($stream, $record);

        if ($this->useLocking) {
            flock($stream, LOCK_UN);
        }

// ignoring errors here, there's not much we can do about them

我猜有可能是因为互斥了

  • Tinywan 2022-01-03

    多数是记录的,但是100次会有3次左右不会记录日志的问题

  • chaz6chez 2022-01-03

    这个情况我觉得有可能是互斥问题,因为文件加锁了,也是很少的情况下会有不记录的情况产生,你可以把你的进程数或者并发写入文件的地方处理一下,缩小范围排查一下,我觉得应该是这个问题

  • Tinywan 2022-01-03

    好的,这个明天我试试。这个会不会和我使用 tail -f webman.log 实时查看日志有关系

  • chaz6chez 2022-01-03

    你如果用tail -f来进行观察的话,不一定准确,tail -f如果文件改变了,他就会去查看文件内容;你不如用最原始的方法,就是在一定时间内写入固定条数,最后在检查条数是否符合预期

  • Tinywan 2022-01-03

    上面的问题已经在生产环境了。一定时间内写入固定的条数是没问题的。就是这个几率是很低了,出现问题也是跟踪了几天。发现这个问题才来这里提问的。下来我不实时查看是否会有这个问题。看看tail -f 会不会出发 $this->useLocking这个条件

  • chaz6chez 2022-01-04

    我这里推荐,可以依据StreamHandler重写一个,实现HandlerInterface就好了,在遇到互斥的问题的时候,可以阻塞,或者用其他方法解决

  • Tinywan 2022-01-04

    这个暂时没时间搞着,后面有时间可以写个看看哈!

  • Tinywan 2022-01-04

    跟踪第一天:只要使用 tail -f查看日志就不会记录,甚至关闭一会后面的都不记录

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