qq_51247807 2025-08-07 13:57 采纳率: 66.7%
浏览 6

syslog如何支持指定日志文件内容实时上传到远程服务器

#问题背景:
通过欧拉操作系统的rsyslog服务实现对指定日志文件的日志实时上传到syslog服务器
rsyslog版本为:rsyslogd 8.2210.0
#问题现象
在/etc/rsyslog.d文件夹下创建02-rsyslog.conf配置文件,文件内容为:

input(type="imfile"
      File="/opt/cbsvs/logs/cosign/business_20250806.log"
      Tag="myapp-log:"
      Severity="info"
      Facility="local7"
      PersistStateInterval="100"
      ReadMode="2"
)
        action(type="omfwd"
                Target="192.168.2.194"
                Port="514"
                Protocol="udp"
                Template="RSYSLOG_Tradit

上述为配置文件,已加载imfile模块,这样远程服务器可以接收
但是这个配置文件有缺陷,会把指定日志文件外的日志上传到远程服务器,我想只上传指定日志文件的日志到远程服务器于是配置了如下配置:


input(type="imfile"
      File="/opt/cbsvs/logs/cosign/business_20250806.log"
      Tag="myapp-log:"
      Severity="info"
      Facility="local7"
      PersistStateInterval="100"
      ReadMode="2"
)
if $syslogtag == "myapp-log:" then {
        action(type="omfwd"
                Target="192.168.2.194"
                Port="514"
                Protocol="udp"
                Template="RSYSLOG_TraditionalFileFormat"
        )
        stop
}

重启rsyslog后不起作用,通过rsyslogd -N1 -f /etc/rsyslog.d/02-rsyslog.conf命令出现rsyslogd: error during parsing file /etc/rsyslog.d/02-nginx.conf, on or before line 9: parameter 'readTimeout' not known -- typo in config file? [v8.2210.0 try https://www.rsyslog.com/e/2207 ] 这个该如何解决

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-08-07 13:58
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在使用 rsyslog 实现对指定日志文件的实时上传时,配置不当会导致其他日志也被转发。你提到的配置中存在语法错误和逻辑问题,下面将逐步解释并提供解决方案。


    一、问题分析

    1. 配置文件内容不完整
      你的配置文件中 Template="RSYSLOG_Tradit 存在拼写错误(应为 RSYSLOG_TraditionalFileFormat)。

    2. 配置逻辑错误
      在 rsyslog 中,if 条件判断不能直接放在 input 模块之后,而是应该放在 action 部分之前,并且需要确保模块加载正确。

    3. 未禁用默认日志转发
      如果没有明确禁止其他日志的转发,系统默认会将所有日志发送到远程服务器,导致你提到的“其他日志也被上传”的现象。

    4. 配置文件路径错误
      你提到命令 rsyslogd -N1 -f /etc/rsyslog.d/02-rsyslog.conf,但报错信息却提示的是 /etc/rsyslog.d/02-nginx.conf,说明可能存在文件名不一致的问题。

    5. readTimeout 参数不存在
      报错信息显示 parameter 'readTimeout' not known,这可能是因为你在配置中误用了某些无效参数。


    二、解决方案

    1. 修正配置文件内容

    确保你的配置文件是 02-rsyslog.conf,并且内容如下:

    # 加载 imfile 模块(如果未自动加载)
    module(load="imfile" PollingInterval="10")
    
    # 定义输入源:指定日志文件
    input(type="imfile"
          File="/opt/cbsvs/logs/cosign/business_20250806.log"
          Tag="myapp-log:"
          Severity="info"
          Facility="local7"
          PersistStateInterval="100"
          ReadMode="2"
    )
    
    # 设置模板(可选,用于格式化输出)
    template(name="RSYSLOG_TraditionalFileFormat" type="string" string="<%PRI%>%TIMESTAMP% %HOSTNAME% %APP-NAME%[%PID%]: %msg%\n")
    
    # 根据 tag 过滤日志,并转发到远程服务器
    if $syslogtag == "myapp-log:" then {
        action(type="omfwd"
               Target="192.168.2.194"
               Port="514"
               Protocol="udp"
               Template="RSYSLOG_TraditionalFileFormat")
        stop
    }
    

    重点说明:

    • 使用 if $syslogtag == "myapp-log:" 确保只转发带有该标签的日志。
    • stop 表示一旦匹配成功,不再执行后续动作(避免其他日志被转发)。

    2. 检查配置文件路径和名称

    确保你正在编辑的是 /etc/rsyslog.d/02-rsyslog.conf,而不是其他文件如 02-nginx.conf。可以通过以下命令确认:

    ls -l /etc/rsyslog.d/
    

    3. 验证配置文件语法

    运行以下命令检查配置文件是否有语法错误:

    rsyslogd -N1 -f /etc/rsyslog.d/02-rsyslog.conf
    

    如果出现错误,请根据提示修复。


    4. 重启 rsyslog 服务

    修改配置后,重启 rsyslog 服务以应用更改:

    systemctl restart rsyslog
    

    5. 检查远程服务器是否接收日志

    在远程 syslog 服务器上,可以使用以下命令查看是否接收到日志:

    tail -f /var/log/syslog
    

    或使用 tcpdump 检查 UDP 端口 514 的流量:

    tcpdump -i any port 514
    

    三、总结

    | 步骤 | 内容 | |------|------| | 1 | 修正配置文件内容,确保标签过滤逻辑正确 | | 2 | 检查文件路径和名称,避免混淆 | | 3 | 使用 -N1 命令验证配置语法 | | 4 | 重启 rsyslog 服务 | | 5 | 在远程服务器上验证日志接收情况 |


    四、代码修改建议

    以下是最终推荐的配置文件内容(02-rsyslog.conf):

    # 加载 imfile 模块
    module(load="imfile" PollingInterval="10")
    
    # 输入指定日志文件
    input(type="imfile"
          File="/opt/cbsvs/logs/cosign/business_20250806.log"
          Tag="myapp-log:"
          Severity="info"
          Facility="local7"
          PersistStateInterval="100"
          ReadMode="2"
    )
    
    # 定义日志格式模板
    template(name="RSYSLOG_TraditionalFileFormat" type="string" string="<%PRI%>%TIMESTAMP% %HOSTNAME% %APP-NAME%[%PID%]: %msg%\n")
    
    # 根据标签转发日志
    if $syslogtag == "myapp-log:" then {
        action(type="omfwd"
               Target="192.168.2.194"
               Port="514"
               Protocol="udp"
               Template="RSYSLOG_TraditionalFileFormat")
        stop
    }
    

    如有更多日志文件需要监控,可以复制上述配置并修改 FileTag 字段,例如:

    input(type="imfile"
          File="/opt/cbsvs/logs/cosign/another_log.log"
          Tag="another-app:"
          ...
    )
    if $syslogtag == "another-app:" then {
        ...
    }
    

    如有进一步问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月7日