'tail'로 Linux 로그 파일의 실시간 변경 사항 모니터링하기

LinuxBeginner
지금 연습하기

소개

Linux 로그는 시스템 모니터링과 문제 해결의 핵심으로, 시스템 내부에서 어떤 일이 일어나는지 파악할 수 있는 귀중한 정보를 제공합니다. 이 튜토리얼에서는 Linux 로그의 기본 개념과 다용도로 활용할 수 있는 'tail' 명령을 사용해 로그를 효과적으로 모니터링하는 방법을 살펴봅니다.

로그 파일이 저장되는 위치와 내용을 확인하는 방법, 실시간 변경 사항을 추적하는 방법, 특정 정보를 추출하는 방법을 학습합니다. 이러한 기술은 Linux 시스템을 다루는 모든 사람에게 필수적이며, 문제를 진단하고 시스템 상태를 점검하며 시스템 내부에서 어떤 작업이 진행되는지 이해하는 데 도움이 됩니다.

Linux 로그 파일과 저장 위치 이해하기

이 단계에서는 /var/log 디렉터리를 살펴보고 일반적인 시스템 로그 항목의 구조를 확인합니다. Linux 시스템은 활동 내역, 오류, 이벤트를 로그 파일에 기록하며, 이러한 로그는 문제 해결과 시스템 모니터링에 사용되는 주요 정보원입니다.

Linux 로그는 어디에 저장될까요?

Ubuntu 22.04를 비롯한 대부분의 Linux 배포판은 로그 파일을 /var/log 디렉터리에 저장합니다. 이 디렉터리에 어떤 로그 파일이 있는지 확인해 보겠습니다.

터미널을 열고 다음 명령을 입력합니다.

ls -l /var/log

다음과 비슷한 결과가 표시됩니다.

total 1048
drwxr-x---  2 root   adm      4096 May  2 09:52 apache2
drwxr-xr-x  2 root   root     4096 Apr 30 15:27 apt
-rw-r-----  1 syslog adm    183867 May  2 10:18 auth.log
-rw-r--r--  1 root   root     1112 Nov 17  2022 alternatives.log
drwxr-xr-x  2 root   root     4096 Apr 20  2022 cups
-rw-r-----  1 syslog adm    308342 May  2 10:18 kern.log
-rw-rw-r--  1 root   utmp        0 Apr 20  2022 lastlog
drwxr-xr-x  2 root   root     4096 Nov  8  2022 nginx
-rw-r-----  1 syslog adm    473079 May  2 10:18 syslog

실제 파일과 디렉터리는 사용 중인 이미지와 설치된 소프트웨어에 따라 달라집니다. 이 실습 환경에서는 /var/log/syslog, /var/log/auth.log, /var/log/kern.log에 실제와 유사한 샘플 항목을 생성하므로, 모든 명령을 동일한 조건에서 연습할 수 있습니다.

자주 사용하는 로그 파일과 내용

다음은 자주 접하게 될 중요한 로그 파일입니다.

  • /var/log/syslog: 일반적인 시스템 메시지를 포함합니다.
  • /var/log/auth.log: 인증 시도와 사용자 관리 관련 기록을 저장합니다.
  • /var/log/kern.log: 커널 메시지와 오류를 포함합니다.
  • /var/log/apt: 패키지 관리 로그가 저장된 디렉터리입니다.

이 파일 중 하나의 내용을 확인해 보겠습니다. 로그 모니터링을 배우는 단계이므로 먼저 시스템 로그를 간단히 살펴봅니다.

sudo head -n 20 /var/log/syslog

head 명령은 파일의 처음 몇 줄을 표시합니다. 여기서는 20줄을 표시합니다. 일부 로그 파일은 관리자 권한이 있는 사용자만 읽을 수 있으므로 sudo를 사용합니다.

다음과 비슷한 결과가 표시됩니다.

