OS

[ Linux ] 로그 아키텍처 (Log Architecture)

jogaknabi_1023 2024. 11. 6. 13:43

 

Linux Logging System

- Kernel logging (커널 로깅) : 주로 운영체게와 관련된 정보. 특히 커널 메시지나 시스템 서비스의 로그

- User logging (사용자 로깅): 호스트 머신에서 수행된 프로세스와 서비스와 관련하여 기록된 로그

 

자료 출처: https://devconnected.com/linux-logging-complete-guide/

 

Kernel Logging

- linux에서 시스템을 나눌 때 크게 [user space <-> kernel space]로 분할해서 볼 수 있다.

- kernel space logging 은 kernel의 "Ring Buffer"을 통해 수행된다. Ring Buffer는 시스템이 부팅될 때 로그 메시지를 저장된다. 즉, 리눅스를 시작할 때 콘솔에 출력되는 로그들은 Kernel Ring Buffer에 저장되어 있던 로그들이다.

- 커널 로깅은 사용자 로깅보다 먼저 시작한다.

- 터미널에서 시스템에서 커널 관련 로그를 열려면 "dmesg" 명령을 사용해야한다. (루트 권한 필요) 

 

Kernel Logging Internals

터미널에서 dmesg로 로그를 확인했다면 사용자에게 출력하는 단계까지 오기 위해 커널 로깅을 처리하는 프로세스와 장치를 알아보자.

-  초반에는 /proc/kmsg 파일에 접근하여 syslog 데몬과 함께 로깅에 사용되었지만, 최신 시스템에서는 /dev/kmsg 가 그 역할을 대체하며 ring buffer 에 접근하며 systemd-journal 와 같은 시스템 로깅 데몬과 함께 사용된다.

- kernel ring buffer가 /dev 디렉토리의 파일에 의해 구체화되는데, 이 파일의 이름이 "kmsg"이다. kmsg는 kernel ring buffer를 읽고 쓰는데 사용되는 추상화 디바이스이며, user space가 kernel buffer ring에 접근하는 진입점이라고 볼 수 있다.

- 이전 /proc/kmsg 를 사용하였을 때는 ring buffer 가 /proc/kmsg에 데이터를 덤프하고, 커널은 klogd, 시스템 로깅은 syslog (현재는 rsyslogd로 통합됨)를 사용하여 로그를 볼 수 있었다.

 

User Logging

- user space에서 로그는 최근 배포판 기준으로 크게 syslog, journal 2가지로 나눠서 비교한다. 하지만 대부분의 최신 linux 배포판에서systemd를 적용하면서 syslogd에서 journald 로 변경되었다. 그래도 기존 호환성을 고려해서 syslogd도 같이 사용할 수 있도록 설정이 되어 있다.

항목 syslog(rsyslog) journal
저장 정보 syslog에 해당하는 특정 종류들 부팅 이후 모든 메시지
저장여부 /var/log 저장하지 않음
저장 메시지 타입 일반 text, format은 다양 바이너리형태
데몬 syslogd(rsyslogd) system-journald
순환 logrotate에 의해 4주 저장하지 않아서 부팅마다 초기화

 

 

Linux Local Logging Architecture


Rsyslog (Rocket fast System for Log Process)

- syslog 시스템의 개선된 버전으로 기존 syslogd의 대부분의 기능을 포함하면서 추가적인 기능과 성능 향상을 제공한다.

- CentOS 7, RHEL 7, Ubuntu 14.04 이후 버전으로 rsyslog를 기본 로깅 서비스로 사용하고 있다.

- 시간 기반 로깅(time-based logging)방식으로 방식을 수집한다.

 

Rsyslog 주요 파일

  • /etc/rc.d/init.d/rsyslog
    - rsyslogd 데몬을 동작시키는 스크립트
    - rsyslog 데몬의 초기화 스크립트이다. 시스템 부팅 및 종료 시 rsyslogd를 자동으로 시작하고 중지하는 역할을 한다.
  • /etc/rsyslog.conf
    - rsyslogd 데몬의 환경 설정 파일
    - rsyslog의 동작을 제어하는 규칙과 지시어를 포함한다.
    - 로그 메시지의 수신, 처리, 전달 방법 등을 설정할 수 있다.
    - 주석을 사용하여 파일에서 특정 로그 규칙을 비활성화하거나 추가 설정을 할 수 있다.
  •  /etc/sysconfig/rsyslog
    - rsyslogd 데몬 실행과 관련된 옵션이 설정되는 파일
    - rsyslog 데몬의 설정을 구성하기 위한 파일
    - rsyslogd 서비스를 실행하는 데 필요한 환경 변수와 값들을 포함한다.
  •  /sbin/syslogd
    - 실제 rsyslogd 데몬 실행 명령
    - rsyslogd 데몬의 실행 가능한 파일(binary)이다.
    - rsyslogd 데몬을 시작하고 관리하는 역할을 담당한다.

/etc/rsyslog.conf 포맷

자료 출처: https://h-susu.tistory.com/4

1. facility : 어떤 서비스

kind Description
모든 서비스
daemon 데몬에 의한 메시지
cron cron 데몬에 의해 발생되는 메시지
kern kernel 메시지
authpriv 인증 및 보안 메시지
syslog syslogd 관련 메시지
user 사용자로부터 생성된 프로세스
local0 ~ local7 시스템 부팅 메시지 기록 등

 

