Linux OS/관리

log 관리하기 (rsyslog)

서버엔지니어 2023. 3. 12.
728x90

CentOS7 또는 Ubuntu 14.04 는 rsyslog를 표준으로 채용하고 있다.

syslog의 동작을 설정 syslog의 설정 파일인 

/etc/syslog.conf
==============================================================
facility ( 파실리티 )
facility는 메시지의 출력처이다. 구체적으로는 커널이나 실행 중의 프로세스가 된다. facility를 사용하는 것으로 메시지의 출력이 어디서부터 왔는지 로그의 출력처를 제한하는 것이 가능하다. [*]를 이용하는 것으로 모든 facility를 선택 가능하다.
==============================================================
facility 설명


auth, authpriv 인증 시스템 ( login이나 su )
cron cron
daemon 각종 데몬
kern 커널
lpr          인쇄 시스템
mail 메일 시스템
syslog syslog 기능
local0  ~ local7 독자 설정
==============================================================
priority 우선순위


priority는 메시지의 우선도를 나타낸다. priority를 낮게 설정하는 것으로 로그에 출력되는 정보량도 많이 달라진다. * 을 사용하면 모든 priority를 선택 가능하다. 아래의 표는 priority가 높은 것 순으로 작성하였다. none은 예외이며 지정된 priority를 예외 하는 역할을 가지고 있다.
==============================================================

 

priority 설명


emerg 위급적인 상태
alert 급한 대응이 필요함
crit 위험한 상태
err 일반적인 에러
warning 시스템으로 부터의 경고
notice 시스템으로 부터의 중요한 통지
info 시스템으로 부터의 정보
debug 디버그 정보
none priority를 무시
==============================================================

출력처
메시지의 출력처이다. 로그 파일에 저장하고 싶은 경우에는 파일명을 full path로 지저 한다 ( -를 선두에 붙이면 작성 후에 플래시 하지 않는다. 작성 빈도가 높은 쓰기의 부하를 내릴 순 있지만, 시스템 장애가 발생했을 경우 로그를 작성되지 않을 경우가 있다. ) [@]를 사용하여 호스트명을 지정하면 네트워크 상의 리모트 호스트에 로그를 전송하는 것도 가능하다 유저명을 지정하면 해당 유저의 단말에 메시지가 출력된다.. [*]를 이용하면 모든 유저에게 통지한다.

표기 설명
파일명 파일에 출력한다.
@호스트 명 리모트 호스트의 syslogd 에 출력한다.
유저명 해당 유저의 단말에 출력한다.
/dev/console 콘솔에 출력한다.
* 모든 유저의 단말에 출력한다.
==============================================================

/etc/rsyslog.conf의 설정 예
맨 처음 실행하면 커널이 출력하는 메시지가 모드 /var/log/lernel 에 보내고 만다. 2행과 3행에는 커널이 출력할 메시지로 더해 priority가 err이상의 것은 호스트 lpic로 보내는 것과 콘솔에도 출력하도록 한다. 마지막 행에는 모든 긴급 메시지가 로그인되어 있는 유저의 단말에 보내도록 한다.

# 모든 유저의 커널 메시지를 콘솔에 출력한다
kern.* /dev/console

# priority가 info이상이지만, facility가 authpriv, mail, cron이외의 로그를 저장
*.info;mail.none;authpriv.none;cron.none /var/log/messages

# priority가 authpriv의 로그를 저장
authpriv.* /var/log/secure

# facility가 mail 인 로그의 저장
mail.*  -/var/log/maillog

# facility가 cron 인 로그의 저장
cron.*  /var/log/cron

# 긴급한 메시지는 모든 유저에게 송신
*.emerg *

==============================================================

/etc/rsyslog.conf의 설정
rsyslog의 설정 파일은 /etc/rsyslog.conf도 기본적인 설정은 /etc/syslog.conf와 동일하다. rsyslog는 syslog와 비교하여 아래와 같은 다른 점이 있다.

로그의 네트워크 송신 시 TCP, SSL/TLS도 이용 가능하다 ( syslog는 UDP 뿐 )
MariaDB나 PostgresSQL 등의 데이터 베이스에 로그를 저장한다.
로그에 대한 패턴 매칭을 사용하여 파일 처리를 실행할 수 있다.
로그의 출력 포맷을 설정할 수 있다.
모듈단위로 기능을 추가할 수 있다.
이하는 /etc/rsyslog.conf 파일이다.
==============================================================

