중앙 집중식 로깅 구현하기 – rsyslog
초고를 쓰고 틈틈이 다듬도록 하겠습니다.
현재는 trial and error 에 대해 적었음.
ubuntu 20.04 를 사용했음.
Ubuntu 의 기본 System Log 는 /etc/rsyslog.d/50-default.conf 파일을 따른다.
# vi /etc/rsyslog.d/50-default.conf
혹시나 기록하고 싶지만 주석(#)에 의해 막혀져 있는 것이 있다면 주석을 제거하고
# service rsyslog restart
혹시 현재 생성되지 않은 로그파일이 있다면, 그 파일은 기록할 내용이 있을때 생성된다. (빈 파일이 즉시 생성되지는 않음)
https://itragdoll.tistory.com/79 주로참고
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=skddms&logNo=221204436898 도움
https://ujuc.github.io/2018/03/01/rsyslog_-_templates/ 슈벌 문서 포맷팅 때문에 보기가 매우 불편한 글이다.
서버에서
vi rsyslog.conf
==
syslog 의 표준포트는 514 번임.
과거에는 udp 514 이었는데 udp 자체가 un reliable 이어서, tcp 도 나오고 여럿 나온듯.
UDP, TCP, TLS or RELP
You can send RFC-3164 and RFC-5424 compatible syslog to Logs Management App via any of the following protocols:
UDP: fire-and-forget protocol that doesn’t guarantee any reliability but is also the fastest and simplest implementation
TCP: provides better reliability than TCP, though messages might still be lost from the system buffers if the connection breaks and rsyslog is restarted
TLS: RFC-5425 syslog over TLS is supported
RELP: this is a reliable protocol, because it supports application-level acknowledgments
udp 는 그냥 메세지 보내고 끝내는것,
tcp는 연결지향이고, 연결이 끊어지면 자동 재접속을 해서 거의 최선의 노력으로 동작한다. 다만 받는 서버가 접속불능일 경우, 그 로그는 손실시킨다.
relp 라고 로그기반 가장 안전한 프로토콜이 있는데 (Reliable Event Logging Protocol) 이건 양쪽에 버퍼가 있고 acknowledgments 로 동작하므로 손실되지 않게 보장한다.
수집하는 로그의 중요도에 따라서 고르는게 나을듯.
syslog 내부가 어떻게 되있는지는 모르겠음. 다만 문서를 보니 property 와 value 로 구성된 것 같더라.
그래도 통신 구조가 궁금해서 tcpdump를 해보았다.
# tcpdump -nnAs 0 port 514
client 에서 로그를 만듬
[email protected]:~$ logger -t test my syslog-test-message3
server 에서 raw data
<13>Nov 1 12:24:40 ip-10-127-127-4 test: my syslog-test-message3
timestamp ip source message 형식인듯.
Q1) 2021 년인것은 어떻게 아는거지?
Q2) user.notice 는 어떻게 아는거지?
https://datatracker.ietf.org/doc/html/rfc3164 RFC3164 문서를 보고 이해하려고 노력중
server 에서 formated data
{"@timestamp":"2021-11-01T12:24:40+09:00","message":" my syslog-test-message3","host":"ip-10-127-127-4","severity":"notice","facility":"user","syslog-tag":"test:","source":"test"}
# logger -p user.info -t test my syslog-test-message3 --rfc3164
<14>Nov 1 13:30:11 ip-10-127-127-4 ip-10-127-127-4 test: my syslog-test-message3
# logger -p user.info -t test my syslog-test-message3 --rfc5424
<14>Nov 1 13:30:19 ip-10-127-127-4 1 2021-11-01T13:30:19.664638+09:00 ip-10-127-127-4 test - - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="312500"] my syslog-test-message3
logger: unknown facility name: users
logger: unknown priority name: infos
Facility 와 Priority 는 predefined 값만 사용가능.
여러번의 디버깅 결과 해석법을 알아냈다.
8로 나눈 값(int) 및 그 나머지(mod)를 알아낸다.
86 => 8 * 10 + 6 = 10, 6 = security(authpriv) info
78 => 8 * 9 + 6 = 9, 6 = cron info
14 => 8 * 1 + 6 = 1, 6 = user info
https://wiki.gentoo.org/wiki/Rsyslog
syslog-server formatted json
{“@timestamp”:”2021-11-01T14:22:19+09:00″,”message”:” test: my syslog-test-message43“,”host”:”ip-10-127-127-4″,”severity”:”debug”,”facility”:”user”,”syslog-tag”:”ip-10-127-127-4″,“source”:”ip-10-127-127-4″}
{“@timestamp”:”2021-11-01T14:22:17+09:00″,”message”:” my syslog-test-message43“,”host”:”ip-10-127-127-4″,”severity”:”debug”,”facility”:”user”,”syslog-tag”:”test:”,“source”:”test”}
client logger command
logger -p user.debug -t test my syslog-test-message43 -rfc3164
logger -p user.debug -t test my syslog-test-message43
로거 사용법 : https://www.real-world-systems.com/docs/logger.1.html
tcp log message
<15>Nov 1 14:23:06 ip-10-127-127-4 ip-10-127-127-4 test: my syslog-test-message43
<15>Nov 1 14:23:07 ip-10-127-127-4 test: my syslog-test-message43
이건 뭐지.
이제 timestamp 만 이해가 안가니까 살펴보자.
syslog-ng 문서에서 발췌.
Description Syslog-ng can either use BSD (default) or ISO timestamp format in log files and file-like destinations. BSD (default) format: Mnn DD hh:mm:ss For example: May 10 09:39:20 ISO format: YYYY-MM-DDThh:mm:ssTZ For example: 2019-05-09T09:39:20+08:00
MNn
The capitalized name of the month
대문자 월 이라네.
그럼 년도는 어디에?