rsyslogd、syslog远程传输、日志存储、转存



一、产生本地日志

1、/etc/resolv.conf 配置文件
local0~local7是用户自定义的日志
这里我们使用local1,添加以下 
 local1.* /www/admin/admin/log/web_log
配置完需要重启 rsyslogd程序 
/etc/init.d/rsyslog restart

2、程序中用以下记入日志
    openlog("audit_as_cgi", LOG_PID, LOG_LOCAL1);
    syslog(LOG_DEBUG,"%s",write_buf);
    closelog();
audit_as_cgi :是日志前缀
LOG_PID:每条日志都包含进程号
LOG_LOCAL1:是我们自定义的日志类型
LOG_DEBUG:日志等级

3、产生的本地日志,如下所示
rsyslogd、syslog远程传输、日志存储、转存_第1张图片


二、远程发送日志

rsyslog提供三个远程日志传输方式:

  • UDP: 数据包传输可信度不高
  • TCP: 数据包传输可信度比较高
  • RELP: 数据包传输可信度最高,避免数据丢失,比较新的协议,目前应用较少

关于RELP的更进一步了解可以参考 Using TLS with RELP RELP Input Module RELP Output Module (omrelp)

TCP配置和UDP类似,如下

Server端配置

/etc/rsyslog.conf

rsyslogd需要打开 udp 514端口 如下

syslogd需要打开tcp 514端口

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
$AllowedSender TCP, 192.168.80.0/24

# 根据客户端的IP单独存放主机日志在不同目录       
$template Remote,"/var/log/syslog/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"

# 排除本地主机IP日志记录,只记录远程主机日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
& ~
Client端配置
/etc/rsyslog.conf ,这里我们把用户自定义的local1类型日志发送给2.108设备
local1.*	    @@192.168.2.108:514

当然,如果你是用的之前老版本的syslogd程序,则发送端不需要配置文件,直接syslogd -R 服务器地址即可,只不过syslogd好像是UDP协议的514端口,照样可以用rsyslogd接收。

客户端和服务端重启相关服务即可在服务器(192.168.2.108)端看的如下结果:


重启rsyslogd之后如果没有收到日志,查看防火墙是否开启了514端口,没有开启就在服务器端打开514端口

 iptables -I INPUT -p tcp --dport 514 -j ACCEPT
 iptables -I OUTPUT -p tcp --dport 514 -j ACCEPT

三、日志自动转存-logrotate程序

logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。另外,旧日志也可以通过电子邮件发送,不过该选项超出了本教程的讨论范围。

1、在/etc/logrotate.d/ 路径下建立自己的日志配置文件,如下所示:rsyslogd、syslog远程传输、日志存储、转存_第2张图片

第一行:要管理的日志文件

daily: 按天转存

dateext: 按日志备份文件

rotate: 共备份5份,之后会依次替换掉最旧的文件

size=1M:当日志文件达到1M时,才备份

最后3句:必须重启rsyslogd程序,否则日志转存之后,不会写入最新的文件


另外,如果你的远程服务器没有建立好连接,也会影响本地日志的生产速度


四、logrotate触发过程

centos从6开始,daily   hourly  monthly weekly等这些文件夹里面的任务已经不用crond处理,而是交给了anacron处理

1、/etc/cron.hourly/0anacron 会每小时定时运行,由 /etc/cron.d/0hourly 每小时调用一次

/etc/cron.hourly/0anacron 内容如下

if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi


# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power >/dev/null 2>&1
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

它会检测系统当前时间和/var/spool/anacron/cron.daily(谁写入的还没搞清楚)文件里的日期是否一致,一致就退出,否则运行anacron 


2、anacron 程序启动,它的配置文件为/etc/anacrontab ,内容如下:

# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=54   (延时54分、默认延时最小为6分)
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22  这个设置就是你看到日志切割的时间范围,一般是凌晨3点+RANDOM_DELAY+5 大约是凌晨3:59切割文件

下面任务列表:第一列是轮询天数、第2列是延时时间(单位分钟)、第3、4列是任务描述和命令,在此调用daily、weekly、monthly任务
#period in days   delay in minutes   job-identifier   command
15cron.dailynice run-parts /etc/cron.daily
725cron.weeklynice run-parts /etc/cron.weekly
@monthly 45cron.monthlynice run-parts /etc/cron.monthly


3、由上面的anacron 调用cron.daily任务后,logrotate程序得以执行

cat /etc/cron.daily/logrotate ,内容如下:

#!/bin/sh
/usr/sbin/logrotate -s
/var/lib/logrotate.status /etc/logrotate.conf    (这里的路径要注意,有的是 /var/lib/logrotate/logrotate.status
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

logrotate程序调用配置文件/etc/logrotate.conf 及/etc/logrotate.d/路径下的配置,生成按天、周、月为周期的文件。


遗留问题:

logrotate生成的备份日志,日期不太对,没有明确的分隔点。例如16号生成的日志,备份到了17号文件里,而17文件里包含部分18号的内容。

我感觉这类问题,应该通过START_HOURS_RANGE这个参数来设置以尽量缩小时间误差。


你可能感兴趣的:(linux)