SeasX / SeasLog

An effective,fast,stable log extension for PHP.http://pecl.php.net/package/SeasLog http://php.net/SeasLog
http://seasx.github.io/SeasLog/
Other
1.2k stars 276 forks source link

模版使用 %F 会导致Swoole core dump #265

Open Feiir opened 5 years ago

Feiir commented 5 years ago

swoole4.4 php7.2 SeasLog2.x 不记录 %F 则正常

amuluowin commented 5 years ago

swoole4.3.1+php7.2.16+seaslog2.0.2没有出现coredump,能否多提供点信息,例如使用的框架,操作系统等 。

Feiir commented 5 years ago

Centos 7.3.1611, php 7.2.0 , Swoole 4.3.1-alpha, 框架的话没用其他框架,就自己搭的框架,才开始写呢,然后用同事的电脑也试了下,只要在 php.ini 里配置 seaslog 的模板选项上加上 %F 记录文件名:行号,然后在代码里随便抛出一个可以捕获的异常手动捕获就会直接导致 swoole core dump

hi-man commented 5 years ago

Centos 7.3.1611, php 7.2.0 , Swoole 4.3.1-alpha, 框架的话没用其他框架,就自己搭的框架,才开始写呢,然后用同事的电脑也试了下,只要在 php.ini 里配置 seaslog 的模板选项上加上 %F 记录文件名:行号,然后在代码里随便抛出一个可以捕获的异常手动捕获就会直接导致 swoole core dump


go(function() { 
    throw new \Exception('i am going down');
})
`
swoole 4.3.2-alpha
php 7.2.16
不能重现core dump

帮给个样例代码
Feiir commented 5 years ago

复现条件大概就是

  1. 需要开启 %F 记录文件行数 (必要)
  2. 新建类重新代理 seasLog 静态方法 (必要)
namespace Llt\Core;

use Llt;
use SeasLog;

class Log
{

    public static function init()
    {
        // 设置日志目录
        SeasLog::setBasePath(Llt::$storageLogPath);

    }

    // 代理seaslog的静态方法,如 Seaslog::debug
    public static function __callStatic($name, $arguments)
    {
        forward_static_call_array(['SeasLog', $name], $arguments);
    }

}
  1. \spl_autoload_register(); 注册自动加载函数
769344359 commented 4 years ago

现在还有这个问题吗

giantwu commented 4 years ago

Centos 7.3.1611, php 7.2.0 , Swoole 4.3.1-alpha, 框架的话没用其他框架,就自己搭的框架,才开始写呢,然后用同事的电脑也试了下,只要在 php.ini 里配置 seaslog 的模板选项上加上 %F 记录文件名:行号,然后在代码里随便抛出一个可以捕获的异常手动捕获就会直接导致 swoole core dump

go(function() { 
    throw new \Exception('i am going down');
})
`
swoole 4.3.2-alpha
php 7.2.16
不能重现core dump

帮给个样例代码

php: 7.2.25 ,seaslog:2.0.2

mix-php command 中定义一个简单的command,在该command中 写如下代码: $log = new \Seaslog(); $log->error(['1234r5t']); call_user_func_array([$log,'error'], ['123456']); return 111;

769344359 commented 4 years ago

@giantwu 你能用更加完整一点的代码码?

769344359 commented 4 years ago

@Feiir 我复现了代码

<?php
class Log
{
    // 代理seaslog的静态方法,如 Seaslog::debug
    public static function __callStatic($name, $arguments)
    {
        forward_static_call_array(['SeasLog', $name], $arguments);
    }

}
Log::error("aaa");
769344359 commented 4 years ago

获取字符串判空有点问题,而且貌似对这种动态代理的调用不支持

769344359 commented 4 years ago

https://github.com/SeasX/SeasLog/pull/284 提交了pr了

giantwu commented 4 years ago

已经回退到1.8.6了,完美解决。

769344359 commented 4 years ago

@giantwu 其他都没有变,只是回退版本吗? 编译安装的吗?

769344359 commented 4 years ago

@giantwu 你这个core dump 和我发现的core dump 不是同一个,我发现的是另外一个

giantwu commented 4 years ago

@giantwu 你这个core dump 和我发现的core dump 不是同一个,我发现的是另外一个

回退到1.8.6 版本以后 你的demo和我的使用方法都过了,没有问题了。是直接pecl安装的。其他都没做改变。

769344359 commented 4 years ago

@giantwu 用这个例子我试1.8.6一样会core dump,你确定设置了%F吗?

<?php
class Log
{
    // 代理seaslog的静态方法,如 Seaslog::debug
    public static function __callStatic($name, $arguments)
    {
        forward_static_call_array(['SeasLog', $name], $arguments);
    }

}
Log::error("aaa");
giantwu commented 4 years ago

@giantwu 用这个例子我试1.8.6一样会core dump,你确定设置了%F吗?

<?php
class Log
{
    // 代理seaslog的静态方法,如 Seaslog::debug
    public static function __callStatic($name, $arguments)
    {
        forward_static_call_array(['SeasLog', $name], $arguments);
    }

}
Log::error("aaa");

确定模版中包含了%F .我们线上就这么用的。1.8.6 ,没有问题。

seaslog.default_template => %T|%H|%P|%D|%R|%I|%F|%C|%L|%M => %T|%H|%P|%D|%R|%I|%F|%C|%L|%M

769344359 commented 4 years ago

@giantwu 我晚点再编译一次看看能不能复现