# 타임스탬프의 서식
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# /etc/rsyslog.d 디렉터리 이하의 설정 파일을 읽음
$IncludeConfig /etc/rsyslog.d/*.conf

# 이하는 syslog.conf의 설정과 동일

kern.* /dev/console
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail. * -/var/log/maillog
cron.* /var/log/cron
*.emrg *
설정 변경 후에는 rsyslog의 재기동 또는 설정 파일의 재 일기가 필요하다.

logger 커맨드
logger 커맨드를 사용하여 로그 메시지를 생성하는 것이 가능하다. syslog.conf의 설정을 체크할 경우 사용 가능하다.

logger -p syslog.info -t Test "logger test message "
보통 facility를 syslog, priority를 info로 설정하면 메시지는 /var/log/messages 에 저장된다

==============================================================

로그 조사
로그를 조사하는 것으로 시스템의 이용상 태나 소프트웨어의 동작에 이상이 없는지 등을 확인할 수 있다. 또한 문제의 징후를 발견할 수도 있다. 우선은 주로 사용하는 로그파일인 /var/log/messages를 확인해볼 수 있다.

Jun 27 14:16:44 lpic kernel: Loaded 162 symbols from 3 modules
위와 같은 형식으로 작성되어 있다.
이런 로그에서는 아래의 정보를 확인할 수 있다.

일시 : Jun 27 14:16:44
출력처 호스트 명 : lpic
메시지의 출력처 : kernel
메시지 : Loaded 162 symbols from 3 modules

로그 파일을 계속하여 감시하기 위해서는 -f 옵션을 붙인 tail 커맨드를 실행한다. 로그 파일에 로그가 추가되는 것을 계속하여 감시할 수 있다.

로그는 방대하기 때문에 특정 메시지만 조사하고 싶을 경우에는 grep 커맨드를 사용하여 검색 하하는 것도 가능하다
/var/log/secure 파일에는 인증 등의 세큐리티 관련의 로그가 저장된다.
로그인 중인 유저를 확인하는 방법은 who 커맨드를 사용한다.
w 커맨드를 사용하면 로그인 중의 유저에 더해 시스템 정보도 표시한다.
who 커맨드나 w 커맨드는 /var/run/utmp 파일의 정보를 참조하고 있다. 이 파일은 로그인 중의 유저 정보가 저장되어 있는 곳이다. last 커맨드를 사용하면 최근 로그인한 유저의 리스트가 표시된다. 이 커맨드는 로그 파일 /var/log/wtmp 파일을 참조한다.

lastlog 커맨드는 /var/log/lastlog 파일을 참조하여 유저별로 최근의 로그인 리스트를 보여준다. 한 번도 로그인한 적이 없는 유저는 그에 해당하는 메시지가 따로 출력된다.

systemd를 채용하고 있는 시스템인 경우 journalctl 커맨드를 사용하여 systemd의 로그를 볼 수 있다.

==============================================================

옵션

 

-f 로그의 끝을 표시한다.
-r 로그를 새로운 순으로 표시한다( 기본은 오래된 순 )
-u Unit 명 설정한 Unit의 로그를 출력한다.
--full 이스케이프 문자를 제외하고 plain text로 출력한다
--no-pager  1페이지 단위로 표시하지 않고 모든 로그를 출력한다.
journalctl 커맨드를 실행하면 less 등의 페이저를 사용하여 1페이지씩 로그를 표시한다.

이 로그가 저장되어 있는 것은 /var/log/journal이나 /var/run/log/journal이라고 하는 디렉터리 내에 있는 바이너리 파일이다. 로그는 일정량을 넘어가면 낡은 순서부터 삭제된다.

아래의 표는 주요한 로그 파일과 해당 로그를 보기 위해 이용하는 대표적인 커맨드의 정리이다.

로그 파일 커맨드

/var/log/messages less, tail, grep
/var/log/syslog less, tail, grep
/var/log/secure less, tail, grep
/var/log/wtmp last
/var/run/utmp who, w
/var/log/lastlog lasglog

 

로그 파일의 로테이션

로그파일은 배치해두면 추가되기만 할 뿐이기 때문에 용량이 거대해져 간다. 로그파일의 로테이션 기능을 사용하면 낡아진 로그를 나누고, 로그파일이 방대해지는 것도 예방할 수 있다. 이 기능을 사용하면 예를 들어 /var/log/messages 파일은 /var/log/messages.1 파일로 이름을 변경하고 새로운 /var/log/messages 파일이 작성된다. 

다음 로테이션이 오면 messages.1 파일이 messages.2 가 되며 messages 파일이 messages.1이 된다. 규정된 파일수를 넘어가면 가장 늙은 로그 파일이 삭제된다.

로그 파일의 로테이션 기능은 logrotate 유틸리티가 제공한다. logrotate 유틸리티는 cron을 이용하여 정기적으로 실행된다. logrotate의 설정은 /etc/logrotate.conf 파일에서 행한다. 

# 로테이션 주기를 1주일로 설정
weekly

# 백업로그를 4주간 보관한다
rotate 4

# 로테이션된 후 비어있는 로그파일을 작성한다
create

# 로그 파일을 압축한다
compress

# /var/log/wtmp 파일의 설정
/var/log/wtmp {
    monthly                  // 로테이션 주기를 1개월로 설정
    create 0664 root utmp    // 퍼미션을 644 소유자를 root 그룹을 utmp로 새로운 파일 작성
    rotate 1                 // 백업 로그를 1개 저장한다.
}
==============================================================

* logrotate란? 

로그 파일(시스템 로그)을 rotates, compresses, and mails 을 할 수 있다.
설정 파일을 변경해도 관련 프로세스를 새로 시작할 필요 없이 cron 데몬이 주기적으로 실행 시켜준다.

$ vi /etc/cron.daily 

위 cron을 확인해보면 logrotate 설정 부분을 확인할 수 있다.

logrotate 관련 파일

 

 - /usr/sbin/logrotate : 데몬의 위치 및 데몬프로그램
 - /etc/logrotate.conf : 설정 파일.
 - /etc/logrotate.d : logrotate를 적용할 로그 파일 보관 디렉토리.
 - /var/lib/logrotate.status : logrotate가 작업 내역 보관 파일.
 - /etc/cron.daily/logrotate : logrotate : cron 에 의해 일 단위로 실행한다.

동작 순서를 살펴보면 

1. cron.daily 에서 /usr/sbin/logrotate 호출 
2. /usr/sbin/logrotate 에서 /etc/logrotate.conf 설정파일 참조 
3. /etc/logrotate.conf 설정 파일에서 /etc/logrotate.d 참조 ( logrotate.conf 파일 안에 "include /etc/logrotate.d")

logrotate가 정상 동작 하는지 최소한의 설정으로 확인해 보자

$ sudo vi /etc/logrotate.d/apache
/program/apache/logs/access_log {
  size +1k
  missingok
  notifempty
  create 0600 root root
  compress
  dateext
  postrotate
    /usr/bin/killall -HUP httpd
  endscript
}

각 옵션들은 잠시 뒤에 상세 설명하고 우선 당장 실행 시켜 보자.

루트 권한으로 아래 명령 실행.
$ /usr/sbin/logrotate -f /etc/logrotate.conf
-f 옵션은 강제 실행 옵션이다 (Tells logrotate to force the rotation, even if it doesn't think this is necessary)

$ /usr/sbin/logrotate -d /etc/logrotate.conf
-d 옵션 : 디버그 모드 (Turns on debug mode and implies -v. In debug mode, no changes will be made to the logs or to the logrotate state file.)

* 주의사항 : f 옵션이나 d 옵션 하나만 넣고 실행해야 한다. (두 옵션을 동시에 넣고 실행시 정상 동작안되서 한동안 삽질....)

* logrotate 옵션

copytruncate : Truncate the original log file to zero size in place after creating a copy, instead of moving the old log file and optionally creating a new one 

copytruncate옵션을 활용하면 postrotate를 통한 httpd 재시작 없이 무중단 로깅이 가능하다.

/path/to/log {
  daily
  copytruncate
  create 0700 root root
  compress
  notifempty
  missingok
  dateext
}

rotate 30(숫자)  : log파일 30개 이상 되면 삭제
maxage 30(숫자) : 30일 이산된 로그 파일 삭제
size : 지정한 용량이 되면 로그로테이트를 실행한다. 10k, 10M 이런식으로 지정한다.
create : [권한 유저 그룹] 으로 rotation된 로그파일 생성
notifempty : log 내용이 없으면 rotation 하지 않는다.
ifempty : 로그파일이 비어있는 경우에도 로테이트한다.
monthly : 월 단위로 로테이트 한다.
daily : 월 단위로 로테이트 한다.
weekly : 월 단위로 로테이트 한다.
compress : rotate 된 로그 gzip 압축
nocompress : 압축을 원치 않는다.
mail admin@mail : 로테이트 설정에 의해 보관주기가 끝난 파일을 메일로 발송한다.
mailfirst admin@mail : 로테이트시 신규파일 이전의 로그를 메일로 발송한다.
nomail : 메일로 통보받지 않음.
errors admin@mail : 로테이트 실행시 에러가 발생하면 이메일로 통보한다.
prerotate-endscript : 사이의 명령어를 로그파일 처리전에 실행한다.
postrotate-endscript : 사이의 명령어를 로그파일 처리후에 실행한다.
extension : 로테이트 후 생성되는 파일의 확정자를 지정한다.
copytruncate : 이옵션을 넣지 않으면 현재 사용중인 로그를 다른이름으로 move하고 새로운 파일을 생성한다.
이 외의 옵션은 하단 참조에 link를 참조하거나 man logrotate를 확인하면 된다. 

보통은 rotation 후 아래 postrotate를 통해 httpd 를 재시작 해준다. 

postrotate
    /usr/bin/killall -HUP httpd
endscript

이 때 두가지 대안이 있다. 

1. killall -HUP 프로세스이름  (예> /usr/bin/killall -HUP httpd)
2. kill -HUP 프로세스번호 (예> /usr/bin/kill -HUP `cat /daum/program/apache/logs/httpd.pid 2> /dev/null` 2> /dev/null || true)

'Linux OS > 관리' 카테고리의 다른 글

vncserver 서비스 데몬 만들기  (0) 2023.03.12
crontab  (0) 2023.03.12
rsync, scp 사용법 (원격 파일,소스보내기)  (0) 2023.03.12
openssl 버전(CentOS)과 웹브라우저 tls 정책  (0) 2023.03.02
FTP 설치, 설정, 관리  (0) 2022.11.16

댓글