May  2 08:23:15 ubuntu systemd[1]: Started Daily apt download activities.
May  2 08:23:15 ubuntu systemd[1]: Starting Daily apt upgrade and clean activities...
May  2 08:23:15 ubuntu systemd[1]: apt-daily-upgrade.service: Deactivated successfully.
May  2 08:23:15 ubuntu systemd[1]: Finished Daily apt upgrade and clean activities.
May  2 08:37:16 ubuntu systemd[1]: Starting Message of the Day...
May  2 08:37:16 ubuntu systemd[1]: motd-news.service: Deactivated successfully.
May  2 08:37:16 ubuntu systemd[1]: Finished Message of the Day.
...

각 로그 항목은 다음과 같은 형식으로 구성되어 있습니다.

  • 날짜와 시간
  • 호스트 이름(이 예시에서는 ubuntu)
  • 로그를 생성한 프로그램 또는 서비스
  • 실제 로그 메시지

로그 항목 구조 이해하기

대부분의 로그 항목은 일정한 형식을 따르므로 읽고 처리하기가 쉽습니다. 일반적으로 다음과 같은 정보가 포함됩니다.

  • 타임스탬프: 이벤트가 발생한 시각
  • 호스트 이름: 시스템의 이름
  • 서비스/애플리케이션: 로그를 생성한 주체
  • 메시지: 실제로 발생한 일에 대한 정보

이제 로그의 위치와 구조를 이해했으므로, tail 명령을 사용해 로그 파일의 최신 항목을 확인해 보겠습니다.

기본 'tail' 명령으로 로그 파일 확인하기

이 단계에서는 tail을 사용해 여러 실습 로그 파일의 최근 항목을 확인합니다. head가 파일의 앞부분을 보여준다면, tail은 일반적으로 최신 로그 항목이 있는 파일의 끝부분을 보여줍니다.

'tail' 명령 기본 사용법

tail 명령의 기본 구문은 다음과 같습니다.

tail [options] [file]

기본적으로 tail은 파일의 마지막 10줄을 표시합니다. 시스템 로그에 사용해 보겠습니다.

sudo tail /var/log/syslog

가장 최근의 로그 항목 10개가 표시됩니다.

May  2 10:15:32 ubuntu systemd[1]: Starting Clean php session files...
May  2 10:15:32 ubuntu systemd[1]: phpsessionclean.service: Deactivated successfully.
May  2 10:15:32 ubuntu systemd[1]: Finished Clean php session files.
May  2 10:17:01 ubuntu CRON[8752]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:14 ubuntu systemd[1]: Started Session 4 of User labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413

표시할 줄 수 지정하기

상황에 따라 10줄만으로는 필요한 맥락을 파악하기 어려울 수 있습니다. -n 옵션을 사용하면 표시할 줄 수를 지정할 수 있습니다.

sudo tail -n 5 /var/log/syslog

파일의 마지막 5줄만 표시됩니다.

May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:14 ubuntu systemd[1]: Started Session 4 of User labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413

인증 로그 확인하기

/var/log/auth.log 파일에는 사용자 인증과 보안 관련 이벤트가 기록됩니다. 최근 항목을 확인해 보겠습니다.

sudo tail -n 15 /var/log/auth.log

다음과 비슷한 결과가 표시될 수 있습니다.

May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413
May  2 10:18:15 ubuntu sshd[8755]: pam_unix(sshd:session): session closed for user labex
May  2 10:18:15 ubuntu systemd-logind[698]: Session 4 logged out. Waiting for processes to exit.
May  2 10:18:15 ubuntu systemd-logind[698]: Removed session 4.
May  2 10:20:01 ubuntu sudo:    labex : TTY=pts/0 ; PWD=/home/labex ; USER=root ; COMMAND=/usr/bin/tail /var/log/syslog
May  2 10:20:01 ubuntu sudo: pam_unix(sudo:session): session opened for user root(uid=0) by labex(uid=1000)
May  2 10:20:01 ubuntu sudo: pam_unix(sudo:session): session closed for user root
May  2 10:21:15 ubuntu sudo:    labex : TTY=pts/0 ; PWD=/home/labex ; USER=root ; COMMAND=/usr/bin/tail -n 5 /var/log/syslog
May  2 10:21:15 ubuntu sudo: pam_unix(sudo:session): session opened for user root(uid=0) by labex(uid=1000)
May  2 10:21:15 ubuntu sudo: pam_unix(sudo:session): session closed for user root

