使用堆栈跟踪记录捕获的异常

时间:2013-03-06 10:46:23

标签: php exception logging

如果我没有在PHP中捕获异常,我会在带有堆栈跟踪的error.log文件中收到有用的错误消息。例如,如果我运行:

<?php

  function foo() {
    throw new Exception('Oh no!');
  } 

  foo();

?>

然后我把这写到我的日志中:

  

[Wed Mar 06 10:35:32 2013] [错误] [客户端86.146.145.175] PHP致命   错误:未捕获的异常'异常',消息'哦不!'在   /var/www/test.php:4\nStack trace:\ n#0 /var/www/test.php(7):   第4行/var/www/test.php中抛出的foo()\ n#1 {main} \ n

有时我想捕获异常,但仍记录该细节。我想象的是:

<?php

  function foo() {
    throw new Exception('Oh no!');
  } 

  try {
      foo();
  } catch (Exception $e) {
      log_exception($e);
  }

?>

其中log_exception将写入错误日志的内容基本上与为未捕获的异常自动编写的内容相同 - 除了Caught exception而不是PHP Fatal error: Uncaught exception之外,可能完全相同。< / p>

是否有内置函数来记录这样的异常信息,或将其捕获为字符串?我在想象Python中的traceback.format_exc()类似的东西。

4 个答案:

答案 0 :(得分:57)

error_log($e);

做你想要的。如果您没有捕获异常,它会记录与记录完全相同的内容,减去单词&#39; Uncaught&#39;在开始。这样做是因为Exception class's __toString() magic method返回的是什么。

您可以在catch块中执行此操作:

try {
    foo();
} catch (Exception $e) {
    error_log("Caught $e");
}

或者在异常处理程序中:

set_exception_handler(function($exception) {
    error_log($exception);
    error_page("Something went wrong!");
});

答案 1 :(得分:6)

您可以使用PHP's base Exception class中的方法。

使用getMessage获取消息Oh no!并使用getTraceAsString获取格式化的跟踪。

答案 2 :(得分:4)

我们使用Monolog在我们的应用程序中进行日志记录。 Monolog有一个可以打印堆栈跟踪的格式化程序。要使用跟踪记录异常,我们使用LineFormatter并在其上调用includeStacktraces()。 (以下代码)

$handler = new \Monolog\Handler\StreamHandler(STDOUT);

$lineFormatter = new \Monolog\Formatter\LineFormatter();
$lineFormatter->includeStacktraces();

$handler->setFormatter($lineFormatter);

$logger = new \Monolog\Logger('root', [$handler]);

try {
    //do some throwing
} catch (Exception $e) {
    //do some logging, add exception to context
    $logger->error($e->getMessage(), ['exception' => $e]);
}

答案 3 :(得分:-2)

您可以使用http://php.net/manual/en/function.set-exception-handler.php注册一个回调函数,该函数将从$ e-&gt; getMessage()获取消息;并将其转储到文件中。