전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]

티스토리 뷰

systemd-journald, rsyslogd, journalctl

로그관리 참조

  • systemd-journald : OS의 모든 프로세스의 로그 수집
  • journalctl: systemd-journald가 수집한 로그를 보는 viewer( binary형태의 로그를 표시함)
  • rsyslogd: systemd-journald가 수집한 메시지를 지정된 규칙대로 분리하여 /var/log디렉토리 내에 파일로 기록하는 서비스
    • /var/log/messages: 일반로그(인증, 메일, 스케쥴job, 디버깅 외)가 기록되는 syslog파일
    • /var/log/secure: 보안과 인증 수행 관련된 syslog 파일
    • /var/log/maillog: 메일서버 관련 syslog 파일
    • /var/log/cron: schdule job 관련 syslog 파일
    • /var/log/boot.log: 시스템 부팅 관련 syslog 파일

About rsyslogd

  • 설정은 /etc/rsyslog.conf파일이고, 그 하위 rsyslog.d라는 디렉토리의 *.conf를 include하므로 추가되는 설정은 rsyslog.d 밑에다가 하는것이 좋음
  • 설정하는 규칙
    facility.priority log파일명
  • facility와 priority는 위 로그관리 참조
  • facility는 사용자 facility로 local0~7까지 지정할 수 있음

실습하기: sshd logging

  • rsyslog.service 상태 확인

    $ systemctl status rsyslog.service  
    active상태가 아니면 시작함
    $ systemctl start rsyslog.service
  • sshd의 Logging설정 변경 후  sshd 재시작

    $ cd /etc/ssh
    $ vi sshd_config 
    
    SyslogFacility를 AUTHPRIV에서 local6로 변경
    ...
    
    Logging
    #SyslogFacility AUTH
    #SyslogFacility AUTHPRIV
    SyslogFacility local6
    #LogLevel INFO
    ...
    
    $ systemctl restart sshd
  • rsyslog에서 log파일 지정  
$ cd /etc
$ vi rsyslog.conf

아래와 같이 /etc/rsyslog.d디렉토리의 파일들이 include 되었는지 확인

Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

$ cd rsyslog.d
$ vim 99-sshd.conf

local6.* /var/log/sshd.log

$ systemctl restart rsyslog.service

 

  • logging 테스트  
$ logger -p local6.warn "This is warning test"
$ tail /var/log/sshd.log
...
Jun 8 01:05:48 bastion sshd[27163]: Disconnected from 222.186.175.215 port 23252 [preauth]
Jun 8 01:07:28 bastion root: This is warning test
[root@bastion rsyslog.d]#

 

 

logrotate

한 로그 파일에 계속 기록하다 보면 로그 파일이 너무 커져서 문제가 생깁니다.

이를 방지하기 위해 날짜나 크기별로 log파일을 분리하는 서비스입니다. /etc/logrotate.conf파일에 설정하며, 하위에 있는 logrotate.d디렉토리의 설정파일들을 포함합니다.

 

$ cd /etc/logrotate.d

sshd라는 이름으로 sshd.log 분리 설정을 합니다.
$ vim sshd

/var/log/sshd.log {
daily
rotate 10
missingok
notifempty
compress
}

아래는 설정할 수 있는 옵션들입니다.

* rotate [숫자] : log파일이 5개 이상 되면 삭제 ex) rotate 5

* maxage [숫자] : log파일이 30일 이상 되면 삭제 ex) maxage 30

* size : 지정된 용량보다 클 경우 로테이트 실행 ex) size +100k

* create [권한] [유저] [그룹] : 로테이트 되는 로그파일 권한 지정 ex) create 644 root root

* notifempty : 로그 내용이 없으면 로테이트 하지 않음 

* ifempty : 로그 내용이 없어도 로테이트 진행 

* monthly(월 단위) , weekly(주 단위) , daily(일 단위) 로테이트 진행

* compress : 로테이트 되는 로그파일 gzip 압축

* nocompress : 로테이트 되는 로그파일 gzip 압축 X

* missingok : 로그 파일이 발견되지 않은 경우 에러처리 하지 않음

* dateext : 백업 파일의 이름에 날짜가 들어가도록 함  

 

logrotate crontab등록

logrotate는 crontab을 이용하여 스케쥴job으로 등록해줘야 로그 분할이 됩니다. 

아래 예제는 매일 00시 00분에 logrotate를 실행하는 설정입니다.

[ocean@study logrotate.d]$ sudo crontab -e
[sudo] password for ocean:

00 00 * * * /usr/sbin/logrotate -f /etc/logrotate.conf


[ocean@study logrotate.d]$ sudo crontab -l
00 00 * * * /usr/sbin/logrotate -f /etc/logrotate.conf

crontab설정에 대해서는 인터넷에 많이 나와 있으며, 문법과 sample은 아래와 같습니다.

문법: [분] [시] [일] [월] [요일] [명령어]

1.  매일 2.am에 백업하기 

-> 0 2 * * * /bin/sh backup.sh

2. 하루에 두번 script.sh 수행

-> 0 5, 17 * * * /scripts/script.sh

