본문으로 바로가기
TaeyoungKim.dev

리눅스 grep으로 여러 로그에서 error 찾기: 대소문자·파일명·줄번호 확인법

리눅스작성 약 3분 읽기TaeyoungKim
LinkedInX

로그에는 분명 ERROR가 있는데 grep error를 치니 아무것도 안 나온다. 오류가 사라진 걸까? 대개는 검색 범위나 글자 모양이 달랐을 뿐이다. grep이 보는 대상부터 하나씩 좁혀 보자.

grep은 로그의 무엇을 찾아줄까?

grep 'error' app.log는 app.log에서 패턴과 맞는 줄을 출력한다. 파일 전체를 훑어 보여 주는 cat, 끝부분부터 보는 tail과 목적이 다르다. grep은 과거의 여러 줄 중에서 관심 있는 줄을 골라낸다.

주의할 점은 기본 검색이 대소문자를 구별한다는 것이다. error는 ERROR와 다르다. 또 grep 'error' app.log라고 했다면 다른 파일 worker.log는 아예 읽지 않는다. 검색 결과가 없다고 곧바로 '오류가 없다'고 말하기 어려운 이유다.

두 로그에서 error와 ERROR를 함께 찾으려면?

운영 로그 대신 임시 폴더에 짧은 파일 두 개를 만든다. 아래의 시간과 사건은 동작을 보기 위한 예시다.

bash
demo_dir=$(mktemp -d)
printf '%s\n' \
  '09:00 INFO boot' \
  '09:01 WARN retry' \
  '09:02 ERROR db timeout' \
  '09:03 INFO recovered' > "$demo_dir/app.log"
printf '%s\n' \
  '09:00 INFO started' \
  '09:04 error cache miss' \
  '09:05 INFO ready' > "$demo_dir/worker.log"
cd "$demo_dir"
grep -nH 'error' ./*.log
text
./worker.log:2:09:04 error cache miss

app.log의 ERROR는 빠졌다. 이제 -i를 더하면 대소문자를 무시한다.

bash
grep -inH 'error' ./*.log
text
./app.log:3:09:02 ERROR db timeout
./worker.log:2:09:04 error cache miss

두 결과의 앞부분은 파일명:줄번호:내용이다. -i는 대소문자 무시, -n은 줄번호, -H는 파일명 표시를 뜻한다. 여러 파일을 읽을 때 파일명을 항상 보이게 지정해 두면, 나중에 검색 범위가 한 파일로 바뀌어도 출력 형식이 갑자기 달라지지 않는다. ./*.log는 현재 폴더의 .log 파일 이름을 셸이 먼저 펼친다. 하위 폴더까지 자동으로 뒤지는 표현은 아니다.

찾은 줄만 보고 원인을 단정해도 될까?

ERROR db timeout 한 줄만 보면 그 직전에 재시도가 있었는지, 직후에 회복됐는지 놓칠 수 있다. 같은 파일의 앞뒤 한 줄을 보려면 -C 1을 붙인다.

bash
grep -inH -C 1 'error' ./app.log
text
./app.log-2-09:01 WARN retry
./app.log:3:09:02 ERROR db timeout
./app.log-4-09:03 INFO recovered

맞은 줄에는 :, 문맥으로 따라온 줄에는 -가 쓰인다. 여기서는 오류 전 재시도와 오류 뒤 회복을 함께 볼 수 있다. 물론 세 줄만으로 실제 장애 원인을 확정할 수는 없다. 필요한 맥락이 더 넓다면 less app.log로 돌아가 앞뒤를 읽는 편이 낫다.

하위 폴더에 로그가 있다면 범위를 의도적으로 정해 grep -rinH 'error' "$demo_dir"처럼 재귀 검색한다. 반대로 /var/log 전체를 습관적으로 뒤지면 관련 없는 파일과 읽기 권한 오류가 뒤섞일 수 있다. 먼저 애플리케이션과 로그 위치를 확인하자.

검색 결과가 없을 때 무엇을 확인할까?

grep은 일치하는 줄이 없으면 출력 없이 종료한다. 다음 명령으로 종료 상태를 확인할 수 있다.

bash
grep -n 'fatal' ./app.log
echo $?
text
1

이 예제의 1은 읽은 파일에서 일치하는 줄을 못 찾았다는 뜻이다. 파일을 못 읽는 오류와는 다르다. 실행 직후의 $?를 봐야 한다. 다른 명령을 먼저 실행하면 그 명령의 상태로 바뀐다.

결과가 비었다면 순서는 간단하다. pwd와 파일 이름으로 대상을 확인하고, error/ERROR처럼 대소문자를 확인한 다음, 최근 몇 줄만 봤던 것은 아닌지 범위를 확인한다. 검색 대상이 맞는데도 결과가 없다면 그때 '이 파일에서는 못 찾았다'고 말할 수 있다.

핵심 요약

grep은 파일의 줄을 고른다. 두 로그를 함께 볼 때는 ./*.log로 대상 파일을 지정하고, -i로 대소문자를, -nH로 줄번호와 파일명을 확인하자. 찾은 줄의 의미가 애매하면 -C 1로 문맥을 보고, 결과가 비었다면 파일 범위부터 다시 확인한다.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Linux#리눅스 grep#로그 에러 검색#grep 대소문자 무시#grep 줄번호

함께 읽으면 좋은 글