SeasLog icon indicating copy to clipboard operation
SeasLog copied to clipboard

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

Open Feiir opened this issue 5 years ago • 17 comments

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

Feiir avatar Mar 09 '19 16:03 Feiir

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

amuluowin avatar Mar 15 '19 04:03 amuluowin

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

Feiir avatar Mar 16 '19 07:03 Feiir

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

帮给个样例代码

hi-man avatar Mar 19 '19 12:03 hi-man

复现条件大概就是

  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(); 注册自动加载函数

Feiir avatar Mar 26 '19 02:03 Feiir

现在还有这个问题吗

769344359 avatar Dec 13 '19 01:12 769344359

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;

giantwu avatar Dec 16 '19 11:12 giantwu

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

769344359 avatar Dec 16 '19 14:12 769344359

@Feiir 我复现了代码

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

}
Log::error("aaa");

769344359 avatar Dec 16 '19 14:12 769344359

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

769344359 avatar Dec 16 '19 15:12 769344359

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

769344359 avatar Dec 16 '19 16:12 769344359

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

giantwu avatar Dec 17 '19 02:12 giantwu

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

769344359 avatar Dec 17 '19 04:12 769344359

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

769344359 avatar Dec 17 '19 14:12 769344359

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

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

giantwu avatar Dec 17 '19 16:12 giantwu

@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");

769344359 avatar Dec 19 '19 01:12 769344359

@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

giantwu avatar Jan 02 '20 02:01 giantwu

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

769344359 avatar Jan 02 '20 02:01 769344359