3. 매분 수행 

-> * * * * * /scripts/script.sh

4. 매 10분마다 monitor 스크립트 실행

-> */10 * * * * /scripts/monitor.sh

5. 1월부터 12월까지 2개월마다 1일날 오전 4시 10분에 /etc/check.sh라는 스크립트 실행

-> 10 4 1 1-12/2 * /etc/check.sh

6. 금요일하고 일요일 5시에만 스크립트 수행되게 

-> 0 17 * * sun,fri /script/script.sh

7. 매달 첫 번째 일요일에만 시행되게

-> 0 2 * * sun [$(date + %d) -le 07] && /script/scripnt.sh

 

logrotate test

logrotate를 수동으로 실행하고 /var/log/sshd.conf파일이 분할되는지 확인합니다.

[ocean@study ~]$ sudo logrotate -f /etc/logrotate.conf
[ocean@study ~]$ cd /var/log
[ocean@study log]$ ls -al | grep sshd
-rw-------.  1 root   root        0 Jun 27 17:59 sshd.log
-rw-------.  1 root   root      320 Jun 27 17:48 sshd.log-20200627.gz

 

journalctl

systemd-journald가 수집하는 모든 로그를 보는 프로그램입니다.  
rsyslogd가 /var/log에 영구적으로 로깅파일을 기록하는 반면, systemd-journald는 runtime 시에만 일시적으로 로그파일을 보관합니다.  
즉, 아래 난수같은 디렉토리에 있는 log파일들은 OS정지 시 모두 사라집니다.  

[root@bastion journal]# cd /run/log/journal
[root@bastion journal]# ls -l
total 0
drwxr-s---+ 2 root systemd-journal 200 Jun 8 00:04 657ef9edb6454d36878fa53c9ac15a57
[root@bastion journal]#

 

유용한 옵션은 아래와 같습니다.  
-r, -p, -u, --since, --until, -f 

  • journalctl -r : 시간 내림차순으로 표시  
