0Pricing
PHP Academy · 강의

오류 로깅 및 모범 사례

파일에 오류를 기록하고 운영 환경의 오류 처리 패턴을 따릅니다.

오류 로깅 및 모범 사례은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

로그 기록이 중요한 이유

운영 환경에서는 사용자에게 오류를 표시할 수 없지만 문제가 발생한 시점은 알아야 합니다. 로그 기록은 오류 세부 정보를 파일이나 서비스에 저장하므로 나중에 조사할 수 있습니다.

error_log()

가장 간단한 로그 기록 함수로, PHP의 오류 로그에 메시지를 기록합니다:

<?php
error_log('User login failed for: ' . $email);
error_log('DB query took: ' . $duration . 'ms');

// Send to email (not recommended for high traffic)
error_log('Critical: server out of memory', 1, 'admin@example.com');

구조화된 로그 기록

더 쉽게 구문 분석하고 조회할 수 있도록 구조화된 데이터를 JSON으로 기록하세요:

<?php
function logEvent(string $level, string $message, array $context = []): void {
    $entry = array_merge([
        'ts'      => date('c'),
        'level'   => $level,
        'message' => $message,
    ], $context);

    error_log(json_encode($entry));
}

logEvent('ERROR', 'Payment failed', [
    'order_id' => 123,
    'amount'   => 99.99,
    'user_id'  => 45,
]);

로그 수준(PSR-3)

PSR-3는 표준 로그 수준을 정의합니다:

  • 긴급 — 시스템을 사용할 수 없음
  • 경보 — 조치를 취해야 함
  • 치명적 — 치명적인 상태
  • 오류 — 실행 중 오류
  • 경고 — 오류는 아니지만 예외적인 발생
  • 알림 — 정상적이지만 중요한 이벤트
  • 정보 — 정보 메시지
  • 디버그 — 상세한 디버깅 정보

Monolog 로거

Monolog는 PSR-3와 호환되는 표준 PHP 로그 기록 라이브러리입니다:

<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('app');
$log->pushHandler(new StreamHandler('/var/log/app.log', Logger::DEBUG));

$log->info('User logged in', ['user_id' => 42]);
$log->error('Payment failed', ['order' => 99, 'reason' => 'card_declined']);
$log->warning('Slow query', ['duration_ms' => 3200]);

운영 환경의 예외 처리

오류를 기록하고 안전한 응답을 반환하는 운영 환경용 예외 처리기:

<?php
set_exception_handler(function(\Throwable $e) {
    $id = uniqid('err_');
    error_log(json_encode([
        'error_id' => $id,
        'class'    => get_class($e),
        'message'  => $e->getMessage(),
        'file'     => $e->getFile(),
        'line'     => $e->getLine(),
        'trace'    => $e->getTraceAsString(),
    ]));
    http_response_code(500);
    echo json_encode(['error' => 'Server error', 'id' => $id]);
    exit(1);
});

로그 파일 순환

로그 파일은 계속 커지므로 Linux의 logrotate 또는 Monolog의 시간 기반 처리기로 순환시키세요:

<?php
use Monolog\Handler\RotatingFileHandler;

$handler = new RotatingFileHandler(
    '/var/log/app.log',
    30,              // keep 30 days
    Logger::DEBUG
);

// Creates dated files: app-2024-05-27.log
$log = new Logger('app');
$log->pushHandler($handler);

풍부한 컨텍스트의 로그 기록

더 쉽게 디버깅할 수 있도록 모든 로그 항목에 요청 컨텍스트를 포함하세요:

<?php
function getRequestContext(): array {
    return [
        'url'     => $_SERVER['REQUEST_URI'] ?? '',
        'method'  => $_SERVER['REQUEST_METHOD'] ?? '',
        'ip'      => $_SERVER['REMOTE_ADDR'] ?? '',
        'user_id' => $_SESSION['user_id'] ?? null,
    ];
}

// Add to every log call:
$log->error('Order failed', array_merge(
    getRequestContext(),
    ['order_id' => $orderId]
));

로그에 민감한 데이터 기록하지 않기

민감한 정보는 절대 기록하지 마세요:

  • 비밀번호와 토큰
  • 신용카드 번호
  • 개인정보(GDPR 준수)
  • 사용자에게 표시되는 응답의 전체 예외 호출 스택 추적 정보
<?php
// Bad:
error_log('Login attempt: ' . $email . ' / ' . $password);

// Good:
error_log('Login failed for user: ' . substr($email, 0, 3) . '***');

Sentry 및 외부 오류 추적

운영 환경에서는 Sentry 같은 오류 추적 서비스를 사용하여 오류를 한곳에 모으고 알림을 받으세요:

<?php
// After composer require sentry/sdk
\Sentry\init(['dsn' => getenv('SENTRY_DSN')]);

// Automatic capture of unhandled exceptions
// Manual capture:
try {
    processOrder();
} catch (\Throwable $e) {
    \Sentry\captureException($e);
    throw $e;
}

검사 기반 사전 조건

개발 중 프로그래밍 오류를 포착하려면 어설션을 사용하세요:

<?php
// assert() throws AssertionError when false (dev mode)
assert(is_int($userId), 'userId must be an integer');
assert($amount > 0, 'amount must be positive');

// Or throw explicitly:
if (!is_int($userId)) {
    throw new \InvalidArgumentException('userId must be int');
}

빠른 확인

PSR-3에 따르면 즉각적인 주의가 필요한 상황을 나타내는 로그 수준은 무엇입니까?

복습: 오류 기록

오류 기록 모범 사례:

  • 타임스탬프, 수준, 메시지, 컨텍스트를 포함한 구조화된 JSON 로그 기록 사용
  • PSR-3 로그 수준 준수
  • 운영 애플리케이션에서 Monolog 사용
  • 디스크가 가득 차는 것을 막기 위해 로그 순환
  • 비밀번호나 민감한 데이터를 절대 기록하지 않기
  • 실시간 오류 추적에는 Sentry 또는 유사한 도구 사용

자주 묻는 질문

“오류 로깅 및 모범 사례” 강의는 무료인가요?

네 — “오류 로깅 및 모범 사례” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“오류 로깅 및 모범 사례”에서 뭘 배우나요?

파일에 오류를 기록하고 운영 환경의 오류 처리 패턴을 따릅니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

PHP Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“오류 로깅 및 모범 사례” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. PHP 오류 유형 및 보고
  2. Try, Catch, Finally
  3. 사용자 정의 예외 만들기
  4. 오류 로깅 및 모범 사례
← PHP Academy(으)로 돌아가기