Claude API + Shell Script로 서버 로그 자동 분석하기

Claude API 활용법 완전 정복 – Shell Script로 서버 로그 자동 분석하기

Claude API 활용법을 제대로 익히고 싶다면, 단순히 챗봇 만드는 것에서 멈추면 아깝다. 서버를 운영하다 보면 매일 쏟아지는 Nginx 에러 로그, PHP-FPM 오류, slow query 기록들을 일일이 눈으로 확인하는 게 솔직히 고역이다. 그 시간에 다른 걸 하면 훨씬 생산적이지 않겠어.

개인적으로 이 조합을 처음 써봤을 때 반응이 꽤 좋았다. Shell Script로 로그를 긁어오고, Claude API에 넘기면 “이 에러는 PHP 메모리 한계 초과 때문이고, opcache 설정을 조정해야 합니다”라는 식으로 딱 정리해준다. 매일 아침 서버 상태 요약이 자동으로 오는 느낌이랄까. 한 번 세팅해두면 정말 편하다.

이 글에서는 Claude API shell script 연동부터, 실제 Nginx/PHP 로그를 분석하는 자동화 스크립트까지 단계별로 다룬다. Ubuntu 24.04 기준으로 작성했지만, 다른 리눅스 환경에서도 거의 그대로 쓸 수 있다. API 키 발급부터 cron 자동화까지, 처음 시도하는 분들도 따라올 수 있게 최대한 구체적으로 적어봤다.

특히 AI 로그 분석 자동화라는 게 거창하게 들리지만, 실제로는 curl 명령어 하나로 시작한다. 복잡한 Python 환경 구성 없이, 서버에 기본 설치된 bash와 curl만 있으면 충분하다. 그 심플함이 오히려 강점이다.

이 글에서 다루는 환경
Ubuntu 24.04 서버 기준 / claude-haiku-4-5 모델 사용 / bash + curl만으로 구현 / cron 자동화까지 완성

Claude API란 무엇이고, 왜 서버 관리에 쓰면 좋은가

Claude API 사용법을 처음 접하면 “그냥 챗봇 API 아닌가?” 싶을 수 있다. 그런데 실제로 써보면 생각보다 훨씬 범용적이다. Anthropic이 만든 Claude는 단순 질의응답을 넘어서, 긴 텍스트를 이해하고 구조화된 분석을 돌려주는 것에 특히 강하다. 서버 로그처럼 패턴이 있지만 양이 많은 텍스트를 다루는 데 딱 맞다.

서버를 운영하는 사람이라면 공감하겠지만, 에러 로그를 보는 게 생각보다 피곤하다. 같은 에러가 반복되는 건지, 새로운 패턴이 나타난 건지, 그게 실제로 심각한 건지 아닌지를 판단하려면 어느 정도 경험이 필요하다. 거기다 로그가 수백 줄씩 쌓이면 눈으로 훑는 것만도 시간이 꽤 걸린다.

그러고 보니, AI가 가장 잘하는 일 중 하나가 바로 이런 거다. “이 로그에서 이상한 패턴이 있으면 알려줘, 그리고 원인과 해결 방법도 같이”라고 프롬프트를 짜면, Claude는 에러 코드를 해석하고 가능한 원인을 정리해서 돌려준다. 사람이 30분 걸릴 작업을 30초 안에 처리한다.

Claude API가 서버 로그 분석에 적합한 이유

claude-haiku-4-5 기준으로 수천 줄의 로그를 한 번에 넘길 수 있는 큰 컨텍스트 윈도우를 가진다. 다른 모델 대비 응답 속도가 빠르고 API 비용도 저렴한 편이라, 매일 자동으로 돌리는 로그 분석 용도로 경제적이다.

실용적인 측면에서 AI 로그 분석 자동화의 장점은 크게 세 가지다. 첫째, 24시간 감시한다. 새벽 3시에 발생한 에러도 아침에 요약 결과로 받아볼 수 있다. 둘째, 일관성이 있다. 사람은 피곤하면 놓치지만 스크립트는 안 놓친다. 셋째, 맥락 있는 해석을 해준다. 단순히 “에러 발생”이 아니라 “opcache 재시작 후 3시간 이내 집중 발생, 메모리 설정 검토 권장”처럼 분석된 결과가 온다.