$ journalctl
-- Logs begin at Wed 2020-06-03 00:00:06 CDT, end at Mon 2020-06-08 01:25:20 CDT. --
Jun 03 00:00:06 centos7-x86-64 systemd-journal[120]: Runtime journal is using 8.0M (max allowed 390.7M, trying to leave 586.1M free of 3.8G ava
Jun 03 00:00:06 centos7-x86-64 kernel: Initializing cgroup subsys cpuset
Jun 03 00:00:06 centos7-x86-64 kernel: Initializing cgroup subsys cpu

$ journalctl -r
-- Logs begin at Wed 2020-06-03 00:00:06 CDT, end at Mon 2020-06-08 01:24:28 CDT. --
Jun 08 01:24:28 bastion.ibm.cloud dnsmasq[14728]: cached infogw.api.openshift.com.cp.kubepia.net is 169.56.96.107
Jun 08 01:24:28 bastion.ibm.cloud dnsmasq[14728]: query[A] infogw.api.openshift.com.cp.kubepia.net from 10.178.41.151
Jun 08 01:24:28 bastion.ibm.cloud dnsmasq[14728]: cached infogw.api.ope

 

  • journalctl -p (우선순위) : 지정된 메시지 우선순위만 표시

메시지 우선순위는 아래와 같습니다.

 

$ journalctl -p err -r

-- Logs begin at Wed 2020-06-03 00:00:06 CDT, end at Mon 2020-06-08 01:28:10 CDT. --
Jun 08 01:25:50 bastion.ibm.cloud sshd[1438]: PAM service(sshd) ignoring max retries; 6 > 3
Jun 08 01:25:50 bastion.ibm.cloud sshd[1438]: error: maximum authentication attempts exceeded for root from 222.186.180.223 port 19920 ssh2 [pr
Jun 08 01:25:24 bastion.ibm.cloud sshd[1301]: PAM service(sshd) ignoring max retries; 5 > 3

 

  • journalctl -u (서비스명): 지정된 서비스 관련 메시지만 표시 
$ journalctl -u sshd.service -p info -r

-- Logs begin at Wed 2020-06-03 00:00:06 CDT, end at Mon 2020-06-08 01:29:29 CDT. --
Jun 08 01:28:39 bastion.ibm.cloud sshd[1943]: Disconnected from 112.85.42.174 port 13657 [preauth]
Jun 08 01:28:39 bastion.ibm.cloud sshd[1943]: Received disconnect from 112.85.42.174 port 13657:11: [preauth]
Jun 08 01:28:37 bastion.ibm.cloud sshd[1943]: Failed password for root from 112.85.42.174 port 13657 ssh2
Jun 08 01:28:35 bastion.ibm.cloud sshd[1943]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"

 

  • journalctl --since (년-월-일 시:분:초) --until (년-월-일 시:분:초)  
$ journalctl -u sshd.service -p info -r --since "2020-06-08 01:00:00"

-- Logs begin at Wed 2020-06-03 00:00:06 CDT, end at Mon 2020-06-08 01:31:24 CDT. --
Jun 08 01:31:24 bastion.ibm.cloud sshd[1983]: Failed password for root from 222.186.175.217 port 30742 ssh2
Jun 08 01:31:22 bastion.ibm.cloud sshd[1983]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jun 08 01:31:21 bastion.ibm.cloud sshd[1983]: Failed password for root from 222.186.175.217 port 30742 ssh2
Jun 08 01:31:18 bastion.ibm.cloud sshd[1983]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jun 08 01:31:17 bastion.ibm.cloud sshd[1983]: Failed password for root from 222.186.175.217 port 30742 ssh2

$ journalctl -u sshd.service -p info --since "2020-06-08 01:00:00" --until "2020-06-08 01:03:00"
-- Logs begin at Wed 2020-06-03 00:00:06 CDT, end at Mon 2020-06-08 01:32:29 CDT. --
Jun 08 01:02:38 bastion.ibm.cloud sshd[26965]: Invalid user honey from 144.172.79.7 port 59590
Jun 08 01:02:38 bastion.ibm.cloud sshd[26965]: input_userauth_request: invalid user honey [preauth]
Jun 08 01:02:38 bastion.ibm.cloud sshd[26965]: pam_unix(sshd:auth): check pass; user unknown
Jun 08 01:02:38 bastion.ibm.cloud sshd[26965]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=144.172.
Jun 08 01:02:40 bastion.ibm.cloud sshd[26965]: Failed password for invalid user honey from 144.172.79.7 port 59590 ssh2

 

  • journalctl -f : 실시간으로 로그 표시
$ journalctl -f

[root@bastion logrotate.d]# journalctl -f
-- Logs begin at Wed 2020-06-03 00:00:06 CDT. --
Jun 08 01:32:44 bastion.ibm.cloud dnsmasq-dhcp[14728]: 3109502685 sent size: 4 option: 1 netmask 255.255.255.192
Jun 08 01:32:44 bastion.ibm.cloud dnsmasq-dhcp[14728]: 3109502685 sent size: 4 option: 28 broadcast 10.178.41.191
Jun 08 01:32:44 bastion.ibm.cloud dnsmasq-dhcp[14728]: 3109502685 sent size: 14 option: 15 domain-name cp.kubepia.net
Jun 08 01:32:44 bastion.ibm.cloud dnsmasq-dhcp[14728]: 3109502685 sent size: 8 option: 12 hostname worker-2
Jun 08 01:32:44 bastion.ibm.cloud dnsmasq-dhcp[14728]: 3109502685 sent size: 4 option: 6 dns-server 10.178.41.148
Jun 08 01:32:44 bastion.ibm.cloud dnsmasq-dhcp[14728]: 3109502685 sent size: 4 option: 3 router 10.178.41.148
Jun 08 01:32:53 bastion.ibm.cloud dnsmasq[14728]: query[A] oauth-openshift.apps.cp.kubepia.net.cp.kubepia.net from 10.178.41.162
Jun 08 01:32:53 bastion.ibm.cloud dnsmasq[14728]: cached oauth-openshift.apps.cp.kubepia.net.cp.kubepia.net is 169.56.96.107

 

  • journalctl _SYSTEMD_UNIT & _PID

systemd의 이름과 Main Process id로 필터링할 수 있습니다.  

[root@bastion logrotate.d]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-06-08 00:24:37 CDT; 1h 14min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 17829 (sshd)
CGroup: /system.slice/sshd.service
└─17829 /usr/sbin/sshd -D

[root@bastion logrotate.d]# journalctl -f _SYSTEMD_UNIT=sshd.service
-- Logs begin at Wed 2020-06-03 00:00:06 CDT. --
Jun 08 01:40:31 bastion.ibm.cloud sshd[2275]: Failed password for root from 112.85.42.172 port 41668 ssh2
Jun 08 01:40:31 bastion.ibm.cloud sshd[2275]: error: maximum authentication attempts exceeded for root from 112.85.42.172 port 41668 ssh2 [preauth]

[root@bastion logrotate.d]# journalctl -f _SYSTEMD_UNIT=sshd.service _PID=17829
-- Logs begin at Wed 2020-06-03 00:00:06 CDT. --
Jun 08 00:24:37 bastion.ibm.cloud sshd[17829]: Server listening on 0.0.0.0 port 22.
Jun 08 00:24:37 bastion.ibm.cloud sshd[17829]: Server listening on :: port 22.

 

journal 파일 보관하기

journal파일은 /run/log/journal디렉토리에 임시적으로만 보관됩니다.

이를 영구적으로 보관하려면 /var/log/journal디렉토리를 만들고,

/etc/systemd/journald.conf파일의 Storage값을 persistent로 변경하면 됩니다.

 

$ mkdir -p /var/log/journal
$ vim /etc/systemd/journald.conf

See journald.conf(5) for details.
[Journal]
Storage=persistent
#Storage=auto
#Compress=yes

$ systemctl restart systemd-journald.service
$ reboot

 

 

timezone 변경

log의 날짜 시간이 틀리게 나오는 경우는 timezone이 맞지 않아서입니다. 

아래 글을 참조하세요 timezone을 변경하십시오.

https://happycloud-lee.tistory.com/138

 

댓글

전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]