이 로그에는 사용자 로그인 시도, 세션 시작과 종료, sudo 명령 사용 내역이 나타납니다. 보안 모니터링과 사용자 접근 문제 해결에 필수적인 로그입니다.

커널 로그 살펴보기

커널은 Linux 운영 체제의 핵심입니다. /var/log/kern.log 파일에는 커널이 생성한 메시지가 기록되며, 하드웨어와 드라이버 문제를 진단하는 데 유용합니다.

sudo tail -n 10 /var/log/kern.log

다음과 비슷한 결과가 표시될 수 있습니다.

May  2 09:15:02 ubuntu kernel: [16789.456123] USB 1-1: new high-speed USB device number 3 using xhci_hcd
May  2 09:15:02 ubuntu kernel: [16789.605432] usb 1-1: New USB device found, idVendor=0781, idProduct=5571, bcdDevice= 1.00
May  2 09:15:02 ubuntu kernel: [16789.605436] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
May  2 09:15:02 ubuntu kernel: [16789.605438] usb 1-1: Product: Ultra
May  2 09:15:02 ubuntu kernel: [16789.605440] usb 1-1: Manufacturer: SanDisk
May  2 09:15:02 ubuntu kernel: [16789.605442] usb 1-1: SerialNumber: 4C530001211124120222
May  2 09:15:02 ubuntu kernel: [16789.606521] usb-storage 1-1:1.0: USB Mass Storage device detected
May  2 09:15:02 ubuntu kernel: [16789.606705] scsi host3: usb-storage 1-1:1.0
May  2 09:15:03 ubuntu kernel: [16790.624553] scsi 3:0:0:0: Direct-Access     SanDisk  Ultra            1.00 PQ: 0 ANSI: 6
May  2 09:15:03 ubuntu kernel: [16790.625045] sd 3:0:0:0: Attached scsi generic sg1 type 0

이제 로그 파일의 최신 항목을 확인하는 방법을 익혔으므로, tail 명령의 가장 강력한 기능 중 하나인 실시간 로그 모니터링을 살펴보겠습니다.

'tail -f'로 실시간 로그 모니터링하기

이 단계에서는 로그 파일을 추적하면서 새 항목을 생성하고, 해당 항목이 즉시 표시되는지 확인합니다. -f 옵션은 "follow"의 약자로, 파일을 열어 둔 상태에서 새 줄이 추가될 때마다 화면에 표시합니다. 문제 해결과 모니터링에 매우 유용합니다.

'tail -f' 이해하기

-f 옵션을 사용하면 tail이 파일을 계속 열어 두고 새 줄이 추가될 때마다 지속적으로 표시합니다. 따라서 로그 파일을 실시간으로 확인하면서 이벤트가 발생하는 즉시 파악할 수 있습니다.

시스템 로그 실시간 모니터링

-f 옵션을 사용해 시스템 로그를 실시간으로 모니터링해 보겠습니다.

sudo tail -f /var/log/syslog

명령을 실행하면 로그 파일의 최신 항목이 표시되고, 새 항목이 추가될 때마다 터미널에 계속 나타납니다.

로그 항목을 생성하려면 새 터미널 창을 열고(Ctrl+Alt+T를 누름) 테스트 메시지를 추가합니다.

echo "$(date '+%b %e %T') ubuntu $(whoami): This is a test message from user $(whoami)" | sudo tee -a /var/log/syslog

tee -a는 메시지를 실습용 시스템 로그에 추가합니다. 이제 첫 번째 터미널로 돌아가 tail -f의 출력을 확인하면 다음과 같은 테스트 메시지가 표시됩니다.

May  2 10:34:45 ubuntu labex: This is a test message from user labex

메시지를 몇 개 더 추가해 실시간 표시를 확인합니다.