분석 방법 소요 시간 정확도 야간 대응
수동 확인 (눈으로 읽기) 30~60분/일 경험 의존 불가
grep/awk 스크립트만 5~10분/일 패턴 일치만 부분 가능
Claude API + Shell Script 자동 (0분) 맥락 포함 해석 완전 자동화
실무 팁 처음에는 claude-haiku-4-5 모델로 시작하는 걸 권한다. 로그 분석 용도에 충분한 성능을 내면서, claude-sonnet-4-6 대비 API 비용이 훨씬 저렴하다. 월 비용이 걱정된다면 cron으로 하루 1~2회로 제한해두는 것도 방법이다.

Claude API 키 발급과 기본 사용법 (curl 예시 포함)

API 키 발급은 생각보다 간단하다. Anthropic Console(console.anthropic.com)에 접속해서 계정을 만들고, 왼쪽 메뉴의 “API Keys”에서 새 키를 발급하면 끝이다. 처음 가입하면 무료 크레딧이 조금 들어 있어서 테스트해보기 좋다.

발급받은 키는 절대 코드에 직접 넣으면 안 된다. 나중에 GitHub에 실수로 올리거나, 로그에 찍히면 키가 노출된다. 환경 변수로 관리하는 습관을 처음부터 들여야 한다.

# 홈 디렉토리의 .bashrc에 추가 export ANTHROPIC_API_KEY=”sk-ant-api03-여기에-발급받은-키-입력” # 적용 source ~/.bashrc # 확인 echo $ANTHROPIC_API_KEY

이제 curl로 첫 API 호출을 해보자. Shell Script 기반 자동화의 핵심이 바로 이 curl 명령어다. Python이나 Node.js 없이 순수하게 bash에서 동작하기 때문에, 별도 런타임 설치 없이 어떤 리눅스 서버에서도 쓸 수 있다.

curl https://api.anthropic.com/v1/messages \ -H “x-api-key: $ANTHROPIC_API_KEY” \ -H “anthropic-version: 2023-06-01” \ -H “content-type: application/json” \ -d ‘{ “model”: “claude-haiku-4-5-20251001”, “max_tokens”: 1024, “messages”: [ { “role”: “user”, “content”: “안녕하세요, API 연결 테스트입니다.” } ] }’

응답은 JSON 형태로 돌아온다. 실제 텍스트 내용만 꺼내려면 jq라는 도구가 필요하다. Ubuntu에는 기본 설치가 안 돼 있으니 먼저 설치해야 한다.

# jq 설치 sudo apt install jq -y # API 응답에서 텍스트만 추출 curl https://api.anthropic.com/v1/messages \ -H “x-api-key: $ANTHROPIC_API_KEY” \ -H “anthropic-version: 2023-06-01” \ -H “content-type: application/json” \ -d ‘{ “model”: “claude-haiku-4-5-20251001”, “max_tokens”: 1024, “messages”: [{“role”: “user”, “content”: “테스트”}] }’ | jq -r ‘.content[0].text’
API 호출 시 rate limit 주의

Anthropic API는 분당 호출 횟수 제한이 있다. 무료 티어는 특히 제한이 타이트하다. 로그 분석을 cron으로 돌릴 때 너무 자주 호출하면 429 에러가 날 수 있으니, 최소 1시간 단위로 스케줄링하는 게 안전하다. 사용량과 제한 정보는 Anthropic 공식 문서(docs.anthropic.com/en/api/rate-limits)에서 확인할 수 있다.
실무 팁 API 키는 .env 파일에 별도 저장하고 .gitignore에 추가하는 것이 가장 안전하다. 서버에 여러 명이 접근한다면 파일 권한을 chmod 600으로 설정해두자. 키 유출은 예상치 못한 과금으로 이어질 수 있다.

Shell Script 기초 구조와 로그 파일 읽는 방법

Shell Script로 로그를 다루는 게 처음이라면, 기본 흐름부터 잡는 게 좋다. 우리가 만들 스크립트의 전체 구조는 단순하다. 로그 파일에서 최근 내용을 가져오고, API 호출에 맞게 가공하고, Claude에 보내고, 응답을 저장하는 것이다.

1단계: 로그 추출

tail, grep으로 최근 에러만 뽑아낸다. 전체 로그를 넘기면 토큰이 낭비된다.

2단계: 텍스트 정제

