오류 로깅 및 모범 사례
파일에 오류를 기록하고 운영 환경의 오류 처리 패턴을 따릅니다.
오류 로깅 및 모범 사례은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- PHP 오류 유형 및 보고
- Try, Catch, Finally
- 사용자 정의 예외 만들기
- 오류 로깅 및 모범 사례