如何使用 rsyslog 配置一个服务器接收日志

1,271 阅读7分钟

使用 rsyslog 配置一个服务器接收日志(Server)、另一个服务器发送日志(Client)的详细步骤:


架构说明

  • 日志接收服务器(Server):负责集中存储来自其他服务器的日志。
  • 日志发送服务器(Client):将本地日志转发到接收服务器。

一、日志接收服务器(Server)配置

1. 修改 rsyslog 配置文件

编辑 /etc/rsyslog.conf,启用远程日志接收功能:

sudo vim /etc/rsyslog.conf

2. 启用 UDP/TCP 协议接收

取消注释或添加以下配置(选择一种协议或同时启用两者):

  • UDP 接收(速度快,无连接)
    # 启用 UDP 模块
    module(load="imudp")
    input(type="imudp" port="514")
    
    # 定义日志存储路径模板(按客户端IP分类)
    $template RemoteLogs, "/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log"
    *.* ?RemoteLogs
    
  • TCP 接收(可靠,有连接)
    # 启用 TCP 模块
    module(load="imtcp")
    input(type="imtcp" port="514")
    
    # 定义日志存储路径模板(按客户端IP分类)
    $template RemoteLogs, "/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log"
    *.* ?RemoteLogs
    

3. 创建日志存储目录

sudo mkdir -p /var/log/remote
sudo chown -R syslog:syslog /var/log/remote
# 报错时
sudo groupadd syslog
sudo useradd -g syslog syslog

4. 重启 rsyslog 服务

sudo systemctl restart rsyslog

5. 验证端口监听

检查是否已监听 514 端口:

sudo netstat -tuln | grep 514
# 应看到如下输出(UDP/TCP):
# udp        0      0 0.0.0.0:514             0.0.0.0:*
# tcp        0      0 0.0.0.0:514             0.0.0.0:*

二、日志发送服务器(Client)配置

1. 修改 rsyslog 配置文件

编辑 /etc/rsyslog.conf,添加转发规则:

sudo vim /etc/rsyslog.conf

2. 配置转发到接收服务器

在文件末尾添加以下规则(选择 UDP 或 TCP):

  • 通过 UDP 发送
    *.* @server-ip:514     # @ 表示 UDP
    
  • 通过 TCP 发送
    *.* @@server-ip:514    # @@ 表示 TCP
    

3. 重启 rsyslog 服务

sudo systemctl restart rsyslog

三、验证日志传输

1. 在 Client 发送测试日志

# 生成一条测试日志
logger "This is a test message from Client"

2. 在 Server 检查日志

查看日志接收目录,按客户端 IP 分类的日志文件:

ls /var/log/remote/
# 输出示例:
# 192.168.1.100

# 查看具体日志文件
tail -f /var/log/remote/192.168.1.100/syslog.log

四、防火墙配置(可选)

如果服务器启用了防火墙,需放行 514 端口:

  • Ubuntu (ufw)
    sudo ufw allow 514/udp
    sudo ufw allow 514/tcp
    sudo ufw reload
    
  • CentOS (firewalld)
    sudo firewall-cmd --permanent --add-port=514/udp
    sudo firewall-cmd --permanent --add-port=514/tcp
    sudo firewall-cmd --reload
    

五、高级配置(可选)

1. 加密传输(TLS)

若需安全传输,可配置 TLS 加密:

2. 过滤特定日志

仅转发特定日志(例如 authkernel 日志):

# 在 Client 的配置中添加:
auth.*,kern.* @@server-ip:514

3. 日志轮转

配置 logrotate 管理日志文件:

