Linux Logging System
- Kernel logging (커널 로깅) : 주로 운영체게와 관련된 정보. 특히 커널 메시지나 시스템 서비스의 로그
- User logging (사용자 로깅): 호스트 머신에서 수행된 프로세스와 서비스와 관련하여 기록된 로그
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 포맷
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 |