LEVEL 58 QUEST
서버 모니터링 & 로그 관리
PHP 에러 로그, 커스텀 로깅 시스템, 서버 상태 모니터링, 장애 알림까지 운영에 필수적인 모니터링 체계를 구축합니다.
PHP 에러 로그 설정 및 관리
php.ini 에러 로그 핵심 설정
운영 서버에서는 에러를 화면에 표시하지 않고, 로그 파일에만 기록해야 합니다. display_errors를 Off로, log_errors를 On으로 설정하여 보안과 디버깅을 동시에 확보합니다.
; php.ini - 운영 서버 에러 로그 설정
display_errors = Off
log_errors = On
error_log = /var/log/php/app_error.log
error_reporting = E_ALL
log_errors_max_len = 4096
// PHP 코드에서 런타임 에러 설정
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php/app_error.log');
// 커스텀 에러 핸들러 등록
set_error_handler(function($severity, $message, $file, $line) {
$logMsg = date('Y-m-d H:i:s') . " [$severity] $message in $file:$line";
error_log($logMsg);
return true;
});
// 예외 핸들러 등록
set_exception_handler(function($e) {
$logMsg = date('Y-m-d H:i:s') . " [EXCEPTION] "
. $e->getMessage()
. " in " . $e->getFile() . ":" . $e->getLine();
error_log($logMsg);
http_response_code(500);
echo json_encode(['error' => '서버 오류가 발생했습니다.']);
});
운영 서버 필수 규칙
절대 display_errors = On 상태로 운영하지 마세요. DB 비밀번호, 파일 경로 등 민감한 정보가 사용자에게 노출됩니다. 로그 파일은 웹에서 접근 불가능한 경로에 저장해야 합니다.
커스텀 로깅 시스템 구현
activity_logs 테이블 설계
PHP의 기본 에러 로그만으로는 부족합니다. 사용자 활동, API 호출, 결제 이벤트 등을 체계적으로 기록하는 커스텀 로깅 시스템을 DB 테이블로 구축합니다.
-- activity_logs 테이블 생성
CREATE TABLE activity_logs (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
level ENUM('DEBUG','INFO','WARNING','ERROR','CRITICAL') NOT NULL,
category VARCHAR(50) NOT NULL DEFAULT 'general',
message TEXT NOT NULL,
context JSON,
user_id INT UNSIGNED,
ip_address VARCHAR(45),
user_agent VARCHAR(500),
request_uri VARCHAR(2000),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_level (level),
INDEX idx_category (category),
INDEX idx_created (created_at),
INDEX idx_user (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DEBUG
개발 중 디버깅용. 변수 값, 쿼리 실행 시간 등 상세 정보. 운영에서는 비활성화.
INFO
정상 동작 기록. 로그인 성공, 결제 완료, API 호출 등 비즈니스 이벤트.
WARNING
주의가 필요한 상황. 느린 쿼리, 메모리 사용량 높음, 재시도 발생 등.
ERROR
오류 발생. DB 연결 실패, API 타임아웃, 결제 실패 등. 즉시 확인 필요.
CRITICAL
시스템 장애. 서버 다운, 디스크 풀, 보안 침해 등. 즉시 대응 필요.
// Logger.php - 커스텀 로깅 클래스
class Logger {
private $pdo;
private $minLevel;
private const LEVELS = [
'DEBUG' => 0,
'INFO' => 1,
'WARNING' => 2,
'ERROR' => 3,
'CRITICAL' => 4,
];
public function __construct($pdo, $minLevel = 'INFO') {
$this->pdo = $pdo;
$this->minLevel = $minLevel;
}
public function log($level, $message, $category = 'general', $context = []) {
if (self::LEVELS[$level] LEVELS[$this->minLevel]) {
return;
}
$stmt = $this->pdo->prepare("
INSERT INTO activity_logs (level, category, message, context, user_id, ip_address, user_agent, request_uri)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
");
$stmt->execute([
$level,
$category,
$message,
json_encode($context, JSON_UNESCAPED_UNICODE),
$_SESSION['user_id'] ?? null,
$_SERVER['REMOTE_ADDR'] ?? null,
substr($_SERVER['HTTP_USER_AGENT'] ?? '', 0, 500),
$_SERVER['REQUEST_URI'] ?? null,
]);
// CRITICAL 레벨은 즉시 알림 발송
if ($level === 'CRITICAL') {
$this->sendAlert($message, $context);
}
}
public function info($msg, $cat = 'general', $ctx = []) { $this->log('INFO', $msg, $cat, $ctx); }
public function warning($msg, $cat = 'general', $ctx = []) { $this->log('WARNING', $msg, $cat, $ctx); }
public function error($msg, $cat = 'general', $ctx = []) { $this->log('ERROR', $msg, $cat, $ctx); }
public function critical($msg, $cat = 'general', $ctx = []){ $this->log('CRITICAL', $msg, $cat, $ctx); }
}
🔒
여기까지는 미리보기입니다
서버 모니터링 & 로그 관리
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.