【问题标题】:Log caught exception with stack trace使用堆栈跟踪记录捕获的异常
【发布时间】:2013-02-21 02:47:26
【问题描述】:

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

<?php

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

  foo();

?>

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

[2013 年 3 月 6 日星期三 10:35:32] [错误] [客户端 86.146.145.175] PHP 致命 错误:未捕获的异常“异常”,带有消息“哦,不!”在 /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);
  }

?>

log_exception 将写入错误日志的格式与为未捕获的异常自动写入的格式基本相同——除了使用Caught exception 而不是PHP Fatal error: Uncaught exception 之外,可能实际上完全相同。

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

【问题讨论】:

    标签: php exception logging


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我们使用 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】:
        error_log($e);
        

        做你想做的事。它记录的内容与您未捕获异常时记录的内容完全相同,只是在开头减去“未捕获”一词。它这样做是因为这就是 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!");
        });
        

        【讨论】:

        • 对理解它很有帮助的答案。
        【解决方案4】:

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

        【讨论】:

        • 描述说这为未捕获的异常设置了一个处理程序,这正是我要问的情况。
        猜你喜欢
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 2011-03-29
        相关资源
        最近更新 更多