2. priority : 어떤 상황

kind Description
* 모든 상황
emerg 시스템이 사용 불가능한(unusable) 상태
alert 즉각적인 조치가 필요한 상황
crit 하드웨어 등의 심각한 오류가 발생한 상황 (critical condition)
err     일반적인 에러/오류가 발생한 상황
warning 경고 메시지
notice 에러/오류는 아니지만 관리자의 조치가 필요한 상황
info 의미 있는 정보 관련 메시지
debug 디버깅용 메시지

 

3. action : 어디로 로그 전송

action  설명 
현재 로그인한 모든 사용자의 스크린으로 메세지를 보냄 
host  지정된 호스트로 메세지를 보냄 
user  지정된 사용자의 스크린으로 메세지를 보냄 
 file 특정 파일에 메세지를 보냄 

 

 

journald

- rsyslog와 핵심차이는 "저장여부"이다.

- 시스템의 모든 로그를 이벤트 기반 로깅 방식(Event-based logging)으로 수집한다. 그래서 시스템의 상태 변화와 관련 로그들을 정확하게 기록할 수 있다.

- 로그파일은 systemd에 의해 journal이라는 바이너리 형식으로 저장되므로 일반적인 cat 또는 less 명령어를 사용하여 파일을 검사할 수 없다. 그래서 journalctl이라는 cli를 사용한다. journalctl -r 을 통해 최신 저널 로그 중심으로 볼 수 있다.

 

journalctl

- $ journal -u <service name>  특정 서비스 이름을 넣어서 사용이 가능하다. 그래서 자주 많이 사용되는 명령어가 $ journalctl -r -u <service name> 이다.

- 그 외에는 $ journalctl -since '2024-11-06' 또는 $ journalctl -since '2022-11-06' -until '2024-11-08' 과 같이 날짜 설정값도 가능하다.

 

1. 기본 사용법
journalctl: 모든 로그 항목을 출력한다.
journalctl -f: 실시간으로 로그를 출력한다. 새로운 로그가 생성되면 자동으로 업데이트
journalctl -n: 최근 N개의 로그 항목을 출력한다.

2. 로그 조회
journalctl --since "YYYY-MM-DD HH:MM:SS": 특정 날짜 및 시간 이후의 로그를 조회한다.
journalctl --until "YYYY-MM-DD HH:MM:SS": 특정 날짜 및 시간 이전의 로그를 조회한다.
journalctl --identifier "IDENTIFIER": 특정 프로세스나 유닛의 로그를 조회한다.
journalctl --grep "KEYWORD": 특정 키워드를 포함하는 로그를 검색한다.

3. 로그 필터링
journalctl -p LEVEL: 특정 로그 레벨을 지정하여 해당 레벨의 로그만 출력한다. 예를 들어, -p err은 오류 로그만 표시한다.
journalctl --boot: 현재 부팅 세션에 대한 로그만 출력한다.
journalctl -u UNIT: 특정 유닛에 대한 로그만 출력한다. 예를 들어, -u apache2.service는 Apache 서비스의 로그만 표시된다.

4. 로그 표시 형식
journalctl -o FORMAT: 로그 항목의 표시 형식을 지정한다. 일반적으로 short, short-iso, verbose 등의 형식을 사용할 수 있다.

5. 로그 분석
journalctl --field=FIELD: 특정 필드를 기준으로 로그를 정렬한다. 예를 들어, --field=_SOURCE_MONOTONIC_TIMESTAMP은 타임스탬프 기준으로 로그를 정렬한다.
journalctl --output=FILE: 로그를 파일로 저장한다. 다른 도구나 스크립트에서 로그를 분석할 때 유용하다.

 

logrotate

- 리눅스와 유닉스 기반 시스템에서 로그 파일을 관리하는데 사용되는 유틸리티.

- 시간이 지나면서 로그 파일은 점점 축적되기 때문에 디스크 공간을 차지하고 로그 파일 분석을 어렵게 만들 수 있다. 그래서 logrotate 는 이러한 문제를 해결하기 위해 로그 파일의 크기를 제한하거나 일정 기간 후에 로그 파일을 백업하고 삭제하는 등의 작업을 자동화한다.

- 주로 cron 작업으로 실행. 일반적으로 /etc/logrotate.conf 또는 /etc/logrotate.d 디렉토리에 있는 설정 파일을 사용하여 동작한다.

 

 

참고문헌

logging system : https://devconnected.com/linux-logging-complete-guide/

rsyslog : https://velog.io/@qlgks1/%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A1%9C%EA%B7%B8-system-log-journal-log

journal, logrotate: https://m.blog.naver.com/hj_kim97/223107429491

 

'OS' 카테고리의 다른 글

[ Linux ] Boot Process - BIOS VS UEFI  (1) 2024.11.09
[ Storage ] DAS NAS SAN  (0) 2024.11.08
[ Linux ] Systemd 세부 특징  (1) 2024.11.04
[ Linux ] Daemon - SysVinit & Systemd  (0) 2024.11.02
[ Monitoring ] AWS EC2 CloudWatch Metrics  (0) 2024.10.30