Linux에서 특정 시간대 및 키워드 기반 로그 분석 방법

지정된 시각 이후의 로그 항목 추출

로그 파일의 시작 부분이 날짜와 시간 정보를 포함하는 경우, 이를 기준으로 조건 검색이 가능하다. 가장 일반적인 형태인 YYYY-MM-DD HH:MM:SS 형식을 활용하면 간단한 문자열 비교로도 필터링이 가능하다.

기본 문자열 비교 방식

다음은 2025년 4월 15일 오전 9시 30분 이후의 모든 로그를 출력하는 예제이다.

awk '$0 >= "2025-04-15 09:30:00"' application.log

이 방법은 로그 라인의 맨 앞에 표준 시간 형식이 위치할 때 효과적으로 작동한다.

밀리초를 포함한 스프링 부트 로그 처리

스프링 부트 애플리케이션은 일반적으로 밀리초 단위까지 기록한다.

2025-04-15 10:01:23.456 INFO  c.e.AppController : User login successful

이 경우에도 동일한 방식으로 필터링이 가능하나, 기준 시각에 밀리초를 명시하는 것이 정확하다.

awk '$1" "$2 >= "2025-04-15 09:30:00.000"' application.log

여기서 $1은 날짜, $2는 시각 필드이며, 두 필드를 결합해 비교한다.

고급 방식: 타임스탬프 기반 정밀 비교

비표준 형식이나 일자 변환이 필요한 경우, date 명령어를 사용해 타임스탬프로 변환 후 비교할 수 있다.

start_time="2025-04-15 09:30:00"
start_ts=$(date -d "$start_time" +%s)

awk -v target="$start_ts" '{
    cmd = "date -d \"" $1 " " $2 "\" +%s"
    if ((cmd | getline current_ts) > 0) {
        if (current_ts >= target) print $0
    }
    close(cmd)
}' application.log

이 방식은 성능은 다소 저하되지만, 다양한 로그 형식에 유연하게 대응할 수 있다.

특정 시간 범위 내 로그 조회

시작과 종료 시각 모두 지정하여 해당 구간의 로그만 추출할 수 있다.

awk '$0 >= "2025-04-15 09:00:00" && $0 <= "2025-04-15 10:00:00"' application.log

이 쿼리는 오전 9시부터 10시 사이의 모든 로그를 반환한다. 여전히 문자열 사전순 비교 기반이므로, 올바른 형식 유지가 중요하다.

키워드 기반 로그 검색 전략

문자열 패턴 또는 에러 메시지를 기반으로 로그를 찾는 일반적인 방법부터 고급 기법까지 정리한다.

기본 검색: grep 활용

특정 타임스탬프나 에러 코드를 포함한 라인을 찾기 위해 grep을 사용한다.

grep "ERROR" /var/log/app.log
grep "2025-07-09 09:51:37.921" app.log

맥락을 함께 보기 위해 주변 행도 출력할 수 있다.

grep -C 5 "NullPointerException" app.log  # 전후 5행 포함
grep -B 3 -A 7 "timeout" app.log           # 이전 3행, 이후 7행

대용량 로그 파일 처리

수기가 바이트 이상의 큰 파일에서는 전체 출력보다는 결과를 임시 파일로 저장하거나 less로 스트리밍 처리하는 것이 좋다.

grep "critical error" huge-app.log > snippet.log
less snippet.log

또는 인터랙티브 뷰잉 도구를 사용:

less app.log
# 실행 후 / 입력 → "error" 검색 → n 키로 다음 항목 이동

구조화된 로그 형식 처리 (JSON/XML)

로그가 JSON 형식일 경우, 가독성을 높이고 정확한 검색을 위해 jq 도구를 활용한다.

cat app.log | jq -r 'select(.timestamp | contains("2025-07-09T09:51:37"))'

XML 형식이라면 xmllint으로 포맷팅 후 검색:

cat app.log | xmllint --format - 2>/dev/null | grep "errorCode"

이처럼 구조화된 데이터는 파싱 도구와 함께 사용해야 의미 있는 분석이 가능하다.

참고 사항

  • ps -ef는 프로세스 목록 확인용이며, 로그 파일 검색에는 적합하지 않다.
  • 로그 파일 경로를 모를 경우, 설정 파일(application.yml, logback.xml)에서 logging.file.path 등을 확인한다.
  • 실시간 모니터링이 필요하면 tail -f + grep --line-buffered 조합을 고려한다.

태그: awk grep less jq xmllint

6월 17일 04:49에 게시됨