우분투 실전 명령어 | tail -F와 tee로 실시간 로그 저장

서버 장애를 볼 때는 로그를 눈으로만 보는 것보다, 실시간 화면 확인과 파일 저장을 동시에 돌려두는 편이 훨씬 안전합니다. 오늘은 tail -f와 tee를 조합해서 재현 로그를 남기는 기본 패턴을 정리합니다.

언제 쓰는가

  • 장애 재현 중 실시간 로그를 보면서 같은 내용을 증적 파일로 저장해야 할 때
  • 원격 세션이 끊길 수 있어 화면 출력만 믿기 어려울 때
  • 팀원에게 동일한 타임라인 로그를 전달해야 할 때

바로 쓰는 명령어

# 서비스 로그를 실시간으로 보면서 파일에도 저장
sudo journalctl -u nginx -f | tee /tmp/nginx-live.log
# 기존 파일을 보존하고 새 파일에 타임스탬프를 붙여 저장
tail -F /var/log/nginx/error.log | ts '[%Y-%m-%d %H:%M:%S]' | tee /tmp/nginx-error-$(date +%F-%H%M%S).log
# 화면은 간단히 보고, 상세 로그는 파일에 남긴 뒤 에러 라인만 후처리
sudo journalctl -u myapp -f | tee /tmp/myapp-live.log >/dev/null
grep -iE 'error|fail|timeout' /tmp/myapp-live.log | tail -n 50

핵심 옵션/패턴

  • tail -f: 파일 끝을 따라가며 새 로그를 즉시 출력
  • tail -F: 로그 로테이션으로 파일 핸들이 바뀌어도 자동 재추적
  • tee file: 화면 출력과 파일 저장을 동시에 처리
  • tee -a file: 기존 파일 뒤에 이어서 저장
  • journalctl -u 서비스명 -f: systemd 서비스 로그를 실시간 구독

명령 출력 예시

Feb 18 22:31:04 web-01 nginx[1742]: 10.0.0.12 - - "GET /healthz HTTP/1.1" 200 2
Feb 18 22:31:06 web-01 nginx[1742]: 10.0.0.23 - - "POST /api/login HTTP/1.1" 502 157
Feb 18 22:31:06 web-01 nginx[1742]: upstream timed out (110: Connection timed out)
Feb 18 22:31:07 web-01 nginx[1742]: 10.0.0.23 - - "POST /api/login HTTP/1.1" 200 312

자주 하는 실수

  • tail -f만 쓰고 종료 후 로그 파일이 없어서 재분석을 못 하는 경우
  • tee로 저장할 경로 권한을 확인하지 않아 중간에 쓰기 실패가 나는 경우
  • logrotate 환경에서 tail -f를 고집해 새 파일로 넘어간 로그를 놓치는 경우
  • 큰 트래픽 환경에서 무제한 수집을 오래 유지해 디스크를 빠르게 소모하는 경우

검증 방법

# 저장 파일이 실제로 생성되고 증가하는지 확인
ls -lh /tmp/nginx-live.log
watch -n 1 'wc -l /tmp/nginx-live.log'
# 마지막 로그 시각과 현재 시각 차이를 확인해 수집 지연 점검
tail -n 3 /tmp/nginx-live.log
date '+%F %T'

운영 팁

  • 장애 시작 직전에 빈 파일로 새 로그를 따두면 구간 분석이 쉬워집니다.
  • 운영 서버에서는 수집 시간을 정해두고 timeout 1800 명령으로 자동 종료를 거는 편이 안전합니다.
  • 팀 공유용 로그는 민감정보 마스킹 규칙을 먼저 정한 뒤 전달하세요.

출처

  • Ubuntu Manpage: tail
  • Ubuntu Manpage: tee
  • systemd journalctl 문서