sudo vim /etc/logrotate.d/remote-logs
# 添加以下内容:
/var/log/remote/*/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        systemctl reload rsyslog > /dev/null 2>&1 || true
    endscript
}

总结

  • Server:启用 UDP/TCP 监听,定义日志存储模板。
  • Client:配置转发规则到 Server。
  • 验证:通过 logger 命令和日志文件检查传输是否成功。

问题

当rsyslog无法将日志写入远程服务器时,可以按照以下步骤逐步排查和解决问题:


1. 检查rsyslog配置

确保客户端和服务器端的配置正确。

客户端配置

  • 发送日志的语法
    • UDP:*.* @remote-host:514(单个@
    • TCP:*.* @@remote-host:514(双@
    • 示例:将所有日志通过TCP发送到远程服务器:
      # 在 /etc/rsyslog.conf 或 /etc/rsyslog.d/*.conf 中添加
      *.* @@192.168.1.100:514
      

服务器端配置

  • 确保服务器端已启用接收远程日志:

    # 取消注释或添加以下行(通常位于 /etc/rsyslog.conf)
    module(load="imudp")       # 启用UDP
    input(type="imudp" port="514")
    
    module(load="imtcp")       # 启用TCP
    input(type="imtcp" port="514")
    
  • 允许接收来自客户端的日志(可选):

    # 限制允许的客户端IP(示例)
    $AllowedSender UDP, 192.168.1.0/24
    $AllowedSender TCP, 192.168.1.0/24
    

2. 检查网络连通性

验证端口是否可达

  • 从客户端测试远程服务器的端口:
    telnet 192.168.1.100 514      # TCP
    nc -zv 192.168.1.100 514      # TCP/UDP
    

防火墙规则

  • 客户端和服务器端的防火墙需放行514端口:

    # 示例:使用firewalld(TCP)
    firewall-cmd --permanent --add-port=514/tcp
    firewall-cmd --reload
    
    # 或使用iptables(UDP)
    iptables -A INPUT -p udp --dport 514 -j ACCEPT
    
  • 云服务器安全组:确保云平台(如AWS、阿里云)的安全组允许514端口的入站流量。


3. 检查远程rsyslog服务状态

  • 确保远程rsyslog服务正在运行

    systemctl status rsyslog      # 查看服务状态
    systemctl restart rsyslog     # 重启服务
    
  • 检查远程服务器是否在监听514端口

    netstat -tuln | grep 514
    ss -tuln | grep 514
    

4. 检查SELinux/AppArmor

  • 临时禁用SELinux(仅用于测试):

    setenforce 0
    
  • 永久允许rsyslog网络连接

    # SELinux
    setsebool -P rsyslog_network_connect 1
    
    # AppArmor(编辑配置文件)
    vim /etc/apparmor.d/usr.sbin.rsyslogd
    # 确保包含:network inet stream,
    

5. 查看日志

客户端日志

  • 检查客户端本地的rsyslog日志:
    tail -f /var/log/syslog | grep rsyslog
    

服务器端日志

  • 检查远程服务器是否收到日志:
    tail -f /var/log/syslog      # 默认日志路径可能因系统而异
    

6. 检查文件权限(服务器端)

  • 确保远程服务器的日志目录有写入权限:
    chmod 755 /var/log/
    chown syslog:syslog /var/log/remote/   # 如果配置了自定义日志路径
    

7. 调试模式

启用rsyslog调试日志

  • 修改rsyslog配置:

    # 在 /etc/rsyslog.conf 中添加
    $DebugLevel 2     # 调试级别(0-2)
    
  • 重启服务并查看日志:

    systemctl restart rsyslog
    tail -f /var/log/syslog | grep rsyslog
    

8. 其他常见问题

  • 协议不匹配:客户端使用TCP(@@),但服务器端仅启用UDP。
  • 主机名解析失败:在配置中使用IP地址代替主机名。
  • rsyslog版本差异:旧版本可能需要使用$ModLoad语法,新版本(如v8+)使用module()语法。

总结命令清单

# 客户端测试端口连通性
nc -zv 192.168.1.100 514

# 服务器端检查端口监听
netstat -tuln | grep 514

# 重启rsyslog服务
systemctl restart rsyslog

# 查看实时日志(客户端和服务端)
tail -f /var/log/syslog

通过以上步骤,可以定位并解决大多数rsyslog远程日志传输问题。

Logrotate日志轮转配置解释

以管理 /var/log/remote/ 目录下按客户端 IP 分类的日志文件为例:


配置示例

/var/log/remote/*/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        systemctl reload rsyslog > /dev/null 2>&1 || true
    endscript
}

