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

Mar*_*ery 44 php logging exception

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

<?php

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

  foo();

?>
Run Code Online (Sandbox Code Playgroud)

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

[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):foo()\n#1 {main} \n在/ var/www /中抛出test.php在第4行

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

<?php

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

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

?>
Run Code Online (Sandbox Code Playgroud)

哪里log_exception会写在基本相同的格式错误日志的东西得到什么未被捕捉异常的自动写入-也许除了具有字面相同Caught exception的替代PHP Fatal error: Uncaught exception.

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

Jay*_*y K 63

error_log($e);
Run Code Online (Sandbox Code Playgroud)

做你想要的.如果没有捕获异常,它会记录与记录完全相同的内容,在开头减去"未捕获"一词.这样做是因为这就是Exception类的__toString()魔法返回的原因.

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

try {
    foo();
} catch (Exception $e) {
    error_log("Caught $e");
}
Run Code Online (Sandbox Code Playgroud)

或者在异常处理程序中:

set_exception_handler(function($exception) {
    error_log($exception);
    error_page("Something went wrong!");
});
Run Code Online (Sandbox Code Playgroud)


enr*_*cog 7

您可以使用PHP基Exception类中的方法.

使用getMessage得到的消息Oh no!,并使用getTraceAsString获得一个格式化的跟踪.


Eel*_*Bos 6

我们使用 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]);
}
Run Code Online (Sandbox Code Playgroud)