OS/Linux

Log, Logrotate, Cronolog

엔지니어1 2024. 3. 26. 16:44

Logrotate와 Cronolog를 알아보기 전 Log에 대해 먼저 알아보겠습니다.

앞서 로그를 간단하게 확인하는 방법에 대해 설명해 드렸는데요!

2024.03.18 - [OS/Linux] - Linux 로그 간단하게 확인하는 방법

 

Linux 로그 간단하게 확인하는 방법

OS 실행, 시스템 실행, 보안 등 의도치 않은 에러가 발생하거나, 버그가 걸렸다면 시스템에 저장되는 로그를 확인해야 합니다. 오늘은 어떤 오류가 발생했을 때 어떤 로그를 확인해야 하는지 간

engineer1.tistory.com


이 글은 정말 간단하게 로그가 저장되어 있는 파일을 출력하고, 어떤 값이 출력되는지 알아봤었습니다.

오늘은 로그가 어떻게 관리되고 저장되는지 알아보겠습니다.

 

1) 로그

로그는 컴퓨터 시스템이나 네트워크에서 발생하는 이벤트나 활동을 기록하는 정보입니다. 

이러한 정보는 주로 시스템의 상태, 동작, 이벤트 발생 등을 추적하고 기록하기 위해 사용됩니다. 

로그는 일반적으로 시간 순서대로 기록되며, 다양한 형식과 수준의 상세함을 가질 수 있습니다.

주요 로그 유형에는 시스템 로그, 보안 로그, 애플리케이션 로그, 네트워크 로그 등이 있습니다.



1-1) 로그가 필요한 이유

시스템 모니터링
시스템의 상태를 모니터링하고 추적하는 데 사용됩니다. 로그를 통해 시스템의 작동 여부를 파악하고 문제가 발생한 경우 이를 진단할 수 있습니다.

문제 해결
시스템에서 발생하는 문제를 해결하기 위해 로그를 분석합니다. 이를 통해 문제의 원인을 식별하고 적절한 조치를 취할 수 있습니다.

보안 감시
보안 로그는 시스템의 보안 상태를 감시하고 이상 징후를 탐지하는 데 사용됩니다. 이러한 로그는 해킹 시도, 비인가된 액세스, 악성 소프트웨어 활동 등을 식별하는 데 도움이 됩니다.

성능 분석
로그는 시스템의 성능을 분석하고 최적화하는 데 사용됩니다. 로그를 분석하여 시스템의 부하, 응답 시간, 자원 사용량 등을 파악할 수 있습니다.

그 밖에도 로그는 다양한 방면으로 사용하고, 일상적인 운영과 관리, 보안 및 문제 해결에 필수적입니다.

 

1-2) 로그를 저장하고 관리하는 데몬

init프로세스를 사용하다 2010년 이후로 systemd를 최초로 출시하고 점차적으로 바꿔었습니다.

이 과정에서 syslog에서 rsyslog로 성능과 보안성을 향상되어 바뀌었고 최종적으로 systemd의 일부로 로그를 관리하는

systemd-journal이 추가되어 시스템이 시작되는 순간부터 모든 로그를 텍스트 형태로 저장하지 않고 바이너리 파일 형태로 저장합니다.

 

로그 관리 데몬 흐름도

로그 관리 데몬 흐름도

systemd 로그 : rsyslog와 systemd-journald 두 개의 데몬으로 관리
systemd-journald : 부팅부터 모든 로그 수집
rsyslogd : syslog를 전달하여  파일 별로 로그 저장

 

로그 파일의 위치

로그 파일 위치

Kernel Log Message, Syslog Message, Service Message는 systemd-journald로 전달

이후 systemd-journald는 /run/log/journal 디렉터리에 모든 로그를 저장한 데이터 파일(journal) 생성

저장한 로그 중 syslog형태의 로그를 rsyslogd로 전달

rsyslogd에 수집된 로그는 /var/log 디렉터리에 각 syslog에 해당하는 로그 파일들을 생성하고 저장

 

1-3) /var/log에는 어떤 로그?

rsyslogd에 의해 수집되는 로그를 보통 syslog라고 불립니다.

로그 설명
messages 대부분의 시스템 로그
secure 인증 관련 로그
maillog 메일 관련 로그
cron 주기적인 작업 로그
boot.log 부팅 과정 로그

 

1-4) /run/log/journal에 저장되는 로그는?

systemd-journald에 의해 로그가 수집되고 해당 디렉터리에 바이너리 파일로 저장됩니다.

/run 디렉터리는 메모리 기반파일시스템인 tmpfs로 마운트 되어 시스템 재부팅 시 저널 데이터 파일은 삭제됩니다.

 

그렇다면 계속 쌓여가는 로그는 어떻게 정리를 해야 할까요?

 

2) Logrotate

logrotate의 설정파일을 이용하여 일정 주기별로 스크립트를 사용하여 원하는 형태의 로그를 압축하여 저장할 수 있습니다.

2-1) 설정

# vi /etc/logrotate.conf

==============================================================================
# see "man logrotate" for details
# rotate log files weekly
weekly # [1] 순환 기간 설정 (daily, weekly, monthly, yearly)

# keep 4 weeks worth of backlogs
rotate 4 # [2] [1]에 대한 세부 기간 설정 ex) 1번이 daily고, 2번이 4면 4일주기로 설정

# create new (empty) log files after rotating old ones
create # [3] 로그 파일 순환 후 파일 새로 생성

# use date as a suffix of the rotated file
dateext # [4] 날짜형식으로 파일명 변경 (기본 YYYYMMDD)

# uncomment this if you want your log files compressed
#compress # [5] 압축

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d # [6] 추가 설정 파일이 저장된 디렉터리 (세부설정)

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rorate 1
} # [7] 사용자의 로그인/로그아웃 정보를 저장하는 wtmp 로그 파일 설정

/car/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
} # [8] 로그인 실패 기록 저장

# system-specific logs may be also be configured here.
==============================================================================

6번에 저장된 설정값과 해당 설정 값이 다를 경우 6번에 저장된 개별 설정이 적용됩니다.

logrotate를 강제로 적용시키기 위해서는

 

2-2) 실행

# logrotate -f /etc/logrotate.d/<프로그램>

을 사용하면 프로그램에 설정된 logrotate옵션이 강제로 실행됩니다.

 

3) cronolog

cronolog 프로그램을 사용하여 log의 이름 형태를 날짜형식으로 변경 가능합니다.

logrotate의 rotate 옵션을 사용하여 생성되는 파일과 동일하며

예를 들어 nginx의 conf파일에 설정되어 저장되는 log값은 nginx의 폴더와 /var/log의 폴더가 하이퍼링크 되어있어 결국 동일해집니다.

logrotate의 설이 먼저 적용되고, 만약 이와 같은 프로그램의 설정이 지정되면 프로그램의 설정으로 변경됩니다.

 

3-1) cronolog 설치

rocky 8에서만 진행하였습니다.

# yum install -y cronolog

 

3-2) 설정

# vi /etc/httpd/conf/httpd.conf

================================================
ErrorLog "|/usr/sbin/cronolog logs/error-%Y%m%d.log"
CustomLog "|/usr/sbin/cronolog logs/access-%Y%m%d.log" combined
================================================


를 마지막줄에 추가하면 됩니다.

 

3-3) 재시작

# systemctl restart httpd

이름의 날짜 형식은 원하는 형태로 바꿀 수 있습니다.