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과 연결하면 필요한 메시지만 걸러 낼 수 있지만, 권한과 민감 정보 노출에는 주의해야 합니다. 다른 기본 도구도 함께 익히고 싶다면 리눅스에서 자주 사용하는 명령어 목록을 참고할 수 있습니다.

같은 카테고리의 다른 글
Linux / 명령어 / chown - 파일 소유자와 그룹 변경

Linux / 명령어 / chown - 파일 소유자와 그룹 변경

Linux chown 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / xargs - 표준 입력을 명령 인수로 전달

Linux / 명령어 / xargs - 표준 입력을 명령 인수로 전달

Linux xargs 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / xz - 파일을 xz 형식으로 압축하기

Linux / 명령어 / xz - 파일을 xz 형식으로 압축하기

Linux xz 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.

Linux / 명령어 / ip - 인터페이스·주소·라우팅 상태와 설정

Linux / 명령어 / ip - 인터페이스·주소·라우팅 상태와 설정

Linux ip 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / whatis - 명령어의 한 줄 설명 확인

Linux / 명령어 / whatis - 명령어의 한 줄 설명 확인

whatis 명령어로 매뉴얼 페이지의 한 줄 설명과 섹션을 확인하는 방법을 설명합니다. 정규 표현식·와일드카드 검색, apropos·type과의 차이 및 색인 문제 해결법을 정리합니다.

Linux / 명령어 / fdisk - 디스크 파티션 표 확인과 편집

Linux / 명령어 / fdisk - 디스크 파티션 표 확인과 편집

Linux fdisk 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / timedatectl - 시간대와 시간 동기화 상태 관리

Linux / 명령어 / timedatectl - 시간대와 시간 동기화 상태 관리

Linux timedatectl 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / stat - 파일 정보와 메타데이터 확인

Linux / 명령어 / stat - 파일 정보와 메타데이터 확인

Linux stat 명령어로 파일 크기, 권한, 소유자, inode와 타임스탬프를 확인하는 방법을 설명합니다. atime·mtime·ctime·Birth의 차이와 출력 형식, 파일 시스템 조회법도 정리합니다.

Linux / 명령어 / more - 텍스트를 화면 단위로 나누어 보기

Linux / 명령어 / more - 텍스트를 화면 단위로 나누어 보기

Linux more 명령어로 긴 텍스트를 화면 단위로 읽는 방법을 설명합니다. 이동과 검색 키, 파이프 사용법, less와의 차이를 함께 정리합니다.

Linux / 명령어 / pacman - Arch Linux에서 패키지 설치와 전체 시스템 업데이트

Linux / 명령어 / pacman - Arch Linux에서 패키지 설치와 전체 시스템 업데이트

Linux pacman 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.