rsyslogd服务器及负载均衡

rsyslog和logrotate服务

rsyslog 是一个 syslogd 的多线程增强版。现在Fedora和Ubuntu, rhel6默认的日志系统都是rsyslog了。

rsyslog负责写入日志, logrotate负责备份和删除旧日志, 以及更新日志文件

rsyslog服务

# 安装
yum install rsyslog rsyslog-mysql logrotate

# 查看当前rsyslog服务的状态
/etc/init.d/rsyslog status

# 在centos6中, rsyslog服务默认是开机启动的,我们先看一下它的进程::
ps -ef | grep rsyslogd | grep -v grep
root      1343    1  0 12:09 ?        00:00:00 /sbin/rsyslogd -c 4

#注意,这里的服务名是rsyslog!
chkconfig –list | grep rsyslog
rsyslog         0:off   1:off   2:on    3:on    4:on    5:on    6:off

从上面命令的输出结果看到rsyslog执行时使用的参数是-c 4.

它的意思是指定rsyslog运行(兼容)的版本号, 这个参数必须是第一个参数, 当然也可以省略, 默认为-c0, (命令行兼容sysklogd)

这个参数是在文件/etc/sysconfig/rsyslog中指定:

# Options to syslogd
# syslogd options are deprecated since rsyslog v3
# if you want to use them, switch to compatibility mode 2 by "-c 2"
SYSLOGD_OPTIONS="-c 4"

http://www.sectop.com/?p=105

rsyslog处理大量日志接收时,总是会延迟,说有dns解析的问题。然后man了下rsyslogd,发现有-Q -x参数可以屏蔽dns解析。改下启动脚本:

SYSLOGD_OPTIONS="-c 5 -Q -x"

rsyslog配置文件

配置文件中有很多内容, 但最主要的是指定需要记录哪些服务和需要记录什么等级的信息:

#rsyslog v3 config file
# if you experience problems, check
# http://www.rsyslog.com/troubleshoot for assistance

#### MODULES ####    加载 模块
$ModLoad imuxsock.so  –> 模块名  # provides support for local system logging (e.g. via logger command) 本地系统日志
$ModLoad imklog.so               # provides kernel logging support (previously done by rklogd)
#$ModLoad immark.so              # provides –MARK– message capability

# Provides UDP syslog reception
# 允许514端口接收使用UDP协议转发过来的日志
$ModLoad imudp.so
$UDPServerRun 514

# Provides TCP syslog reception
# 允许514端口接收使用TCP协议转发过来的日志
$ModLoad imtcp.so
$InputTCPServerRun 514

#### GLOBAL DIRECTIVES ####
# 定义日志格式默认模板
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