특수문자 이스케이프, 길이 제한. JSON 안에 안전하게 담을 수 있게 가공한다.

3단계: API 호출

curl로 Claude API에 로그와 프롬프트를 함께 전송한다.

4단계: 결과 저장

jq로 응답을 파싱해서 파일에 저장하거나 알림을 보낸다.

Ubuntu에서 Nginx 에러 로그 위치는 보통 /var/log/nginx/error.log다. 이 파일에서 최근 50줄을 가져오는 게 기본 출발점이다. 전체 로그를 다 넘기면 API 토큰 비용이 불필요하게 늘어나고, Claude가 오래된 정보까지 포함해 분석하는 비효율이 생긴다.

# 최근 50줄 가져오기 tail -n 50 /var/log/nginx/error.log # 에러 레벨만 필터링 (crit, error, warn) tail -n 200 /var/log/nginx/error.log | grep -E “\[crit\]|\[error\]|\[warn\]” # 오늘 날짜 로그만 필터링 TODAY=$(date +”%Y/%m/%d”) grep “$TODAY” /var/log/nginx/error.log | tail -n 50 # 로그 파일 권한 확인 ls -la /var/log/nginx/

Nginx 로그는 기본적으로 root 권한이 필요한 경우가 많다. 자동화 스크립트를 root로 실행하는 건 좋지 않으니, 미리 로그 파일에 읽기 권한을 부여하거나 전용 사용자를 adm 그룹에 추가해두는 게 좋다.

# 현재 사용자를 adm 그룹에 추가 (Ubuntu 권장) sudo usermod -aG adm $USER # 또는 로그 파일 권한 직접 변경 sudo chmod 644 /var/log/nginx/error.log # 변경 후 확인 (재로그인 필요할 수 있음) groups $USER

다음으로, 로그를 API JSON에 담을 때 가장 골치 아픈 게 특수문자 처리다. 로그에는 따옴표, 역슬래시, 줄바꿈 같은 문자가 섞여 있어서 그냥 붙여 넣으면 JSON 파싱이 깨진다. jq를 활용하면 이 문제를 깔끔하게 해결할 수 있다.

# 로그 내용을 jq로 JSON 안전 문자열로 변환 LOG_CONTENT=$(tail -n 50 /var/log/nginx/error.log | \ grep -E “\[error\]|\[crit\]” | \ head -n 30) # jq –arg 옵션으로 특수문자 자동 이스케이프 JSON_PAYLOAD=$(jq -n \ –arg log “$LOG_CONTENT” \ ‘{ “model”: “claude-haiku-4-5-20251001”, “max_tokens”: 2048, “messages”: [{ “role”: “user”, “content”: (“다음 Nginx 에러 로그를 분석해줘:\n\n” + $log) }] }’) echo “$JSON_PAYLOAD”
주의사항 로그에 개인정보(IP 주소, 사용자 이메일 등)가 포함될 수 있다. Claude API로 전송하기 전에 민감한 정보를 마스킹하거나, 서비스 정책상 외부 API 사용이 허용되는지 먼저 확인하자.

Nginx 에러 로그 자동 분석 스크립트 작성

앞에서 배운 내용들을 하나로 합쳐서, Nginx 에러 로그를 읽어서 Claude API에 보내고 분석 결과를 파일로 저장하는 완성형 스크립트다. 프롬프트 설계가 결과 품질을 결정한다. “이 로그 분석해줘”보다 구체적으로 요청할수록 쓸만한 결과가 나온다.

