sourcetip

스택 추적에서 로그가 예외를 발견했습니다.

fileupload 2023. 7. 27. 22:13
반응형

스택 추적에서 로그가 예외를 발견했습니다.

만약 내가 PHP에서 예외를 발견하지 못한다면, 나는 나의 컴퓨터에서 유용한 오류 메시지를 받습니다.error.log스택 추적이 있는 파일입니다.예를 들어, 다음을 실행합니다.

<?php

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

  foo();

?>

로그에 다음과 같이 기록됩니다.

[3월 06일 수요일 10:35:32 2013] [오류] [클라이언트 86.146.145.175] PHP 치명적 오류:/var/www/test에 'Oh no!' 메시지가 있는 'Exception'이(가) 발견되지 않았습니다.php:4\n스택 추적:\n#0 /var/www/test.foo(7): 4행의 /var/www/test.foo에서 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.

예외 정보를 이렇게 기록하거나 문자열로 캡처하는 기능이 내장되어 있습니까?비슷한 상상을 하고 있어요traceback.format_exc()파이썬으로

error_log($e);

당신이 원하는 것을 합니다.처음에 'Uncatched'라는 단어를 제외하고 예외를 감지하지 않았다면 기록되었을 것과 정확히 동일한 내용이 기록됩니다.이것은 클래스의 마법 방법이 반환하는 것이기 때문에 이렇게 합니다.

당신은 이것을 곧 할 수 있습니다.catch블록:

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

또는 예외 처리기에서:

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

당신은 PHP의 기본 클래스의 메소드를 사용할 수 있습니다.

사용하다getMessage메시지를 받다Oh no!및 사용getTraceAsString형식화된 추적을 가져옵니다.

우리는 애플리케이션에서 로깅을 위해 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]);
}

http://php.net/manual/en/function.set-exception-handler.php 사용하여 $e->getMessage()에서 메시지를 가져오는 콜백 함수를 등록하고 파일에 덤프할 수 있습니다.

언급URL : https://stackoverflow.com/questions/15245184/log-caught-exception-with-stack-trace

반응형