rsyslog的三种传输协议


debian rsyslog 传输协议

简介

rsyslog 可以理解为多线程增强版的syslog。 
在syslog的基础上扩展了很多其他功能,如数据库支持(Mysql、PostgreSQL、Oracle等)、日志内容筛选、定义日志格式模板等。

目前大多数linux发行版默认也是使用rsyslog进行日志记录。这里主要介绍rsyslog的几种传输协议。



协议

rsyslog提供了三种远程传输协议,分别是:

  • UDP 传输协议 
    基于传统UDP协议进行远程日志传输,也是传统syslog使用的传输协议; 
    可靠性比较低,但性能损耗最少, 在网络情况比较差, 
    或者接收服务器压力比较高情况下,可能存在丢日志情况。 
    在对日志完整性要求不是很高,在可靠的局域网环境下可以使用。
  • TCP 传输协议 
    基于传统TCP协议明文传输,需要回传进行确认,可靠性比较高; 
    但在接收服务器宕机或者两者之间网络出问题的情况下,会出现丢日志情况。 
    这种协议相比于UDP在可靠性方面已经好很多,并且rsyslog原生支持,配置简单, 
    同时针对可能丢日志情况,可以进行额外配置提高可靠性,因此使用比较广。
  • RELP 传输协议 
    RELP(Reliable Event Logging Protocol)是基于TCP封装的可靠日志消息传输协议; 
    是为了解决TCP 与 UDP 协议的缺点而在应用层实现的传输协议,也是三者之中最可靠的。 
    需要多安装一个包rsyslog-relp以支持该协议。

以下是man手册中对RELP的描述:

ManPage 
RELP can be used instead of UDP or plain TCP syslog to provide reliable delivery of syslog messages. Please note that plain TCP syslog does NOT provide truly reliable delivery, with it messages may be lost when there is a connection problem or the server shuts down. RELP prevents message loss in those cases.

关于RELP的更多详细资料,可以参考一下链接:



配置

/etc/rsyslog.conf 

但通常并不会去修改主配置文件,而是在include目录中创建自定义的配置文件, 

当加载主配置文件后,会自动到加载其他子配置文件(/etc/rsyslog.d/)。/etc/rsyslog.d目录下创建新的配置文件, 

关联不大的配置内容尽量独立配置文件,方便管理。

下面介绍三种协议一些简单的配置



UDP传输配置

/etc/rsyslog.d/udp.conf, 

并按照以下内容进行配置,完成后重启rsyslog(/etc/init.d/rsyslog restart) 

另外需要确保iptables没有封禁相应端口。

# server configure

$ModLoad imudp # 加载模块

$UDPServerRun 10514    # 指定监听端口

$AllowedSender UDP, 10.0.0.0/16    # 设置白名单

# 根据客户端IP存放到不同目录下,以日期命名文件

$template location,/data/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log
# 自定义日志格式

$template uformat,"%fromhost-ip% %msg%\n"

# 把非本地传输的日志按照指定的文件路径及格式保存

:fromhost-ip, !isequal, "127.0.0.1" -?location;uformat
# & 表示已经匹配处理的内容,~ 表示不再进行其他处理

& ~

/etc/rsyslog.d/udp_send.conf

# client configure
*.*     @10.0.0.1:10514 # 表示所有日志都发送到指定server

配置完成后,需要重启rsyslog,然后就可以到服务端检查日志是否发送成功。



TCP传输配置

/etc/rsyslog.d/tcp.conf

# server configure

$ModLoad imtcp # 加载模块

$UDPServerRun 20514    # 指定监听端口

$AllowedSender TCP, 10.0.0.0/16    # 设置白名单

# 根据客户端IP存放到不同目录下,以日期命名文件

$template location,/data/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log
# 自定义日志格式

$template uformat,"%fromhost-ip% %msg%\n"

# 把非本地传输的日志按照指定的文件路径及格式保存

:fromhost-ip, !isequal, "127.0.0.1" -?location;uformat
# & 表示已经匹配处理的内容,~ 表示不再进行其他处理

& ~

/etc/rsyslog.d/tcp_send.conf

# client configure
*.*     @@10.0.0.1:20514    # 表示所有日志都发送到指定server

配置完分别在服务端及客户端上重启rsyslog服务即可:


/etc/init.d/rsyslog restart

关于TCP与UDP传输的对比,官网上的推荐:Using the syslog receiver module



RELP传输配置

rsyslog-relp包,需要在服务端及客户端都安装:

apt-get update

apt-get -y install rsyslog-relp

/etc/rsyslog.d/relp.conf

# server configure

$ModLoad imrelp    # 加载模块

$UDPServerRun 30514    # 指定监听端口

# 根据客户端IP存放到不同目录下,以日期命名文件

$template location,/data/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log
# 自定义日志格式

$template uformat,"%fromhost-ip% %msg%\n"

# 把非本地传输的日志按照指定的文件路径及格式保存

:fromhost-ip, !isequal, "127.0.0.1" -?location;uformat
# & 表示已经匹配处理的内容,~ 表示不再进行其他处理

& ~

/etc/rsyslog.d/relp_send.conf

# client configure
*.*     :omrelp:10.0.0.1:30514  # 表示所有日志都发送到指定serve

配置完分别在服务端及客户端上重启rsyslog服务即可:


/etc/init.d/rsyslog restart