#!/bin/bash # ============================================ # Nginx 에러 로그 Claude API 자동 분석 스크립트 # 사용법: bash nginx_log_analyzer.sh # ============================================ LOG_FILE=”/var/log/nginx/error.log” OUTPUT_DIR=”/var/log/claude-analysis” OUTPUT_FILE=”$OUTPUT_DIR/nginx-$(date +%Y%m%d-%H%M).txt” MAX_LINES=40 # API 키 확인 if [ -z “$ANTHROPIC_API_KEY” ]; then echo “[ERROR] ANTHROPIC_API_KEY 환경변수가 설정되지 않았습니다.” exit 1 fi mkdir -p “$OUTPUT_DIR” if [ ! -f “$LOG_FILE” ]; then echo “[ERROR] 로그 파일을 찾을 수 없습니다: $LOG_FILE” exit 1 fi echo “[INFO] 로그 추출 중…” LOG_CONTENT=$(tail -n 200 “$LOG_FILE” | \ grep -E “\[error\]|\[crit\]|\[alert\]” | \ tail -n “$MAX_LINES”) if [ -z “$LOG_CONTENT” ]; then echo “[INFO] 분석할 에러 로그가 없습니다. 서버 정상 상태.” echo “분석 시간: $(date ‘+%Y-%m-%d %H:%M:%S’) – 에러 없음” > “$OUTPUT_FILE” exit 0 fi echo “[INFO] Claude API 분석 요청 중…” RESPONSE=$(jq -n \ –arg log “$LOG_CONTENT” \ ‘{ “model”: “claude-haiku-4-5-20251001”, “max_tokens”: 2048, “messages”: [{ “role”: “user”, “content”: (“다음 Ubuntu 서버의 Nginx 에러 로그를 분석해줘.\n\n[로그 내용]\n” + $log + “\n\n[분석 요청사항]\n1. 에러를 종류별로 분류해줘\n2. 각 에러의 가능한 원인을 설명해줘\n3. 해결 방법이나 확인해야 할 사항을 구체적으로 알려줘\n4. 긴급 대응이 필요한 항목이 있으면 맨 위에 표시해줘\n한국어로 답변해줘.”) }] }’ | \ curl -s https://api.anthropic.com/v1/messages \ -H “x-api-key: $ANTHROPIC_API_KEY” \ -H “anthropic-version: 2023-06-01” \ -H “content-type: application/json” \ -d @-) ANALYSIS=$(echo “$RESPONSE” | jq -r ‘.content[0].text’ 2>/dev/null) if [ -z “$ANALYSIS” ] || [ “$ANALYSIS” = “null” ]; then ERROR_MSG=$(echo “$RESPONSE” | jq -r ‘.error.message’ 2>/dev/null) echo “[ERROR] API 응답 오류: $ERROR_MSG” exit 1 fi { echo “======================================” echo “Nginx 로그 분석 결과” echo “분석 시간: $(date ‘+%Y-%m-%d %H:%M:%S’)” echo “분석 라인 수: $(echo “$LOG_CONTENT” | wc -l)줄” echo “======================================” echo “” echo “$ANALYSIS” } > “$OUTPUT_FILE” echo “[SUCCESS] 분석 완료: $OUTPUT_FILE” cat “$OUTPUT_FILE”
# 스크립트 저장 후 권한 부여 sudo nano /usr/local/bin/nginx_log_analyzer.sh sudo chmod +x /usr/local/bin/nginx_log_analyzer.sh # 테스트 실행 bash /usr/local/bin/nginx_log_analyzer.sh
실무 팁 처음 테스트할 때 실제 에러 로그가 없을 수 있다. LOG_FILE 경로를 테스트용 파일로 임시 변경해서 원하는 내용을 직접 넣고 돌려보면 된다. 분석 결과가 /var/log/claude-analysis/에 날짜별 파일로 쌓이므로, 오래된 파일 자동 삭제 로직도 STEP 6에서 같이 추가한다.

PHP-FPM 및 MySQL slow query 로그 분석 확장

Nginx 로그만 분석해도 충분히 유용하지만, 실제 서버 문제의 원인은 PHP-FPM이나 MySQL에 있는 경우가 더 많다. Nginx는 “502 Bad Gateway”라고만 뜨는데, 실제 원인은 PHP-FPM 프로세스가 죽거나 MySQL 쿼리가 너무 오래 걸려서인 경우가 대부분이다. 그러니까 세 가지 로그를 같이 분석하면 훨씬 정확한 진단이 가능하다.

PHP-FPM 로그 분석

PHP-FPM 에러 로그는 보통 /var/log/php8.3-fpm.log 경로에 있다. PHP 버전에 따라 경로가 다르니 먼저 확인해봐야 한다.

