log4php + PHP 7 - 捕获和记录Throwable

时间:2017-06-05 07:51:27

标签: php exception php-7 php-7.1 log4php

我无法记录" TypeError"用log4php。我怀疑这是因为我最近从PHP 5.5升级到7.1。

通常,我的语法如下所示:

<?

use Logger;

class MyClass
{
    /** @var Logger */
    private $logger;

    function __construct(array $configParams)
    {
        Logger::configure('logger.xml');
        $this->logger = Logger::getLogger(__CLASS__);
    }

    public function dostuff()
    {
        try
        {
            // ...
        }
        catch (Exception $ex)
        {
            $this->logger->error("ERROR CAUGHT", $ex);
        }
    }
}

?>

上述语法将向日志文件中打印大量信息,包括堆栈跟踪。但是在阅读了最新的php7文档之后,我相信我的意思是处理\ Throwable接口,以便捕获错误和异常(这很棒)。所以我用以下内容替换上面的catch:

catch (\Throwable $ex)

这仍会打印异常的堆栈跟踪信息,但是当出现&#34; TypeError&#34;被捕获,没有任何内容打印到日志文件。

我认为这是由于log4php不知道如何记录错误。如何以通用方式使用log4php记录错误?

谢谢,

3 个答案:

答案 0 :(得分:1)

我认为你应该使用$ex->getMessage()代码应该是

的error()方法
 catch (Exception $ex)
        {
            $this->logger->error("ERROR CAUGHT", $ex->getMessage());
        }

对于记录跟踪,您应该使用跟踪

 catch (Exception $ex)
            {
                $this->logger->trace("ERROR CAUGHT", $ex);
            }

答案 1 :(得分:0)

尝试解决此问题

$this->logger->error("ERROR CAUGHT", $ex);

$this->logger->error("ERROR CAUGHT : " . $ex->getMessage()); 

log4php的文档说错误方法只有一个参数。

答案 2 :(得分:0)

花了我一段时间才能弄清楚为什么在引发异常时log4php未记录原始文件名和行号。事实证明,我的自定义exception_handler类仅记录异常消息(通过执行$exception->getMessage()),该异常消息不包含文件名也不包含行号。我要做的就是将以下信息连接起来:$exception->getFile()$exception->getLine()

public function exception_handler ($exception) {
        $logger = Logger9::create();
        $logger->info($exception->getMessage()." ".$exception->getFile()." ".$exception->getLine());
}

别忘了注册自定义处理程序:

@set_exception_handler(array($this, 'exception_handler'));