echo "$(date '+%b %e %T') ubuntu labex: System test number 2" | sudo tee -a /var/log/syslog
echo "$(date '+%b %e %T') ubuntu labex: Monitoring logs is fun!" | sudo tee -a /var/log/syslog

각 메시지는 로그에 기록되는 즉시 tail -f를 실행 중인 터미널에 나타납니다.

로그 확인을 마쳤다면 Ctrl+C를 눌러 tail -f를 중지하고 명령 프롬프트로 돌아갑니다.

인증 활동 모니터링

로그인 및 인증 관련 이벤트를 확인하기 위해 인증 로그를 모니터링해 보겠습니다.

sudo tail -f /var/log/auth.log

이 명령을 실행하면 사용자 로그인, sudo 명령 사용, 인증 실패와 같은 인증 활동이 실시간으로 표시됩니다.

새 터미널을 열고 다음 샘플 이벤트를 추가하여 인증 관련 로그 항목을 생성합니다.

echo "$(date '+%b %e %T') ubuntu sudo: labex ran /usr/bin/ls /root" | sudo tee -a /var/log/auth.log

tail -f를 실행 중인 터미널에 새 항목이 나타납니다.

May  2 10:38:23 ubuntu sudo: labex ran /usr/bin/ls /root

관찰을 마쳤다면 다시 Ctrl+C를 눌러 tail -f를 중지합니다.

실시간 로그 모니터링의 활용 사례

실시간 로그 모니터링은 다음과 같은 여러 상황에서 매우 유용합니다.

  • 문제 해결: 무언가 정상적으로 작동하지 않을 때 로그를 실시간으로 확인하면 원인을 찾는 데 도움이 됩니다.
  • 보안 모니터링: 인증 로그를 관찰하면 승인되지 않은 접근 시도를 감지할 수 있습니다.
  • 애플리케이션 디버깅: 개발자는 테스트 중 애플리케이션 내부에서 어떤 일이 일어나는지 로그를 통해 확인할 수 있습니다.
  • 시스템 관리: 관리자는 유지보수나 설정 변경 중 시스템 로그를 모니터링할 수 있습니다.

예를 들어 네트워크 문제를 해결하는 중이라면 연결을 시도하면서 시스템 로그를 확인하고, 그 과정에서 발생하는 오류 메시지를 찾을 수 있습니다.

tail -f를 사용한 실시간 로그 모니터링을 익히면 시스템 동작을 발생 시점에 파악할 수 있는 강력한 도구를 갖추게 됩니다.

더욱 효율적인 분석을 위한 로그 정보 필터링

이 단계에서는 tailgrepawk와 함께 사용해 필요한 로그 항목에 집중합니다. 이러한 필터를 사용하면 대용량 로그 파일에서 필요한 정보만 선택하거나 형식을 정리하여 분석하기 쉬운 형태로 만들 수 있습니다.

'tail'과 'grep' 함께 사용하기

grep 명령은 텍스트에서 특정 패턴을 검색합니다. tail과 함께 사용하면 특정 키워드나 패턴에 해당하는 로그 항목만 필터링할 수 있습니다. 기본 구문은 다음과 같습니다.

tail [options] [file] | grep "pattern"

몇 가지 실용적인 예제를 살펴보겠습니다.

오류 메시지 찾기

시스템 로그에서 오류 메시지를 찾으려면 "error"라는 단어를 필터링할 수 있습니다.

sudo tail -n 100 /var/log/syslog | grep -i "error"

grep-i 옵션은 대소문자를 구분하지 않고 검색하도록 설정합니다. 따라서 "error", "Error", "ERROR" 등을 모두 검색할 수 있습니다. 다음과 같은 결과가 표시될 수 있습니다.

May  2 09:23:45 ubuntu systemd[1]: Failed to start Apache HTTP Server: Job failed with error code.
May  2 09:45:12 ubuntu kernel: [12345.678901] Buffer I/O error on device sdb1, logical block 123456