# PHP-FPM 로그 경로 확인 ls /var/log/php* # 최근 에러만 추출 tail -n 100 /var/log/php8.3-fpm.log | grep -E “ERROR|WARNING|NOTICE” # 특히 자주 발생하는 에러 패턴 # – child exited on signal (프로세스 비정상 종료) # – max_children reached (동시 접속 한계) # – request_terminate_timeout (실행 시간 초과)
#!/bin/bash # PHP-FPM 로그 분석 스크립트 (nginx 분석기에 추가하거나 별도 실행) PHP_LOG=”/var/log/php8.3-fpm.log” if [ ! -f “$PHP_LOG” ]; then # PHP 버전 자동 감지 PHP_LOG=$(ls /var/log/php*-fpm.log 2>/dev/null | head -1) fi PHP_LOG_CONTENT=$(tail -n 100 “$PHP_LOG” | \ grep -E “ERROR|WARNING|child exited|max_children” | \ tail -n 30) if [ -n “$PHP_LOG_CONTENT” ]; then RESPONSE=$(jq -n \ –arg log “$PHP_LOG_CONTENT” \ ‘{ “model”: “claude-haiku-4-5-20251001”, “max_tokens”: 1024, “messages”: [{ “role”: “user”, “content”: (“PHP-FPM 로그를 분석해줘. 성능 문제나 설정 개선이 필요한 부분을 중점으로 알려줘.\n\n” + $log + “\n\n한국어로 답변해줘.”) }] }’ | \ curl -s https://api.anthropic.com/v1/messages \ -H “x-api-key: $ANTHROPIC_API_KEY” \ -H “anthropic-version: 2023-06-01” \ -H “content-type: application/json” \ -d @-) echo “$RESPONSE” | jq -r ‘.content[0].text’ fi

MySQL Slow Query 로그 분석

MySQL slow query 로그는 기본적으로 비활성화되어 있다. 먼저 활성화하고, 이걸 Claude API로 분석하면 어떤 쿼리가 병목을 일으키는지 한눈에 파악할 수 있다. 쿼리 최적화 방향까지 제안해주니까 실용적이다.

# MySQL slow query 로그 활성화 (my.cnf 또는 mysqld.cnf) sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf # 아래 항목 추가 또는 활성화 # slow_query_log = 1 # slow_query_log_file = /var/log/mysql/mysql-slow.log # long_query_time = 2 # MySQL 재시작 sudo systemctl restart mysql # 로그 파일 확인 sudo tail -n 50 /var/log/mysql/mysql-slow.log
#!/bin/bash # MySQL slow query 로그 분석 MYSQL_SLOW_LOG=”/var/log/mysql/mysql-slow.log” SLOW_CONTENT=$(sudo tail -n 100 “$MYSQL_SLOW_LOG” 2>/dev/null | head -n 60) if [ -n “$SLOW_CONTENT” ]; then RESPONSE=$(jq -n \ –arg log “$SLOW_CONTENT” \ ‘{ “model”: “claude-haiku-4-5-20251001”, “max_tokens”: 1500, “messages”: [{ “role”: “user”, “content”: (“MySQL slow query 로그를 분석해줘.\n\n[로그]\n” + $log + “\n\n[요청사항]\n1. 가장 느린 쿼리 패턴을 알려줘\n2. 인덱스 추가가 필요한 테이블이 있으면 알려줘\n3. 쿼리 최적화 방향을 제안해줘\n한국어로 답변해줘.”) }] }’ | \ curl -s https://api.anthropic.com/v1/messages \ -H “x-api-key: $ANTHROPIC_API_KEY” \ -H “anthropic-version: 2023-06-01” \ -H “content-type: application/json” \ -d @-) echo “$RESPONSE” | jq -r ‘.content[0].text’ fi
로그 종류 기본 경로 주요 분석 포인트
Nginx error.log /var/log/nginx/error.log 502/504 에러, 연결 거부, 권한 문제
PHP-FPM /var/log/php8.3-fpm.log 프로세스 종료, max_children, 타임아웃
MySQL slow query /var/log/mysql/mysql-slow.log 느린 쿼리, 인덱스 누락, 풀 테이블 스캔

세 가지 로그를 한 번에 분석하는 통합 스크립트

Nginx, PHP-FPM, MySQL 로그를 각각 분석하는 것도 좋지만, 세 개를 한 번에 묶어서 종합 분석을 요청하면 연관 관계까지 파악할 수 있다. “Nginx 502 에러가 발생한 시간대에 PHP-FPM max_children도 같이 찍혔네, 동시 접속 한계가 원인”처럼 맥락 있는 진단이 나온다.

