4/15/2019

syslog 와 rsyslog 설정

1. syslog 와 rsyslog

syslog는 linux에서 사용되어지는 application log system이며, 보통 klogd와 함께 사용되어진다.
그래서, klogd의 message와 호환이 되기 때문에 kernel message도 출력이 가능하다.

syslog는 기본으로 2가지 설정(Facility 와 Level)으로 구성이 되며, 여기에 추가적으로 tag도 별도로 첨부가 가능하여 
log 저장방법의 다양성을 제공해주고 있다.

  • Facility
Log message의 장치 및 source를 말하며, Facility Code or keyword로 쉽게 구분을 하여 본인이 원하는 message들을 log가 가능하다.
Facility code Keyword Description
0 kern Kernel messages
1 user User-level messages
2 mail 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
상위 Facility가 정해졌으며, 각 log의 Level을 설정이 가능하여, Message 양을 조절이 가능하다.
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          

syslog 와 rsyslog TCP/UDP 설정 ($UDPServerRun 514 , $InputTCPServerRun 514 )
  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

/etc/syslog.conf 와 syslogd 관련정리내용
  https://www.linux.co.kr/lecture/lec_linux_01/lec-data/11data.pdf


1.2  logger로 syslog 테스트 

logger program을 이용하여 간단히 syslog를 테스트가 가능하며, 이를 이용하여 기록확인이 가능하다
  1. -p 옵션 : Facility 와 level 설정
  2. -t  옵션 : Tag  (별도의 본인의 Tag 설정)

상위 /etc/syslog.conf  설정변경 후 syslogd를  재실행 혹은 Reboot 후  아래와 같이 테스트 진행하며 
설정값(/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진행
2>&1 을 이용하여 표준에러를 표준입력으로 변경하여 출력

$ 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의 실행 및 옵션 
  https://linux.die.net/man/3/syslog
  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
3. syslog 기타사항 정리 



3.1 /var/log 의 검색방법 

/var/log/ 안에 다양한 log들이 존재할 것이며 정확한 Log를 분석하기 위해서 아래와 같이 날짜기반으로 검색하거나, 
혹은 Facility 와 각 Level 기반으로 검색 부터 Tag 를 사용하여 세부 검색을 이용하자 

  • 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

grep 과 awk / sed 로 검색방법 
  https://www.shellhacks.com/grep-or-grep-and-grep-not-match-multiple-patterns/


3.2 rsyslog , syslog , syslog-ng 차이 


  • syslog 
1980년대에 시작되어 계속 개발중 
  1. UDP기반으로 syslog protocol 완성된 log관리 시스템 
  2. 상위 syslogd Manual 보면 Network은 UDP만 지원 

  • syslog-ng 
1988년에 syslog protocol 과 함께 시작되어 계속 개발중 
  1. content-based filtering  (Filter 기능을 제공하는 것으로 추측)
  2. Logging directly into a database ( Database 제공?)
  3. TCP for transport (UDP가 아닌 TCP로 안정화)
  4. TLS encryption (TLS 암호화까지 지원)

  • rsyslog
2004년에 syslog protocol 과 함께 시작되어 계속 개발중 
  1. RELP Protocol support
  2. Buffered operation support
  3. 상위 설정으로 봐서 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

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

댓글 없음 :