결과가 표시되지 않는다면 로그의 마지막 100줄에 오류 메시지가 없다는 뜻입니다.

특정 서비스 모니터링

특정 서비스나 프로그램의 로그만 필터링하여 모니터링할 수도 있습니다. 예를 들어 SSH 관련 활동을 확인하려면 다음 명령을 사용합니다.

sudo tail -n 100 /var/log/auth.log | grep "sshd"

인증 로그에서 SSH와 관련된 항목만 표시됩니다.

May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413
May  2 10:18:15 ubuntu sshd[8755]: pam_unix(sshd:session): session closed for user labex

실시간 필터링 모니터링

실시간 모니터링과 필터링을 결합하면 특정 이벤트가 발생하는 순간 확인할 수 있습니다.

sudo tail -f /var/log/syslog | grep --line-buffered "test"

--line-buffered 옵션을 사용하면 grep이 결과를 버퍼에 모아 두지 않고 일치하는 줄을 즉시 출력합니다. tail -f와 함께 사용할 때 특히 중요합니다.

이제 다른 터미널에서 일치하는 테스트 메시지를 추가합니다.

echo "$(date '+%b %e %T') ubuntu labex: This is a test message for grep filtering" | sudo tee -a /var/log/syslog

첫 번째 터미널에는 grep이 "test"를 기준으로 필터링하므로 다른 로그 메시지는 표시되지 않고 이 메시지만 나타납니다.

여러 패턴을 사용한 고급 필터링

grep에서 OR 연산자(|)를 사용하면 여러 패턴을 검색할 수 있습니다.

sudo tail -n 100 /var/log/syslog | grep -E "error|warning|critical"

-E 옵션은 확장 정규 표현식을 활성화하여 OR 연산자를 사용할 수 있게 합니다. 이 명령은 "error", "warning", "critical" 중 하나라도 포함된 줄을 표시합니다.

'awk'로 특정 정보 추출하기

더 고급 필터링과 형식 지정이 필요하다면 awk 명령을 사용할 수 있습니다. 예를 들어 syslog에서 시간과 메시지만 추출하려면 다음 명령을 실행합니다.

sudo tail -n 10 /var/log/syslog | awk '{print $3, $5, $6, $7, $8, $9, $10}'

이 명령은 각 로그 항목에서 지정한 필드만 추출하므로, 가장 중요한 정보에 집중하기가 쉬워집니다.

이러한 필터링 기법을 익히면 대용량 로그 파일을 효율적으로 분석하고, 문제 해결과 모니터링에 필요한 정보만 정확하게 추출할 수 있습니다.

요약

'tail' 명령을 사용해 Linux 로그 파일의 실시간 변경 사항을 모니터링하는 실습을 완료한 것을 축하합니다. 이번 실습에서 다음과 같은 중요한 기술을 익혔습니다.

  1. Linux 로그 파일 이해하기: 로그가 저장되는 위치와 포함된 정보, 로그 항목의 구조를 이해했습니다.

  2. 기본적인 로그 확인: tail 명령으로 로그 파일의 최신 항목을 확인하고, 표시할 줄 수를 지정할 수 있습니다.

  3. 실시간 모니터링: tail -f를 사용해 로그가 갱신되는 과정을 지켜보고, 시스템 활동을 관찰하거나 문제가 발생하는 즉시 원인을 파악할 수 있습니다.

  4. 로그 정보 필터링: tailgrep, awk와 같은 도구와 함께 사용해 로그에서 특정 정보를 추출하고 분석 효율을 높일 수 있습니다.

이러한 기술은 초보자부터 숙련된 관리자까지 Linux 시스템을 다루는 모든 사람에게 필수적입니다. 로그 분석은 시스템 유지보수, 문제 해결, 보안 모니터링의 기본 요소입니다.

Linux 학습을 계속하다 보면 이러한 로그 모니터링 기법이 시스템을 더 깊이 이해하고, 문제를 더 빠르게 진단하며, 더욱 안전하고 안정적인 환경을 유지하는 데 큰 도움이 된다는 것을 알게 될 것입니다.