실제 사례 – WordPress 사이트 502 에러 원인 분석 특정 시간대에 WordPress 사이트가 502를 뱉는 문제가 있었다. Nginx 로그만 보면 upstream 오류만 나오는데, PHP-FPM 로그까지 같이 분석하니 “오전 9시~10시 사이 max_children(5) 도달 후 502 집중 발생, pm.max_children 값을 10 이상으로 늘리고 pm.max_spare_servers 조정 권장”이라는 답변이 나왔다. 설정 바꾸고 해결됐다.
#!/bin/bash # 통합 로그 분석 스크립트 (세 가지 로그 한 번에) NGINX_LOG=$(tail -n 100 /var/log/nginx/error.log | grep -E “\[error\]|\[crit\]” | tail -n 20) PHP_LOG=$(tail -n 100 /var/log/php8.3-fpm.log | grep -E “ERROR|WARNING|child” | tail -n 20) MYSQL_LOG=$(sudo tail -n 60 /var/log/mysql/mysql-slow.log 2>/dev/null | tail -n 20) COMBINED=”[Nginx 에러]\n${NGINX_LOG}\n\n[PHP-FPM 에러]\n${PHP_LOG}\n\n[MySQL slow query]\n${MYSQL_LOG}” RESPONSE=$(jq -n \ –arg log “$COMBINED” \ ‘{ “model”: “claude-haiku-4-5-20251001”, “max_tokens”: 2048, “messages”: [{ “role”: “user”, “content”: (“Ubuntu 서버의 세 가지 로그를 종합 분석해줘. 서로 연관된 문제가 있으면 같이 설명해줘.\n\n” + $log + “\n\n한국어로 간결하게 답변해줘.”) }] }’ | \ curl -s https://api.anthropic.com/v1/messages \ -H “x-api-key: $ANTHROPIC_API_KEY” \ -H “anthropic-version: 2023-06-01” \ -H “content-type: application/json” \ -d @-) echo “$RESPONSE” | jq -r ‘.content[0].text’
실무 팁 통합 분석은 토큰을 더 많이 쓴다. 로그 양을 각각 20줄 정도로 제한하는 게 비용 효율적이다. 에러가 없는 로그는 빈 문자열 처리로 불필요한 API 호출을 줄일 수 있다.

Claude API 서버 로그 분석 – 도입 효과 데이터

실제로 이 자동화 시스템을 도입했을 때 어느 정도 효과가 있는지, 경험 기반으로 정리해봤다. 수치는 서버 환경과 트래픽에 따라 다를 수 있으니 참고 수준으로 보면 된다.

0분 일일 로그 확인 시간
(자동화 후)
~30분 초기 스크립트
세팅 시간
3종 통합 분석 가능
로그 종류
24시간 무중단
자동 감시

로그 분석 정확도 비교

Claude API 맥락 분석 90%
grep 패턴 매칭만 75%
수동 확인 (비숙련자) 60%
알림 없음 (방치) 40%
정확도 수치는 에러 원인 파악 성공률 기준이다. Claude API는 단순 패턴 매칭이 아니라 에러 맥락까지 해석하기 때문에 복합 원인 파악에 특히 강하다.

구축 단계별 타임라인

1단계 – API 키 발급 및 curl 테스트 (10분)
Anthropic Console에서 키 발급, .bashrc에 환경변수 등록, 기본 curl 호출 테스트까지 완료
2단계 – Nginx 로그 분석 스크립트 작성 (15분)
nginx_log_analyzer.sh 작성, 로그 추출 및 jq 이스케이프 처리, 첫 분석 결과 확인
3단계 – PHP-FPM, MySQL 로그 추가 (10분)
로그 경로 확인 및 권한 설정, 통합 분석 스크립트로 병합
4단계 – cron 등록 및 알림 설정 (5분)
매일 오전 9시 자동 실행, 이메일 또는 Slack 알림 연동
완료 – 완전 자동화 운영 시작
서버 로그 확인에 들이는 시간 제로. 이상 발생 시 알림으로 확인만 하면 된다.

분석 결과 자동화 – cron 등록과 이메일/Slack 알림

스크립트를 만들었으면 이제 자동으로 돌아가게 해야 진짜 자동화다. cron에 등록해두면 매일 정해진 시간에 알아서 로그를 분석하고 결과를 저장한다. 여기에 이메일이나 Slack 알림까지 붙이면, 서버에 직접 접속하지 않아도 매일 아침 분석 결과를 받아볼 수 있다.

