syslog는 linux에서 사용되어지는 application log system이며, 보통 klogd와 함께 사용되어진다.
그래서, klogd의 message와 호환이 되기 때문에 kernel message도 출력이 가능하다.
syslog는 기본으로 2가지 설정(Facility 와 Level)으로 구성이 되며, 여기에 추가적으로 tag도 별도로 첨부가 가능하여
log 저장방법의 다양성을 제공해주고 있다.
syslog의 설정관련기본 정보(상위도표)
https://en.wikipedia.org/wiki/Syslog
syslog의 kernel message는 klogd에서 전달받음
- Facility
Facility code | Keyword | Description |
---|---|---|
0 | kern | Kernel messages |
1 | user | User-level messages |
2 | Mail system | |
3 | daemon | System daemons |
4 | auth | Security/authentication messages |
5 | syslog | Messages generated internally by syslogd |
6 | lpr | Line printer subsystem |
7 | news | Network news subsystem |
8 | uucp | UUCP subsystem |
9 | cron | Clock daemon |
10 | authpriv | Security/authentication messages |
11 | ftp | FTP daemon |
12 | ntp | NTP subsystem |
13 | security | Log audit |
14 | console | Log alert |
15 | solaris-cron | Scheduling daemon |
16–23 | local0 – local7 | Locally used facilities |
- Level
Value | Severity | Keyword | Deprecated keywords | Description |
---|---|---|---|---|
0 | Emergency | emerg |
panic [7] |
System is unusable |
1 | Alert | alert |
Action must be taken immediately | |
2 | Critical | crit |
Critical conditions | |
3 | Error | err |
error [7] |
Error conditions |
4 | Warning | warning |
warn [7] |
Warning conditions |
5 | Notice | notice |
Normal but significant conditions | |
6 | Informational | info |
Informational messages | |
7 | Debug | debug |
Debug-level messages |
syslog의 설정관련기본 정보(상위도표)
https://en.wikipedia.org/wiki/Syslog
syslog의 kernel message는 klogd에서 전달받음
- klogd
/proc/kmsg 에서 읽어서 syslogd 로 전송
- syslogd or rsyslogd
/dev/log 를 사용하여 local에서 read 하며, network bind 514 port
1.1 syslog의 설정 및 기본테스트
syslog의 설정은 /etc/syslog.conf 이곳에서 설정이 되며, ps로 syslogd의 동작을 반드시 확인을 하자.
만약 미동작이라면, systemd or sysVinit 방식으로 syslogd를 실행을 시켜주자
- syslog 설정 (/etc/syslog.conf)
$ vi /etc/rsyslog.conf // 보통 내부에 include 사용하여 /etc/rsyslog.d/*.conf 확장 or $ vi /etc/rsyslog.d/*.conf // rsyslogd 각 설정 (설정변경후 service restart, systemctl restart rsyslogd ) $ vi /etc/syslog.conf // 보통 내부에 include 사용하여 /etc/syslog.d/*.conf 확장 or $ vi /etc/syslog.d/*.conf // syslogd 각 설정 (설정변경후 service restart, systemctl restart syslogd ) # /etc/syslog.conf Configuration file for busybox's syslogd utility ######## # # # # "*" : Faclity or Severity level에서 사용 (모든 Faclity or Severity level) # "none" : Severity level에서만 사용 ( message를 미기록) # ";" ; 연속으로 # "=" ; Severity level의 정의하여 그 이상만 설정 # "@" ; 외부 Server # # facility.level;facility.level logpath # # /var/log/messages : default 저장되는 장소 (만약 설정을 안했다면, 기본으로 이곳에 저장) # # ######## *.info;mail.none;news.none;authpriv.none /var/log/messages *.alert root local0.notice /var/log/local0 local1.* /var/log/local1 local2.info /var/log/local2 ## console로 출력 local3.* /dev/console local4.* /var/log/test # 해당 메시지를 192.168.1.17의 syslogd으로 전송 local5.* @192.168.1.17 # 전송과 동시에 저장 local5.* /var/log/local5 # 해당 메시지를 jhleehost 의 syslogd으로 UDP 전송 local6.* @jhleehost # 전송과 동시에 저장 local6.* /var/log/local6 # 해당 메시지를 logserver 의 syslogd으로 전송 local7.* @logserver # 전송과 동시에 저장 local7.* /var/log/local7
https://m.blog.naver.com/PostView.nhn?blogId=scvpark&logNo=221017723884&proxyReferer=https:%2F%2Fwww.google.com%2F
- hostname 설정 및 변경 ( syslog에 반영)
$ cat /etc/hostname jhleehost $ cat /etc/hosts 127.0.0.1 localhost.localdomain localhost 127.0.1.1 jhleehost 192.168.1.100 logserver # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
- syslog의 network 설정
$ ps | grep syslog* // 현재설정확인 247 root 2724 S /sbin/syslogd -n 620 root 2724 S grep syslog* $ grep -r syslogd /lib/systemd/ //systemd 방식의 Service 찾기 /lib/systemd/system/busybox-syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS $ grep -r syslogd /etc/systemd/ //systemd 방식의 Service 찾기 (상위링크임) /etc/systemd/system/syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS /etc/systemd/system/multi-user.target.wants/busybox-syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS $ vi /etc/init.d/sysklogd //sysVinit 방식 or $ vi /lib/systemd/system/busybox-syslog.service //systemd 방식 /sbin/syslogd –r –m 0 이용하여 원격Log Server 동작가능 (-r 옵션추가)-r 옵션을 추가하면, logserver 기능이 추가되며, 외부의 Message를 받아 저장가능
syslogd 의 사용법
/sbin/syslogd 에서 위치하며 상위 설정기반으로 Service 형태로 동작
klogd 의 사용법
/sbin/klogd 에 대부분 위치하며, Kernel Message만 관리하며, Service 형태로 동작
syslogd를 걸쳐서 오는 것으로 보이며, syslogd가 더 중요
https://linux.die.net/man/8/klogd
https://linux.die.net/man/8/klogd
/etc/syslog.conf 와 syslogd 관련정리내용
https://www.linux.co.kr/lecture/lec_linux_01/lec-data/11data.pdf
1.2 logger로 syslog 테스트
logger program을 이용하여 간단히 syslog를 테스트가 가능하며, 이를 이용하여 기록확인이 가능하다
상위 /etc/syslog.conf 설정변경 후 syslogd를 재실행 혹은 Reboot 후 아래와 같이 테스트 진행하며
https://www.linux.co.kr/lecture/lec_linux_01/lec-data/11data.pdf
1.2 logger로 syslog 테스트
logger program을 이용하여 간단히 syslog를 테스트가 가능하며, 이를 이용하여 기록확인이 가능하다
- -p 옵션 : Facility 와 level 설정
- -t 옵션 : Tag (별도의 본인의 Tag 설정)
설정값(/etc/syslog.conf)을 변경하지 않는다면, 그대로 테스트
- /var/log/local0에 기록 (/etc/syslog.conf참조)
$ echo "hello local0" | logger -t test_user0 -p local0.notice
$ cat /var/log/local0 //날짜 시간 hostname facility.level tag message
Mar 13 15:40:45 jhleehost local0.notice test_user0: hello local0
- /var/log/local1에 기록
$ echo "hello local1" | logger -t test_user1 -p local1.notice $ cat /var/log/local1 Mar 13 15:45:50 jhleehost local1.notice test_user1: hello local1
- /var/log/local2에 기록
$ echo "hello local2" | logger -t test_user2 -p local2.info $ cat /var/log/local2 Mar 13 15:49:31 jhleehost local2.info test_user2: hello local2
- 바로 Consol 출력 미기록
$ echo "hello local3" | logger -t test_user2 -p local3.info Mar 13 15:50:41 jhleehost local3.info test_user2: hello local3
- Network로 Message 출력
$ echo "hello local5" | logger -t test_user2 -p local5.info $ echo "hello local5" | logger -t test_user2 -p local5.notice $ cat /var/log/message //192.168.1.17로 기록 ..... Mar 13 15:54:19 jhleehost local5.info test_user2: hello local5 Mar 13 15:56:24 jhleehost local5.notice test_user2: hello local5 $ cat /var/log/local5 // local로 기록 Mar 13 16:05:57 jhleehost local5.info test_user2: hello local5 Mar 13 16:06:06 jhleehost local5.notice test_user2: hello local5
- Shellscript 과 logger로 TEST진행
$ test1.sh | logger -t test_1 -p local0.notice $ test2.sh 2>&1 | logger -t test_2 -p local0.notice
2. syslog를 이용한 Programming
Application에서 printf 대신 syslog를 이용하여 손쉽게 저장이 가능하며, 이를 이용하는 방식에 대해 간단히 요약한다.
2.1 syslog message format 방식
syslog가 network도 지원이 되다보니, Protocol 방식이 존재하며, 더불어 TLS 같은 보안기능까지 지원가능 한 것으로 보인다.
https://sematext.com/blog/what-is-syslog-daemons-message-formats-and-protocols/
https://stackify.com/syslog-101/
- syslogd의 실행 및 옵션
http://man7.org/linux/man-pages/man5/rsyslog.conf.5.html
2.2 언어 C를 사용하여 syslog 구현
기본적으로 C에서 syslog를 이용하고 싶다면 아래와 같이 선언을 하고 build 진행
//Facility #define LOG_KERN (0<<3) /* kernel messages */ #define LOG_USER (1<<3) /* random user-level messages */ #define LOG_MAIL (2<<3) /* mail system */ #define LOG_DAEMON (3<<3) /* system daemons */ #define LOG_AUTH (4<<3) /* security/authorization messages */ #define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ #define LOG_LPR (6<<3) /* line printer subsystem */ #define LOG_NEWS (7<<3) /* network news subsystem */ #define LOG_UUCP (8<<3) /* UUCP subsystem */ #define LOG_CRON (9<<3) /* clock daemon */ #define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ #define LOG_FTP (11<<3) /* ftp daemon */ #define LOG_LOCAL0 (16<<3) /* reserved for local use */ #define LOG_LOCAL1 (17<<3) /* reserved for local use */ #define LOG_LOCAL2 (18<<3) /* reserved for local use */ #define LOG_LOCAL3 (19<<3) /* reserved for local use */ #define LOG_LOCAL4 (20<<3) /* reserved for local use */ #define LOG_LOCAL5 (21<<3) /* reserved for local use */ #define LOG_LOCAL6 (22<<3) /* reserved for local use */ #define LOG_LOCAL7 (23<<3) /* reserved for local use */ //Level #define LOG_EMERG 0 /* system is unusable */ #define LOG_ALERT 1 /* action must be taken immediately */ #define LOG_CRIT 2 /* critical conditions */ #define LOG_ERR 3 /* error conditions */ #define LOG_WARNING 4 /* warning conditions */ #define LOG_NOTICE 5 /* normal but significant condition */ #define LOG_INFO 6 /* informational */ #define LOG_DEBUG 7 /* debug-level messages */
#include <syslog.h> void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void); #include <stdarg .h> void vsyslog(int priority, const char *format, va_list ap);
#include <syslog.h> int main() { syslog(LOG_INFO|LOG_LOCAL1, "test local 0 \n"); syslog(LOG_INFO|LOG_LOCAL2, "test local 1 \n"); syslog(LOG_INFO|LOG_LOCAL3, "test local 2 \n"); return 0; }
Linux의 Application에서 직접 Syslog 사용할 경우 C의 예제 사용법
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
https://www.gnu.org/software/libc/manual/html_node/Syslog-Example.html
https://linux.die.net/man/3/vsyslog
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
http://blog.naver.com/PostView.nhn?blogId=cyber143&logNo=20108202487
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
https://system-monitoring.readthedocs.io/en/latest/log.html
https://linux.die.net/man/3/vsyslog
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
http://blog.naver.com/PostView.nhn?blogId=cyber143&logNo=20108202487
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
https://system-monitoring.readthedocs.io/en/latest/log.html
3. syslog 기타사항 정리
3.1 /var/log 의 검색방법
/var/log/ 안에 다양한 log들이 존재할 것이며 정확한 Log를 분석하기 위해서 아래와 같이 날짜기반으로 검색하거나,
혹은 Facility 와 각 Level 기반으로 검색 부터 Tag 를 사용하여 세부 검색을 이용하자
grep 과 awk / sed 로 검색방법
https://www.shellhacks.com/grep-or-grep-and-grep-not-match-multiple-patterns/
3.2 rsyslog , syslog , syslog-ng 차이
아래 링크 글을 보면 근본적으로 거의 차이가 없는 것(syslog protocol 모두 지원)으로 보이며, 하지만, 세부동작과 동작방식이 다른 것으로 보인다.
출처:
https://serverfault.com/questions/692309/what-is-the-difference-between-syslog-rsyslog-and-syslog-ng
3.3 systemd-journal 의 사용법
기본적으로 Binary로 데이타를 저장하고 저장장소역시 이미 정해져있고, 현재 테스트만 해봤지만, 장점이 무엇인지 정확하게 모르겠음
추후 사용해보고 정리
systemd-journal 사용법
https://haker.tistory.com/52
https://www.loggly.com/ultimate-guide/linux-logging-with-systemd/
journal 이용방법
https://serverfault.com/questions/573946/how-can-i-send-a-message-to-the-systemd-journal-from-the-command-line
3.4 rsyslog
현재 Ubuntu에서 syslogd 대신 사용하고 있으며, 추후 사용해보고 정리
- grep를 이용하여 검색 후 분석
$ grep "Feb 28 22:" /var/log/message // 날짜기반으로 검색 $ grep "Feb 28 22:" /var/log/message | head -n 100 // 날짜기반으로 검색 $ grep "local0.notice" /var/log/message // Facility 와 Level 기반으로 검색 $ grep "local0.notice" /var/log/message | tail -n 100 // Facility 와 Level 기반으로 검색 $ grep -e "local0.notice" -e "Feb 28 22:" /var/log/message // 날짜기반에 Facility 와 Level 기반으로 검색 $ grep -e "local0.notice" -e "Feb 28 22:" /var/log/message | tail -n 100 // 날짜기반에 Facility 와 Level 기반으로 검색
- grep/egrep/awk/sed 이용한 Pattern 검색
$ grep "PATTERN1\|PATTERN2" FILE $ grep -E "PATTERN1|PATTERN2" FILE $ grep -e PATTERN1 -e PATTERN2 FILE $ egrep "PATTERN1|PATTERN2" FILE $ awk '/PATTERN1|PATTERN2/' FILE $ sed -e '/PATTERN1/b' -e '/PATTERN2/b' -e d FILE
https://www.shellhacks.com/grep-or-grep-and-grep-not-match-multiple-patterns/
3.2 rsyslog , syslog , syslog-ng 차이
- syslog
1980년대에 시작되어 계속 개발중
- UDP기반으로 syslog protocol 완성된 log관리 시스템
- 상위 syslogd Manual 보면 Network은 UDP만 지원
- syslog-ng
1988년에 syslog protocol 과 함께 시작되어 계속 개발중
- content-based filtering (Filter 기능을 제공하는 것으로 추측)
- Logging directly into a database ( Database 제공?)
- TCP for transport (UDP가 아닌 TCP로 안정화)
- TLS encryption (TLS 암호화까지 지원)
- rsyslog
2004년에 syslog protocol 과 함께 시작되어 계속 개발중
- RELP Protocol support
- Buffered operation support
- 상위 설정으로 봐서 TCP도 지원
결론적으로 각각 독립적으로 Open Source가 지원이 되는 것 같은데, 암호화 부분은 syslog-ng가 되어 낫을 것 같다.
아래 링크 글을 보면 근본적으로 거의 차이가 없는 것(syslog protocol 모두 지원)으로 보이며, 하지만, 세부동작과 동작방식이 다른 것으로 보인다.
출처:
https://serverfault.com/questions/692309/what-is-the-difference-between-syslog-rsyslog-and-syslog-ng
3.3 systemd-journal 의 사용법
기본적으로 Binary로 데이타를 저장하고 저장장소역시 이미 정해져있고, 현재 테스트만 해봤지만, 장점이 무엇인지 정확하게 모르겠음
추후 사용해보고 정리
systemd-journal 사용법
https://haker.tistory.com/52
https://www.loggly.com/ultimate-guide/linux-logging-with-systemd/
journal 이용방법
https://serverfault.com/questions/573946/how-can-i-send-a-message-to-the-systemd-journal-from-the-command-line
3.4 rsyslog
현재 Ubuntu에서 syslogd 대신 사용하고 있으며, 추후 사용해보고 정리
각 기능을 확인
https://www.thegeekdiary.com/configuring-remote-logging-using-rsyslog-in-centos-rhel/
http://pubs.opengroup.org/onlinepubs/007908799/xsh/syslog.h.html
https://en.wikipedia.org/wiki/Syslog
https://en.wikipedia.org/wiki/Rsyslog
https://en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol
정리해야할 사항들 및 참고사항
https://cleverdj.tistory.com/130
https://system-monitoring.readthedocs.io/en/latest/log.html
http://apollo89.com/wordpress/?p=554
https://en.wikipedia.org/wiki/Syslog
https://haker.tistory.com/52
https://serverfault.com/questions/573946/how-can-i-send-a-message-to-the-systemd-journal-from-the-command-line
journalctl -fu lora-start.service
https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs
https://www.freedesktop.org/software/systemd/man/systemd.html#
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_2
https://reebok.tistory.com/69
cron
https://stackframe.tistory.com/14
https://wiki.archlinux.org/index.php/Systemd/Timers
https://www.thegeekdiary.com/configuring-remote-logging-using-rsyslog-in-centos-rhel/
http://pubs.opengroup.org/onlinepubs/007908799/xsh/syslog.h.html
https://en.wikipedia.org/wiki/Syslog
https://en.wikipedia.org/wiki/Rsyslog
https://en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol
정리해야할 사항들 및 참고사항
https://cleverdj.tistory.com/130
https://system-monitoring.readthedocs.io/en/latest/log.html
http://apollo89.com/wordpress/?p=554
https://en.wikipedia.org/wiki/Syslog
https://haker.tistory.com/52
echo 'hello' | systemd-cat journalctl -f
https://serverfault.com/questions/573946/how-can-i-send-a-message-to-the-systemd-journal-from-the-command-line
journalctl -fu lora-start.service
https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs
https://www.freedesktop.org/software/systemd/man/systemd.html#
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_2
https://reebok.tistory.com/69
cron
https://stackframe.tistory.com/14
https://wiki.archlinux.org/index.php/Systemd/Timers