1

我在使用 log4php 记录“TypeError”时遇到问题。我怀疑这是因为我最近从 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 (\Throwable $ex)

这仍然会为我的异常打印堆栈跟踪信息,但是当捕获到“TypeError”时,不会将任何内容打印到日志文件中。

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

谢谢,

4

3 回答 3

2

我认为您应该使用$ex->getMessage()错误()方法,您的代码应该是

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

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

 catch (Exception $ex)
            {
                $this->logger->trace("ERROR CAUGHT", $ex);
            }
于 2017-06-05T07:58:06.467 回答
0

尝试解决此问题

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

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

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

于 2017-06-05T15:10:59.563 回答
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'));
于 2019-09-05T21:09:21.207 回答