syslog-ng 이용해서 syslog 원격으로 모으기
원격으로 syslog를 모으기 가장 쉬운 방법은 rsyslog 를 그냥 사용하면 된다.
이런 방식을 사용하면 모으기는 할 수 있으나, rsyslog 취합서버의 /var/log/messages 로 전부 들어가기때문에 로그를 한번에 골라서 보거나 구분하기가 불편하다.
그래서 cacti를 사용할 수도 있고 Elastic stack을 사용할 수도 있지만 우선 가장 간편하게 rsyslog처럼 수집하되 서버단위로 파일을 나누거나 로그 facility나 serverity로 파일을 나누어 취합할 수 있는 syslog-ng에 대해서 기술해본다.
syslog-ng설치
yum install epel-release
yum install syslog-ng
우선 configuration하기 전 syslog-ng 설정을 살펴보면 source, filter, destination, log 로 나뉜다.
(개인적으로 공부한 내용을 기술하기 때문에 틀린 부분이 있을 수 있음)
source는 log에 대한 source를 정의한다. 예를 들어, local_log에 대한 정의와 원격으로부터 로그를 받을 수 있는 remote_log로 정의하고 해당 source에 따른 filter와 destination을 지정한다. local_log는 /var/log에 쌓고, remote_log는 /data/remote_logs에 쌓을 수 있게 설정하면 된다.
fileter는 어떠한 기준으로 로그를 분리할 것인지를 정의하는 단계이다.
destination은 최종적으로 로그를 쌓을 파일을 지정한다.
log는 어떤 source를 어떤 filter를 거쳐 어떤 destination에 쌓을 것인지를 정하는 옵션이다.
주의할 사항은 centos기준으로 rsyslog가 기본적으로 로그관리를 하기때문에 syslog-ng를 추가로 기동하면 로그가 2배로 쌓인다.
그리고 syslog-ng와 rsyslog가 기본적으로 같은 pid파일을 생성하기때문에(포스팅 날짜 기준) 같이 기동하는 것은 문제가 있다.
또한, 당연한 얘기지만 syslog-ng가 기동중인 상태에서는 rsyslog가 기동이 되지않는다. syslog-ng를 설치한 서버에서는 syslog-ng로 로컬로그도 관리하거나, 다른 방법이 있는지는 잘 모르겠음
서비스 기동
systemctl stop rsyslog
systemctl disable rsyslog
systemctl start syslog-ng
systemctl enable syslog-ng
기본 syslog-ng의 config이고 local log에 대한 설정이 되어있다.
/etc/syslog-ng/syslog-ng.conf
@version:3.5
@include "scl.conf"
# syslog-ng configuration file.
#
# This should behave pretty much like the original syslog on RedHat. But
# it could be configured a lot smarter.
#
# See syslog-ng(8) and syslog-ng.conf(5) for more information.
#
# Note: it also sources additional configuration files (*.conf)
# located in /etc/syslog-ng/conf.d/
options {
flush_lines (0);
time_reopen (10);
log_fifo_size (1000);
chain_hostnames (off);
use_dns (no);
use_fqdn (no);
create_dirs (no);
keep_hostname (yes);
};
source s_sys {
system();
internal();
# udp(ip(0.0.0.0) port(514));
};
destination d_cons { file("/dev/console"); };
destination d_mesg { file("/var/log/messages"); };
destination d_auth { file("/var/log/secure"); };
destination d_mail { file("/var/log/maillog" flush_lines(10)); };
destination d_spol { file("/var/log/spooler"); };
destination d_boot { file("/var/log/boot.log"); };
destination d_cron { file("/var/log/cron"); };
destination d_kern { file("/var/log/kern"); };
destination d_mlal { usertty("*"); };
filter f_kernel { facility(kern); };
filter f_default { level(info..emerg) and
not (facility(mail)
or facility(authpriv)
or facility(cron)); };
filter f_auth { facility(authpriv); };
filter f_mail { facility(mail); };
filter f_emergency { level(emerg); };
filter f_news { facility(uucp) or
(facility(news)
and level(crit..emerg)); };
filter f_boot { facility(local7); };
filter f_cron { facility(cron); };
#log { source(s_sys); filter(f_kernel); destination(d_cons); };
log { source(s_sys); filter(f_kernel); destination(d_kern); };
log { source(s_sys); filter(f_default); destination(d_mesg); };
log { source(s_sys); filter(f_auth); destination(d_auth); };
log { source(s_sys); filter(f_mail); destination(d_mail); };
log { source(s_sys); filter(f_emergency); destination(d_mlal); };
log { source(s_sys); filter(f_news); destination(d_spol); };
log { source(s_sys); filter(f_boot); destination(d_boot); };
log { source(s_sys); filter(f_cron); destination(d_cron); };
# Source additional configuration files (.conf extension only)
@include "/etc/syslog-ng/conf.d/*.conf"
# vim:ft=syslog-ng:ai:si:ts=4:sw=4:et:
여기에 remote log를 수집할 수 있는 설정을 아래와 같이 추가하면 된다.
아래 설정은 필자가 테스트하면서 진행한 설정이고, 필요한 만큼 정리해서 사용하면 된다.
/etc/syslog-ng/conf.d/remote-log.conf
주의!! destination name이나 filter name이 중복으로 들어가면 기동이 안된다.
source s_remotelog {
udp(ip(0.0.0.0) port(514) flags(no-hostname));
};
destination d_rmessages { file("/data/remote_logs/$HOST-messages.log" owner("root") group("root") perm(0644) create_dirs(yes)); };
destination d_rsecure { file("/data/remote_logs/$HOST-secure.log" owner("root") group("root") perm(0644) create_dirs(yes)); };
destination d_rcron { file("/data/remote_logs/$HOST-cron.log" owner("root") group("root") perm(0644) create_dirs(yes)); };
log { source(s_remotelog); filter(f_default); destination(d_rmessages); };
log { source(s_remotelog); filter(f_auth); destination(d_rsecure); };
log { source(s_remotelog); filter(f_cron); destination(d_rcron); };
가끔 아래와 같이 /var/log 디렉토리가 아닌 /data/remote_log같은 곳에 쓰기 오류가 날 경우엔 selinux를 비활성화 하면 된다.
정상적일 경우 아래와 같이 syslog-ng서버에 remote의 log가 쌓인다.