PHP-日志捕获到的异常

如果我没有在PHP中捕获异常,则会在我的traceback.format_exc()文件中获得带有堆栈跟踪的有用错误消息。 例如,如果我运行:

<?php

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

  foo();

?>

然后将其写入日志:

[2013年3月6日星期三10:35:32] [错误] [客户端86.146.145.175] PHP致命 错误:未捕获的异常“ Exception”,消息为“哦,不!” 在 /var/www/test.php:4\n堆栈跟踪:\ n#0 /var/www/test.php(7): foo()\ n#1 {main} \ n在第4行的/var/www/test.php中抛出

有时我想捕捉异常,但仍然记录该细节。 我在想类似的东西:

<?php

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

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

?>

其中traceback.format_exc()将以与为未捕获的异常自动写入的格式基本相同的格式将某些内容写入错误日志-除了使用Caught exception而不是PHP Fatal error: Uncaught exception之外,在字面上可能完全相同。

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

Mark Amery asked 2020-08-12T04:45:51Z
4个解决方案
62 votes
error_log($e);

做你想要的。 如果您未捕获到异常,它将记录与记录的事件完全相同的内容,开头要减去“未捕获”一词。 这样做是因为这是catch类的__toString()魔术方法返回的内容。

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

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

或在异常处理程序中:

set_exception_handler(function($exception) {
    error_log($exception);
    error_page("Something went wrong!");
});
Jay K answered 2020-08-12T04:46:06Z
6 votes

您可以使用PHP基本getMessage类中的方法。

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

enricog answered 2020-08-12T04:46:32Z
4 votes

我们使用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]);
}
Eelke van den Bos answered 2020-08-12T04:46:53Z
-2 votes

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

varuog answered 2020-08-12T04:47:13Z
translate from https://stackoverflow.com:/questions/15245184/log-caught-exception-with-stack-trace