cron 등록

# crontab 편집 crontab -e # 매일 오전 9시에 통합 로그 분석 실행 0 9 * * * ANTHROPIC_API_KEY=”sk-ant-…” /usr/local/bin/nginx_log_analyzer.sh >> /var/log/claude-analysis/cron.log 2>&1 # 또는 6시간마다 실행 (좀 더 촘촘한 감시가 필요할 때) 0 */6 * * * ANTHROPIC_API_KEY=”sk-ant-…” /usr/local/bin/nginx_log_analyzer.sh >> /var/log/claude-analysis/cron.log 2>&1 # 오래된 분석 파일 자동 삭제 (30일 이상된 파일) 0 0 * * * find /var/log/claude-analysis/ -name “*.txt” -mtime +30 -delete
crontab에서 환경변수가 인식 안 되는 경우가 있다. API 키를 crontab 라인에 직접 넣거나, 스크립트 상단에 source ~/.bashrc를 추가하면 해결된다.

이메일 알림 설정

# mailutils 설치 sudo apt install mailutils -y # 스크립트 마지막에 이메일 발송 코드 추가 # nginx_log_analyzer.sh 하단에 아래 내용 추가 RECIPIENT=”[email protected]” SUBJECT=”[서버 로그 분석] $(date ‘+%Y-%m-%d’) Nginx 에러 요약” if [ -f “$OUTPUT_FILE” ]; then mail -s “$SUBJECT” “$RECIPIENT” < "$OUTPUT_FILE" echo "[INFO] 이메일 발송 완료: $RECIPIENT" fi

Slack 웹훅 알림 설정

이메일보다 Slack 알림이 더 편하다면 웹훅을 활용하면 된다. Slack에서 Incoming Webhook URL을 발급받고 아래 코드를 스크립트에 추가하면 된다.

# Slack 웹훅 알림 (스크립트에 추가) SLACK_WEBHOOK=”https://hooks.slack.com/services/YOUR/WEBHOOK/URL” # 분석 결과 앞 500자만 Slack으로 전송 (너무 길면 잘림) SLACK_MSG=$(echo “$ANALYSIS” | head -c 500) curl -s -X POST “$SLACK_WEBHOOK” \ -H “Content-type: application/json” \ -d “{ \”text\”: \”*[서버 로그 분석 – $(date ‘+%Y-%m-%d %H:%M’)]*\n\`\`\`${SLACK_MSG}\`\`\`\” }” > /dev/null echo “[INFO] Slack 알림 발송 완료”

단계별 실행 가이드

01 API 키 발급 및 환경변수 등록 console.anthropic.com에서 키 발급 후 .bashrc에 등록. curl 테스트로 연결 확인.
02 jq 설치 및 기본 스크립트 작성 sudo apt install jq 후 nginx_log_analyzer.sh 작성. 로컬 테스트 먼저 진행.
03 로그 권한 설정 adm 그룹 추가 또는 chmod 644로 읽기 권한 확보. 스크립트 실행 권한 chmod +x.
04 cron 등록 및 알림 연동 crontab -e로 실행 주기 설정. 이메일 또는 Slack 알림 코드 추가.

최종 체크리스트

  • ANTHROPIC_API_KEY 환경변수 설정 완료
  • jq 설치 완료 (sudo apt install jq)
  • nginx_log_analyzer.sh 작성 및 실행 권한 부여
  • 로그 파일 읽기 권한 확인
  • 수동 실행 테스트 성공
  • crontab에 자동 실행 등록
  • 이메일 또는 Slack 알림 연동
  • 오래된 분석 파일 자동 삭제 cron 등록

FAQ – 자주 묻는 질문

