syskolgd的缺点
虽说 Sysklogd 已经发展进30余年,但其性能在高负载下会有诸多问题,如:
Ø 记录丢失
Syslog 默认使用 UDP 514 端口来接收远程主机发送过来的日志,当有大量的日志需要syslogd进程来处理时就会有所残缺。这是由于 UDP 并没有丢包检测、重传、速率控制等机制,因此当很高速率的去发送 UDP 包时,对端检测到丢包是必然的。
Ø 记录缓慢,磁盘IO利用率较高进而导致CPU阻塞影响系统性能
当有大量的日志需要syslogd 进程来处理时,syslogd 进程会频繁请求磁盘IO,使磁盘利用率升高,进而导致CPU由于等待进程完成IO请求而发生阻塞,最终影响系统性能。
关于Rsyslog
Rsyslog 可以理解为一个 sysklogd 的多线程增强版,其在 sysklogd 的基础上扩展了很多其他功能,如:数据库支持(Mysql、Oracle、PostgreSQL等)、日志内容筛选、定义日志格式模板等。除了默认的 UDP 协议外,Rsyslog 还支持 TCP 协议来接受日志。可以对输出的文件进行自动压缩并支持多个TCP侦听以及性能方面的提升。使用 Rsyslog 可以有效减轻系统磁盘IO,并且其支持TCP传输非常可靠,可以对日志进行过滤,提取有效日志。况且 Red Hat 从6.0开始已经选择了 Rsyslog,自然是有它的道理的。如果我们自己没有研发能力,那么“跟随上游”,无疑是最明智的选择。
看图说话(磁盘TPS为200-300):
替换前(sysklogd):
替换后(rsyslog):
我的配置:
因为rsyslog是支持多进程启动的,我这里配置了两个配置文件分别启动 rsyslog,用来分开本地日志和远程日志方便以后分析,提取不同地方的日志。
1. 配置 rsyslog.conf 用于监听本地 syslog 日志:
...
# 加载本地 syslog 模块
$ModLoad imuxsock
# 加载 kernel 模块
$ModLoad imklog
# 定义日志格式默认模板
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none -/var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* -/var/log/cron
# Everybody gets emergency messages
# *.emerg *
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit -/var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
...
注:action:'*' 以后将会被rsyslog遗弃(与rsyslog语法有歧义),rsyslog将采用“ :omusrmsg:*”的写法
2. 配置 rsyslog.udp.conf 用于监听UDP远程 syslog 日志:
...
# 加载 udp 侦听模块
$ModLoad imudp.so
# 指定 udp 侦听端口
$UDPServerRun 514
# 定义日志格式
$template NETCOOL,"%TIMESTAMP% %fromhost-ip% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
$ActionFileDefaultTemplate NETCOOL
# Log all the messages in one place.
*.* /var/log/ncolog
...
注:模板 RSYSLOG_TraditionalFileFormat 为rsyslog默认保留模板,官网对其的解释是:the "old style" default log file format with low-precision timestamps,它的具体格式为:
$template TraditionalFileFormat,"%TIMESTAMP% %HOSTNAME%%syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
其中:TraditionalFileFormat为模板名;“ ”之间的为模板内容,由一些变量构成,常用的有:msg消息主体、fromhost-ip来源IP等。这个模板貌似对H3C设备token4的解析存在一些问题,建议将%HOSTNAME%替换为%fromhost-ip%另行自定义模板
3. 为了方便日后的维护,我们按照 RedHat 的风格编写 Rsyslog 的启动脚本:
01
#!/bin/bash
02
# chkconfig: 2345 12 88
03
# description: Modded by ms2008 on 2013/02/16
04
05
# Source function library.
06
. /etc/init.d/functions
07
08
RETVAL=0
09
PIDFILE1=/var/run/rsyslogd.pid
10
PIDFILE2=/var/run/rsyslogd.udp.pid
11
CONFILE1=/etc/rsyslog.conf
12
CONFILE2=/etc/rsyslog.udp.conf
13
14
prog=rsyslog
15
exec
=/usr/
local
/sbin/rsyslogd
16
lockfile=/var/lock/subsys/$prog
17
18
# Source config
19
if
[ -f /etc/sysconfig/$prog ] ;
then
20
. /etc/sysconfig/$prog
21
fi
22
23
start() {
24
[ -x $
exec
] ||
exit
5
25
26
umask
077
27
28
echo
-n mce_markerquot;Starting
local
logger: "
29
# this one listens on the "usual" socket /dev/log
30
daemon --pidfile=
"$PIDFILE1"
$
exec
-x -f $CONFILE1 -i
"$PIDFILE1"
31
RETVAL=$?
32
echo
33
[ $RETVAL -
eq
0 ] &&
touch
$lockfile
34
# this one listens only to the UDP port
35
sleep
1
36
[ $RETVAL -
eq
0 ] && {
echo
-n mce_markerquot;Starting remote logger:
"; daemon --pidfile="
$PIDFILE2
" $exec -x -f $CONFILE2 -i "
$PIDFILE2"; }
37
RETVAL=$?
38
echo
39
40
return
$RETVAL
41
}
42
stop() {
43
echo
-n mce_markerquot;Shutting down
local
logger: "
44
killproc -p
"$PIDFILE1"
$
exec
45
RETVAL=$?
46
echo
47
[ $RETVAL -
eq
0 ] && {
echo
-n mce_markerquot;Shutting down remote logger:
"; killproc -p "
$PIDFILE2" $
exec
; }
48
RETVAL=$?
49
echo
50
[ $RETVAL -
eq
0 ] &&
rm
-f $lockfile
51
return
$RETVAL
52
}
53
rhstatus() {
54
status -p
"$PIDFILE1"
-l $prog $
exec
55
status -p
"$PIDFILE2"
-l $prog $
exec
56
}
57
restart() {
58
stop
59
start
60
}
61
62
case
"$1"
in
63
start)
64
start
65
;;
66
stop)
67
stop
68
;;
69
restart)
70
restart
71
;;
72
reload)
73
exit
3
74
;;
75
force-reload)
76
restart
77
;;
78
status)
79
rhstatus
80
;;
81
condrestart|try-restart)
82
rhstatus >/dev/null 2>&1 ||
exit
0
83
restart
84
;;
85
*)
86
echo
mce_markerquot;Usage: $0 {start|stop|restart|condrestart|try-restart|reload|force-reload|status}"
87
exit
3
88
esac
89
90
exit
$?