Linux / 명령어 / tail - 파일의 마지막 내용과 로그 실시간 확인
tail은 파일의 끝부분을 확인하는 리눅스 명령어입니다. 옵션 없이 실행하면 마지막 10행을 출력하며, -n으로 행 수를 정하고 -f 또는 -F로 새로 추가되는 로그를 계속 확인할 수 있습니다.
장애 직전의 로그를 빠르게 살펴보거나 실행 중인 서비스의 로그를 관찰할 때 특히 유용합니다. 이 글에서는 기본 문법부터 로그 로테이션을 고려한 추적 방법, 필터링과 여러 파일 모니터링까지 실제 예제로 설명합니다.
tail 명령어란?
tail은 텍스트 입력의 마지막 부분을 출력합니다. 파일을 지정하지 않거나 파일 자리에 -를 사용하면 표준 입력을 읽습니다. 기본 출력 단위는 행이며, 별도의 옵션이 없으면 마지막 10행을 보여 줍니다.
파일 전체를 열지 않고 끝부분만 확인할 수 있어 크기가 큰 로그 파일을 점검할 때 편리합니다. 다만 tail은 로그를 분석하거나 보관하는 도구가 아니라 파일의 끝을 읽고 변화를 따라가는 도구입니다.
기본 문법과 사용법
기본 문법은 다음과 같습니다. 대괄호는 선택 항목을 뜻하므로 실제 명령에는 입력하지 않습니다.
tail [옵션] [파일...]
예를 들어 /var/log/app.log의 마지막 10행을 확인하려면 다음과 같이 실행합니다.
tail /var/log/app.log
마지막 20행이 필요하면 -n 옵션에 행 수를 지정합니다.
tail -n 20 /var/log/app.log
-20처럼 짧게 쓸 수도 있지만, 스크립트와 문서에서는 의미가 분명한 -n 20 형식이 읽기 좋습니다.
원하는 범위만 출력하는 방법
마지막 N행 출력하기
-n N은 파일 끝에서부터 N행을 출력합니다. 최근 요청이나 오류를 일정한 범위로 확인할 때 사용합니다.
tail -n 50 access.log
출력을 한 화면씩 읽고 싶다면 less와 연결할 수 있습니다.
tail -n 500 access.log | less
N번째 행부터 끝까지 출력하기
숫자 앞에 더하기 기호를 붙인 -n +N은 의미가 다릅니다. 마지막 N행이 아니라 파일의 N번째 행부터 끝까지 출력합니다.
tail -n +2 data.csv
이 예제는 CSV 파일의 첫 번째 행인 헤더를 제외하고 두 번째 행부터 출력합니다. 파이프라인에서 첫 행을 건너뛸 때 간단히 활용할 수 있습니다.
행 대신 바이트 단위로 출력하기
-c N은 행이 아니라 마지막 N바이트를 출력합니다. K, M 같은 접미사를 사용할 수 있습니다.
tail -c 1K output.bin
-c +N은 N번째 바이트부터 끝까지 출력합니다. 바이트 기준으로 자르면 다중 바이트 문자 하나가 중간에서 끊길 수 있으므로 한글이 포함된 텍스트는 보통 -n이 더 안전합니다.
새로 추가되는 로그 계속 보기
-f로 열린 파일 계속 추적하기
-f는 먼저 파일 끝부분을 출력한 뒤 파일에 내용이 추가될 때마다 이어서 보여 줍니다. 기본 동작은 열린 파일 디스크립터를 따라가므로, 같은 파일에 로그가 계속 추가되는 상황에 적합합니다.
tail -f /var/log/app.log
추적을 끝내려면 Ctrl+C를 누릅니다.
-F로 로그 로테이션에 대응하기
운영 환경의 로그 파일은 일정 크기나 시간이 지나면 이름이 바뀌고 새 파일로 교체될 수 있습니다. 이를 로그 로테이션(log rotation)이라고 합니다. GNU tail의 -F는 --follow=name --retry와 같아서 파일 이름을 기준으로 다시 열기를 시도합니다.
tail -F /var/log/app.log
따라서 로테이션되는 일반적인 서비스 로그를 장시간 관찰할 때는 -f보다 -F가 실용적인 경우가 많습니다. 해당 동작은 GNU Coreutils의 tail 공식 문서에서 확인할 수 있습니다.
기존 내용 없이 새 로그만 보기
-f를 실행할 때 기존 마지막 10행이 필요하지 않다면 -n 0을 함께 사용합니다. 명령 실행 이후 추가되는 행만 표시됩니다.
tail -n 0 -f /var/log/app.log
자주 사용하는 옵션
| 옵션 | 기능 | 활용 예 |
|---|---|---|
-n N |
마지막 N행 출력 | tail -n 100 app.log |
-n +N |
N번째 행부터 출력 | tail -n +2 data.csv |
-c N |
마지막 N바이트 출력 | tail -c 2K data.bin |
-f |
열린 파일의 추가 내용 추적 | 계속 기록되는 단일 파일 관찰 |
-F |
파일 이름 기준 추적 및 재시도 | 로테이션되는 로그 관찰 |
-s N |
추적 확인 간격을 N초로 지정 | tail -f -s 2 app.log |
--pid=PID |
지정 프로세스 종료 뒤 추적 종료 | 배치 작업 로그와 함께 사용 |
-q |
파일 이름 머리말 숨김 | 여러 파일 출력을 하나처럼 처리 |
-v |
항상 파일 이름 머리말 표시 | 출처 파일을 명확히 구분 |
옵션의 세부 지원 범위는 운영체제와 tail 구현에 따라 다를 수 있습니다. 특히 -F와 --pid를 스크립트에 사용할 때는 대상 시스템에서 tail --help로 지원 여부를 확인하는 것이 좋습니다.
로그 확인에 유용한 실전 예제
최근 오류만 찾기
먼저 최근 200행만 읽은 다음 grep으로 오류 문자열을 걸러 내면 오래된 대형 로그 전체를 검색하는 일을 줄일 수 있습니다.
tail -n 200 app.log | grep 'ERROR'
대소문자를 구분하지 않으려면 grep -i, 줄 번호가 필요하면 grep -n을 사용할 수 있습니다.
추가되는 오류만 계속 보기
로테이션되는 로그를 따라가면서 오류 행만 보고 싶다면 다음과 같이 연결합니다. GNU grep의 --line-buffered는 각 행을 바로 전달하도록 해 파이프에서 출력 지연을 줄이는 데 도움이 됩니다.
tail -F app.log | grep --line-buffered 'ERROR'
이 방식은 화면에 표시되는 내용을 좁힐 뿐 원본 로그를 변경하지 않습니다. 여러 조건이나 구조화된 로그 분석이 필요하다면 전용 로그 수집·검색 도구를 고려하는 편이 좋습니다.
여러 로그 파일 동시에 보기
tail에는 파일을 여러 개 지정할 수 있습니다. 이때 어느 파일의 출력인지 알 수 있도록 파일 이름 머리말이 표시됩니다.
tail -F access.log error.log
파일별 출력을 더 분명히 구분하려면 -v를 추가하고, 머리말이 불필요하면 -q를 사용합니다.
프로세스가 끝날 때 추적도 종료하기
GNU tail에서는 --pid를 사용해 특정 프로세스가 종료된 뒤 파일 추적도 끝낼 수 있습니다. 다음 예제의 $!는 셸에서 가장 최근에 백그라운드로 실행한 프로세스의 ID입니다.
some_command > build.log 2>&1 & tail --pid=$! -f build.log
--pid 확인은 -f와 함께 동작하며, 종료 감지가 즉시 이뤄지는 것은 아닐 수 있습니다. 자동화에서는 명령의 종료 코드와 로그 파일도 별도로 확인해야 합니다.
-f와 -F의 차이
| 구분 | -f |
-F |
|---|---|---|
| 추적 기준 | 기본적으로 열린 파일 디스크립터 | 지정한 파일 이름 |
| 파일 교체 | 기존 열린 파일을 계속 볼 수 있음 | 같은 이름으로 생긴 새 파일을 다시 엶 |
| 파일 일시 부재 | 일반적으로 추적을 이어가기 어려움 | --retry 동작으로 다시 생기기를 기다림 |
| 권장 상황 | 교체되지 않는 파일의 단기 관찰 | 로테이션되는 서비스 로그의 장기 관찰 |
항상 -F가 더 좋은 것은 아닙니다. 이름이 바뀐 기존 파일에 프로세스가 계속 기록하는 특수한 상황에서는 열린 파일을 유지하는 -f가 필요한 내용을 더 잘 보여 줄 수 있습니다. 로그 생성 방식과 로테이션 정책을 기준으로 선택해야 합니다.
tail이 적합하지 않은 경우
- systemd 저널: 로그가 일반 텍스트 파일이 아니라 저널에 저장된다면
journalctl -f를 사용합니다. 특정 서비스는journalctl -f -u 서비스명으로 좁힐 수 있습니다. - 앞부분 확인: 파일의 처음 몇 행은
head가 더 직접적입니다. - 이동하며 읽기: 과거 내용과 새 내용을 오가며 확인하려면
less +F 파일명이 편리할 수 있습니다. Ctrl+C로 추적을 멈춘 뒤 위아래로 이동하고, F로 다시 추적합니다. - 명령 결과 주기적 갱신: 파일 추가분이 아니라 명령의 최신 결과를 반복 확인하려면 Linux watch 명령어 사용법이 목적에 더 잘 맞습니다.
- 대규모 중앙 로그: 여러 서버의 로그를 장기간 검색·집계·경보 처리해야 한다면 중앙 로그 시스템이나 관측성 도구가 필요합니다.
권한과 운영 환경에서 주의할 점
Permission denied 오류
로그 파일 읽기 권한이 없으면 Permission denied 오류가 발생합니다. 먼저 ls -l 파일명으로 소유자와 권한을 확인하고, 필요한 권한을 관리자에게 요청하는 것이 안전합니다. 무조건 권한을 넓히거나 모든 명령 앞에 sudo를 붙이는 방식은 피해야 합니다.
민감한 로그 출력
인증 토큰, 세션 ID, 개인 정보가 로그에 포함될 수 있습니다. 화면 공유, 터미널 기록, 복사한 오류 메시지에 민감한 값이 노출되지 않는지 확인해야 합니다. 운영 로그를 외부에 전달할 때는 필요한 범위만 추출하고 민감한 값을 가립니다.
자주 묻는 질문
tail은 기본적으로 몇 행을 출력하나요?
옵션을 지정하지 않으면 마지막 10행을 출력합니다. 다른 수가 필요하면 tail -n 30 파일명처럼 -n 뒤에 원하는 행 수를 지정합니다.
tail -f를 어떻게 종료하나요?
Ctrl+C를 누르면 실행 중인 추적을 중단하고 셸 프롬프트로 돌아갑니다. 이 동작은 로그 파일을 삭제하거나 변경하지 않습니다.
로그 로테이션 후 새 내용이 보이지 않는 이유는 무엇인가요?
-f가 교체 전 파일의 디스크립터를 계속 추적하고 있기 때문일 수 있습니다. 파일 이름을 기준으로 새 파일을 다시 여는 GNU tail -F 파일명을 사용해 보세요. 그래도 보이지 않으면 실제 로그 경로와 서비스의 출력 설정을 확인해야 합니다.
압축된 로그 파일에도 tail을 사용할 수 있나요?
tail은 압축 형식을 자동으로 해제하지 않습니다. 압축 파일 전체를 해제해 파이프로 전달할 수는 있지만, 큰 파일에서는 비효율적일 수 있습니다. 예를 들어 gzip 파일은 zcat archive.log.gz | tail -n 50처럼 확인할 수 있습니다.
정리
최근 내용을 빠르게 확인할 때는 tail 파일명, 원하는 행 수를 지정할 때는 tail -n N 파일명을 사용합니다. 새 로그를 계속 보려면 -f, 로그 로테이션으로 파일이 교체되는 환경이라면 GNU tail의 -F를 우선 검토하세요.
grep과 연결하면 필요한 메시지만 걸러 낼 수 있지만, 권한과 민감 정보 노출에는 주의해야 합니다. 다른 기본 도구도 함께 익히고 싶다면 리눅스에서 자주 사용하는 명령어 목록을 참고할 수 있습니다.