逐行解释

1. 定义日志文件路径

/var/log/remote/*/*.log
  • 作用:匹配 /var/log/remote 下所有子目录(客户端 IP)中的 .log 文件。
  • 示例
    /var/log/remote/192.168.1.100/syslog.log
    /var/log/remote/192.168.1.101/kernel.log

2. 轮转周期

daily
  • 作用:每天轮转一次日志。
  • 其他选项
    • weekly:每周轮转。
    • monthly:每月轮转。
    • size 100M:日志文件达到 100MB 时轮转。

3. 容错处理

missingok
  • 作用:如果日志文件不存在,跳过不报错。

4. 保留历史文件数

rotate 7
  • 作用:保留最近 7 次轮转的日志文件(如 syslog.log.1.gz ~ syslog.log.7.gz),超出数量的旧文件会被删除。

5. 压缩日志

compress
  • 作用:使用 gzip 压缩旧日志文件,生成 .gz 文件(例如 syslog.log.1.gz)。

6. 延迟压缩

delaycompress
  • 作用:本次轮转的日志文件(如 syslog.log.1)不压缩,等到下次轮转时再压缩。
  • 适用场景:避免某些程序(如 rsyslog)因文件突然被删除而丢失日志。

7. 空文件不轮转

notifempty
  • 作用:如果日志文件为空,则不执行轮转。

8. 共享脚本

sharedscripts
  • 作用:无论匹配到多少个日志文件,postrotate 脚本只运行一次(默认对每个文件单独运行)。

9. 轮转后执行命令

postrotate
    systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
  • 作用:轮转完成后,通知 rsyslog 重新打开日志文件句柄,确保日志继续写入新文件。
  • 关键点
    • systemctl reload rsyslog:平滑重启 rsyslog,避免服务中断。
    • > /dev/null 2>&1:屏蔽命令的输出。
    • || true:防止脚本因命令失败而终止。

轮转流程示例

假设日志文件 /var/log/remote/192.168.1.100/syslog.log 每天轮转一次:

  1. 第 1 天
    • 原始文件:syslog.log
    • 轮转后:
      • syslog.log.1(未压缩,因 delaycompress
      • 新日志继续写入 syslog.log
  2. 第 2 天
    • 轮转后:
      • syslog.log.1 → 压缩为 syslog.log.1.gz
      • syslog.log.2(未压缩)
  3. 第 8 天
    • 最旧的 syslog.log.7.gz 被删除(因 rotate 7)。

验证配置

1. 手动触发轮转

logrotate -vf /etc/logrotate.d/remote-logs
  • -v:显示详细过程。
  • -f:强制立即轮转。

2. 查看轮转结果

ls /var/log/remote/192.168.1.100/
# 输出示例:
# syslog.log  syslog.log.1.gz  syslog.log.2.gz

常见问题

1. 日志权限问题

  • 确保 /var/log/remote/ 目录权限为 syslog:syslog
    chown -R syslog:syslog /var/log/remote
    

2. 自定义压缩工具

若需使用 xz 替代 gzip

compresscmd /usr/bin/xz
compressoptions -9

3. 按日期命名日志

在配置中添加:

dateext
dateformat -%Y%m%d
  • 轮转后的文件名为 syslog.log-20231001.gz

总结

  • 核心配置:定义日志路径、轮转周期、保留数量、压缩策略。
  • 关键脚本:通过 postrotate 通知服务重新加载,避免日志丢失。
  • 调试命令logrotate -vf 可快速验证配置。