리눅스 tail 명령어 사용법 (tail -f 로그 실시간 확인)

리눅스 관련 7번째 포스팅이다. 지난 편에 find/grep 명령어 포스팅 이후 고민을 하는 시간을 가졌다. 지금 이 글을 보는 분들은 어떤 분들일까? 어떤 글이 도움이 될까? 고민해 보았는데, 이 검색어로 들어오는 분들은 현직에서 개발을 하는 사람들 혹은 개발을 하려는 사람들이 아닐까라는 생각이 들었다. 그래서 원래 이번 편에서는 jdk 설치 및 개발환경 구축 이야기를 하려고 했는데, 지난번 명령어 편에서 다루지 않은 리눅스 tail 명령어를 먼저 다루고 넘어가려고 한다.
사실 로그 분석에 cat보다 많이 쓰이는 것이 tail이기도 하다. tail은 파일의 마지막 부분을 보여 주는 명령어인데, 특히 tail -f로 오류나 서비스 로그를 실시간으로 확인할 때 매우 유용하다. 이번 글에서는 tail의 기본 사용법과 자주 쓰는 옵션, 실시간 로그 확인, grep으로 원하는 로그만 걸러 보는 방법까지 정리해 보겠다.
리눅스 tail 명령어 기본 사용법
tail은 다음과 같은 구조로 사용한다.
tail [옵션] [파일]
옵션 없이 사용하면 파일의 끝에서부터 기본값인 10줄을 출력한다. 여기서는 로그 파일 경로를 /var/log/server.log로 가정하겠다. 실제 경로는 서비스마다 다르니 형태만 참조하도록 하자. 로그 파일이 어디 있는지 모르겠다면 리눅스 로그 파일 위치 정리 글을 먼저 보고 오면 된다.
tail /var/log/server.log
그런데 실제 로그에서 오류나 문제 상황을 파악하기에 10줄은 너무 짧은 감이 있다. 이럴 때는 -n 옵션으로 출력할 줄 수를 지정한다.
tail -n 100 /var/log/server.log
반대로 숫자 앞에 +를 붙이면 “끝에서 N줄”이 아니라 “N번째 줄부터 끝까지”를 출력한다. 파일 앞부분의 헤더를 건너뛰고 싶을 때 쓸 만하다.
tail -n +100 /var/log/server.log자주 쓰는 옵션
| 옵션 | 설명 |
|---|---|
-n 숫자 | 끝에서부터 지정한 줄 수만큼 출력 (기본 10줄) |
-n +숫자 | 지정한 줄부터 파일 끝까지 출력 |
-c 숫자 | 줄이 아니라 바이트 단위로 출력 |
-f | 파일 끝을 계속 지켜보면서 새로 추가되는 내용을 실시간 출력 |
-F | -f와 같지만 파일이 교체되거나 다시 생겨도 계속 따라감 (로그 로테이션 대응) |
-q | 여러 파일을 볼 때 파일 이름 머리글을 생략 |
--pid=PID | 지정한 프로세스가 끝나면 -f도 함께 종료 |
tail -f로 로그 실시간 확인하기
tail을 쓰는 가장 큰 이유가 바로 -f(follow) 옵션이다. -f 옵션을 주면 파일의 마지막 10줄을 출력한 뒤 종료되지 않고, 파일에 새로 추가되는 내용을 계속 읽어 들여 출력해 준다. 서비스를 재시작하거나 기능을 테스트하면서 로그를 지켜볼 때 필수다.
tail -f /var/log/server.log
하지만 필자는 여기서 조금 더 옵션을 줘서 사용한다.
tail -1000f /var/log/server.log
이렇게 옵션을 주면 끝에서부터 10줄이 아닌 1000줄을 읽어 온 다음, 파일을 닫지 않고 새로 쌓이는 로그를 계속 보여 준다. 방금 전에 무슨 일이 있었는지와 지금 무슨 일이 일어나는지를 한 화면에서 볼 수 있어서 필자는 이 옵션을 상당히 애용하고 있다. 참고로 -1000f는 예전부터 쓰던 축약 형식이고, 표준 형식으로 쓰면 아래와 같다. 동작은 같다.
tail -n 1000 -f /var/log/server.log로그 로테이션에도 끊기지 않게 하려면 tail -F
운영 서버의 로그는 보통 logrotate로 하루에 한 번씩 새 파일로 교체된다. 이때 -f는 기존 파일을 계속 붙잡고 있기 때문에 교체 이후에는 아무것도 출력되지 않는 것처럼 보인다. 대문자 -F를 쓰면 같은 이름의 새 파일이 생겼을 때 자동으로 따라가 준다. 오래 띄워 둘 로그 창이라면 -F를 쓰는 편이 안전하다.
tail -F /var/log/server.log여러 로그 파일 동시에 보기
파일을 여러 개 지정하면 하나의 화면에서 같이 볼 수 있다. 출력 앞에 ==> 파일 이름 <== 머리글이 붙어서 어느 파일에서 나온 로그인지 구분된다. Nginx의 접속 로그와 에러 로그를 함께 볼 때 편하다.
tail -f /var/log/nginx/access.log /var/log/nginx/error.log리눅스 tail 명령어와 grep으로 원하는 로그만 보기
여기서 만약 Error 로그만 보고 싶다면 grep과 조합해서 쓰면 된다.
tail -1000f /var/log/server.log | grep "ERROR"
이렇게 하면 마지막 1000줄부터 읽어 들이면서 ERROR가 들어간 줄만 출력해 준다. ERROR 문구만 파악할 때 이 방법으로 조회하면 빠르게 확인할 수 있다. 반대로 grep에 “INFO”를 주면 INFO가 출력된 줄만 빠르게 찾을 수 있다. 여러 단어를 한 번에 보거나 대소문자를 무시하고 싶다면 다음과 같이 쓴다.
tail -f /var/log/server.log | grep -E "ERROR|WARN"tail -f /var/log/server.log | grep -i "exception"
grep 다음에 파이프를 한 번 더 연결해서 결과를 파일로 저장하거나 다른 명령어로 넘길 때는 출력이 버퍼에 쌓여 한참 뒤에 나오는 경우가 있다. 이럴 때는 grep에 --line-buffered를 붙이면 줄 단위로 바로 넘어간다. grep 옵션은 리눅스 find grep 명령어 사용법 글에 자세히 정리해 두었다.
tail -f /var/log/server.log | grep --line-buffered "ERROR" | tee error.logtail -f 종료 방법과 주의할 점
-f 옵션은 로그 파일을 계속 열어 두기 때문에 사용자가 직접 끊어 줄 때까지 계속 출력한다. 종료는 Ctrl+C를 누르면 된다. 그런데 실제 업무 중에 로그가 올라오는 속도가 빠르면 한 번에 끊기지 않는 경우가 있다. 이럴 때는 몇 차례 Ctrl+C를 눌러 주면 잠시 후 로그가 끊기는 것을 확인할 수 있다. 로그가 쌓이는 속도보다 화면에 표시되는 속도가 느려서 이미 받아 둔 출력이 다 그려질 때까지 시간이 걸리는 것이다. 실무에서 자주 겪는 상황이니 당황하지 않아도 된다.
로그를 실시간으로 보다가 잠시 멈춰서 위로 스크롤하거나 검색하고 싶다면 tail 대신 less +F를 쓰는 방법도 있다. Ctrl+C를 누르면 실시간 모드만 멈추고 less 화면에 그대로 남아 있어서 /ERROR처럼 검색할 수 있고, Shift+F를 누르면 다시 실시간 모드로 돌아간다. 완전히 나갈 때는 q를 누른다.
less +F /var/log/server.log
참고로 systemd로 관리하는 서비스는 로그가 파일이 아니라 journal에 쌓이는 경우가 많다. 이때는 tail -f 대신 journalctl -f를 쓴다. 자세한 사용법은 리눅스 로그 확인 방법(journalctl) 글을 참고하자.
journalctl -u nginx -ftail, head, cat, less 차이
파일 내용을 보는 명령어가 여럿이라 헷갈릴 수 있는데, 용도를 정리하면 다음과 같다.
| 명령어 | 용도 | 이럴 때 쓴다 |
|---|---|---|
cat | 파일 전체를 한 번에 출력 | 짧은 설정 파일 확인 |
head | 파일 앞부분 출력 (기본 10줄) | CSV 헤더나 파일 형식 확인 |
tail | 파일 끝부분 출력, -f로 실시간 확인 | 최근 로그, 실시간 로그 모니터링 |
less | 페이지 단위로 보면서 검색 | 큰 로그 파일을 앞뒤로 훑어볼 때 |
리눅스 tail 명령어 자주 묻는 질문
tail -f와 tail -F의 차이는?
-f는 처음 연 파일을 끝까지 따라가고, -F는 파일 이름을 따라간다. 로그 로테이션으로 파일이 새로 만들어지면 -f는 멈춘 것처럼 보이지만 -F는 새 파일로 자동으로 넘어간다.
tail -f를 켜 놨는데 로그가 안 올라온다면?
먼저 서비스가 실제로 그 파일에 로그를 쓰고 있는지 확인하자. 로그 로테이션 이후라면 -F로 다시 실행하면 되고, 권한 문제로 읽지 못하는 경우라면 sudo를 붙여야 한다. systemd 서비스라면 파일이 아니라 journalctl -f로 봐야 할 수도 있다.
파일의 중간 부분만 보고 싶다면?
head와 tail을 파이프로 연결하면 된다. 예를 들어 head -n 200 파일 | tail -n 50은 151번째 줄부터 200번째 줄까지를 보여 준다.
tail로 보던 로그에서 IP별 접속 수나 404 주소를 세고 싶다면 sed와 awk로 로그 분석하기를 참고하자.
마무리
리눅스 tail 명령어는 단순해 보이지만 서버를 운영하거나 개발을 하다 보면 하루에도 몇 번씩 쓰게 되는 명령어다. 정리하면 최근 로그는 tail -n, 실시간 로그는 tail -f, 오래 띄워 둘 로그 창은 tail -F, 원하는 로그만 보고 싶을 때는 grep과 조합하면 된다. 전체 옵션은 GNU coreutils tail 공식 문서에서 확인할 수 있다.
오늘은 여기에서 마치고 다음편에서 만나도록 하자.
첫 댓글을 남겨보세요