$IncludeConfig /etc/rsyslog.d/*.conf  # 加入/etc/rsyslog.d下配置文件,如:/etc/rsyslog.d/50-default.conf

#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console    关于内核的所有日志都放到/dev/console(控制台)
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
# 记录所有日志类型的info级别以及大于info级别的信息到/var/log/messages,但是mail邮件信息,authpriv验证方面的信息和cron时间任务相关的信息除外
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
# The authpriv file has restricted access.
# authpriv验证相关的所有信息存放在/var/log/secure
authpriv.*                                              /var/log/secure
# Log all the mail messages in one place.
# 邮件的所有信息存放在/var/log/maillog; 这里有一个-符号,表示是使用异步的方式记录, 因为日志一般会比较大
mail.*                                                  -/var/log/maillog
# Log cron stuff
# 计划任务有关的信息存放在/var/log/cron
cron.*                                                  /var/log/cron
# Everybody gets emergency messages
# 记录所有的大于等于emerg级别信息, 以wall方式发送给每个登录到系统的人
*.emerg                          *          #  *代表所有在线用户
# Save news errors of level crit and higher in a special file.
# 记录uucp,news.crit等存放在/var/log/spooler
uucp,news.crit                                          /var/log/spooler
# Save boot messages also to boot.log     启动的相关信息
local7.*                                                /var/log/boot.log
#:rawmsg, contains, "sdns_log" @@192.168.56.7:10514
#:rawmsg, contains, "sdns_log" ~
# ### begin forwarding rule ###  转发规则
# The statement between the begin … end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$WorkDirectory /var/spppl/rsyslog # where to place spool files
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514                    # @@表示通过tcp协议发送  @表示通过udp进行转发
#local3.info  @@localhost:514
#local3.info -/var/log/ipwall/messages.log
#local7.*                                 # @@192.168.56.7:514
# ### end of the forwarding rule ###
# 日志设备(类型).(连接符号)日志级别            日志处理方式(action)
*.info;mail.none;authpriv.none;cron.none   /var/log/messages
日志设备/类型 说明
auth –pam产生的日志
authpriv –ssh,ftp等登录信息的验证信息
cron –时间任务相关
kern –内核
lpr –打印
mail –邮件
mark(syslog) –rsyslog服务内部的信息,时间标识
news –新闻组
user –用户程序产生的相关信息
uucp –unix to unix copy, unix主机之间相关的通讯
local 1~7 –自定义的日志设备

从上到下,级别从低到高,记录的信息越来越少 详细的可以查看手册: man 3 syslog

级别 说明 级别值
debug –有调式信息的,日志信息最多 7
info –一般信息的日志,最常用  
notice –最具有重要性的普通条件的信息  
warning –警告级别 4
err –错误级别,阻止某个功能或者模块不能正常工作的信息  
crit –严重级别,阻止整个系统或者整个软件不能正常工作的信息  
alert –需要立刻修改的信息  
emerg –内核崩溃等严重信息  
none –什么都不记录  
连接符号 说明
.xxx 表示大于等于xxx级别的信息
.=xxx 表示等于xxx级别的信息
.!xxx 表示在xxx之外的等级的信息

日志记录的顺序有先后关系!

配置范例

把包含'oracle'的日志保存在/var/log/oracle.log

但是没有定义保存在远程的哪一个文件啊?

其实保存在什么文件, 那是远程日志服务器接收到日志之后它自己的事情了.

注意:如果要修改为非514的端口, 需要设置SElinux。

远程发送接收配置

配置例1

配置例2

在客户端上执行,观察服务端/var/log/目录里是否有tlog*日志产生。

logger -p user.info "sdns_log 34334"

如果要把不同服务器发送过来的日志保存到不同的文件, 可以这样操作:

:fromhost-ip, isequal, "192.168.0.160" /var/log/host160.log
:FROMHOST-IP, isequal, "192.168.0.161" /var/log/host161.log
:FROMHOST-IP, startswith, "192.168.1." /var/log/network1.log
:FROMHOST-IP, startswith, "192.168.2." /var/log/network2.log

logrotate服务

rotate 轮换,日志切换

logrotate是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为"转储"。我们可以根据日志的大小,或者根据其使用的天数来转储。

logrotate启动方式

logrotate 的执行由crond服务实现。在/etc/cron.daily目录中,有个文件logrotate,它实际上是个shell script,用来启动logrotate。logrotate程序每天由cron在指定的时间(/etc/crontab)启动。

因此,使用ps是无法查看到logrotate的。如果它没有起来,就要查看一下crond服务有没有在运行。

在执行logrotate时,需要指定其配置文件/etc/logrotate.conf

这个配置文件的注释写得很清楚,没有必要再罗嗦了。只想强调下面这行,它的作用包含存放在/etc/logrotate.d目录下面的配置文件,不可或缺。如果你安装了一个新的服务,它的日志转储的规则可以建立一个专门的配置文件,放在/etc/logrotate.d下面。它其实也因为下面的这句话,在 logrotate服务启动时被读取。

每个存放在/etc/logrotate.d目录里的文件,都有上面格式的配置信息。在{}中定义的规则,如果与logrotate.conf中的冲突,以/etc/logrotatate.d/中的文件定义的为准。

logrotate启动脚本放在 /etc/cron.daily/logrotate 中,可人工执行命令进行测试:

/usr/sbin/logrotate -f /etc/logrotate.conf

dateext表示转储文件会以日期来结束*

配置logrotate

日志文件匹配规则中,不要使用/var/log/news/*,这会匹配已经切换过的日志,应使用/var/log/news/*.log

选项 用途
nocompress,compress 不压缩,压缩
delaycompress 不压缩前一个截断的文件(需要与compress一起用)
daily,weekly,monthly 每天/周/月轮转一次
copytruncate 清空原有文件,而不是创建一个新文件
create 0644 root utmp 新建日志文件,权限、属主、组
ifempty 即使用空文件也转储
notifempty 日志文件为空不进行转储
olddir <dir> 转储后的日志存放目录,必须和当前日志文件在同一个文件系统
rotate 5 保留最近的5个日志文件
minisize 1M 必须大于1MB才会转转
size 50M 超过50MB后轮转日志
mail www@my.org 轮换后的把日志发给邮箱
missingok 如果日志文件不存在,不报错
prerotate,endscript 在logrotate之前执行的命令,如/usr/bin/charrt -a /var/log/logfile
postrotate,endscript 在logrotate之后执行的命令,如/usr/bin/charrt +a /var/log/logfile
/bin/kill -HUP $(/bin/cat /var/run/rsyslogd.pid 2>/dev/null) &>/dev/null
/usr/bin/killall -HUP httpd
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
sharedscripts 共享脚本,表示切换时只执行一次脚本
dateext 增加日期作为后缀,不然会是一串无意义的数字
dateformat .%s 切换后文件名,必须配合dateext使用

logrotate命名方式确实太单调了,默认通过数字后缀来分割,支持时间格式函数格式,但是只支持 %Y %m %d %s这4个函数,由于logrotate确实不支持“小时:分钟”这样的函数。

无奈只有写了个脚本把%s的秒数换算成日期+时刻这样的惯用格式,并且我们把日志文件按日期分类到各个文件夹里。我们在 /etc/rsyslog.d/rename.sh 创建一个文件,注意更改执行权限 chmod 755 /etc/rsyslog.d/rename.sh。

#!/bin/bash
/usr/sbin/logrotate /etc/logrotate.conf
cd /var/log/ipwall
/bin/ls | /usr/bin/awk -F'.' '/log.*gz/{system("mv "$0" `date -d \"@"$3"\" +%y-%m-%d_%H-%M`.gz")}'
/bin/ls *gz | /usr/bin/awk -F"_" 'NR==1{i=$1;system("mkdir -p "i"")}{if($1==i)system("mv "$0" "i"")}'

防火墙上网日志记录要求最大化保存日志,没有设置rotate回滚次数,上面的脚本按照日期把日志保存到文件夹内,下面的脚本是当磁盘空间接近饱和的时候删除最早那天的日志文件夹,我们在 chmod 755 /etc/rsyslog.d/delbak.sh 创建更更改权限。

#!/bin/bash
SPACE=$(df /var/log/ipwall | awk 'NR==2{print $4}')
SP=20000000
cd /var/log/ipwall
[ $SPACE -le $SP ] && ls -d */ | awk 'NR==1{system("rm -rf "$0"")}'

PHP客户端

PHP语言编写的一个简单的syslog客户端,通过UDP协议,直接将日志消息发送给 rsyslogd日志服务。

http://xmgu2008.blog.163.com/blog/static/1391223802010518115219906/

function mgsyslog($level,$msg)
{
    $server="192.168.120.67";
    $port=518;
    $facility=1;
    $pid=posix_getpid();
    $process="PHP[${pid}]";
    $actualtime = time();
    $month      = date("M", $actualtime);
    $day        = substr("  ".date("j", $actualtime), -2);
    $hhmmss     = date("H:i:s", $actualtime);
    $timestamp  = $month." ".$day." ".$hhmmss;
    $hostname=gethostname();
    $pri    = "<".($facility*8 + $level).">";
    $header = $timestamp." ".$hostname;
    $message = substr($pri.$header." ".$process.": ".$msg, 0, 1024);

    $fp = fsockopen("udp://".$server, $port, $errno, $errstr);
    if ($fp)
    {
        fwrite($fp, $message);
        fclose($fp);
        return true;
    }
    return false;
}

rsyslogv7

rsyslogd v7: http://www.rsyslog.com/

安装