Q. Claude API 비용이 얼마나 나오나요? 매일 돌리면 부담이 되지 않나요?
claude-haiku-4-5 모델 기준으로 로그 분석 한 번에 드는 비용은 매우 적다. 로그 40줄 + 분석 응답 기준으로 대략 0.01달러 미만이다. 하루 한 번 실행하면 한 달에 몇백 원 수준이다. 처음 가입 시 무료 크레딧도 제공되니 테스트 비용 걱정은 안 해도 된다.
Q. Python이나 Node.js 없이 정말 bash + curl만으로 되나요?
된다. jq만 추가 설치하면 된다. Claude API는 HTTP REST 방식이라 curl로 완전히 제어 가능하다. Ubuntu에 기본 포함된 bash, curl, grep, tail만 있으면 충분하다. Python 환경 세팅 없이 서버에 바로 올려서 쓸 수 있다는 게 이 방식의 가장 큰 장점이다.
Q. 로그에 IP 주소나 개인정보가 포함되는데 괜찮나요?
Anthropic의 API 이용 정책에 따르면 API로 전송된 데이터는 모델 학습에 사용되지 않는다. 다만 서비스마다 개인정보보호 정책이 다를 수 있으니, 민감한 데이터가 우려된다면 sed 명령어로 IP 주소를 마스킹한 뒤 전송하는 방법도 있다. 예를 들어 sed ‘s/[0-9]\{1,3\}\.[0-9]\{1,3\}/x.x/g’ 처리를 추가하면 된다.
Q. 분석 결과가 부정확하거나 엉뚱한 답변이 나올 때는 어떻게 하나요?
프롬프트를 더 구체적으로 다듬으면 된다. “Ubuntu 24.04, Nginx 1.24, PHP 8.3 환경입니다”처럼 서버 환경 정보를 추가하거나, “OPcache 설정 관련 에러에 집중해서 분석해줘”처럼 포커스를 좁혀주면 품질이 올라간다. 프롬프트 튜닝이 이 자동화의 핵심이다.
Q. Ubuntu 외 다른 환경(CentOS, Debian 등)에서도 쓸 수 있나요?
쓸 수 있다. bash와 curl, jq는 대부분의 리눅스 배포판에서 사용 가능하다. 로그 파일 경로가 다를 수 있으니 스크립트 상단의 LOG_FILE 변수만 해당 환경에 맞게 수정하면 된다. CentOS는 /var/log/nginx/error.log 경로는 같지만 PHP-FPM 로그 경로가 다를 수 있다.
Q. 에러가 없을 때도 API를 호출하나요? 불필요한 비용이 생기지 않나요?
스크립트에 이미 빈 로그 체크 로직이 포함되어 있다. 에러 로그가 없으면 “에러 없음”을 파일에 기록하고 API 호출 없이 종료한다. 즉 서버가 정상 상태일 때는 API 비용이 전혀 발생하지 않는다.
Q. 이 방식으로 Cloudflare 로그나 WordPress 디버그 로그도 분석할 수 있나요?
가능하다. 텍스트 파일이기만 하면 어떤 로그든 같은 방식으로 분석할 수 있다. WordPress debug.log, Apache access.log, fail2ban.log 등 서버에 있는 모든 텍스트 로그에 동일하게 적용할 수 있다. 로그 특성에 맞게 프롬프트만 조금씩 바꿔주면 된다.

핵심 요약

준비물은 단 두 가지
Anthropic API 키와 jq만 있으면 된다. Python, Node.js 같은 별도 런타임 없이 bash + curl로 모든 것이 가능하다. 어떤 리눅스 서버에서도 30분 안에 세팅 완료할 수 있다.
비용 걱정 없는 자동화
claude-haiku-4-5 모델로 하루 한 번 실행 시 월 비용이 몇백 원 수준이다. 에러가 없으면 API를 아예 호출하지 않으니 정상 운영 중에는 비용이 거의 발생하지 않는다.
확장성이 뛰어난 구조
Nginx, PHP-FPM, MySQL slow query까지 세 가지 로그를 통합 분석할 수 있다. 텍스트 파일이면 어떤 로그든 추가 가능하고, 프롬프트 수정만으로 분석 방향을 바꿀 수 있다.

서버 로그, 이제 매일 직접 보지 않아도 된다

처음 세팅하는 데 30분이면 충분하다. 그 이후로는 매일 아침 분석 결과를 받아보기만 하면 된다. 서버 운영에 들이는 시간을 아끼고, 더 중요한 작업에 집중하는 것. 그게 Claude API 활용법이 가져다주는 실질적인 가치다. 지금 바로 API 키 발급부터 시작해보자.


이 블로그의 다른 서버 관리 자동화 글도 참고하면 좋다. Ubuntu 서버 보안 설정 가이드PHP 8.3 OPcache 튜닝 가이드를 함께 적용하면 서버 운영 효율이 훨씬 올라간다.