You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

syslog-ng Python输出转发WebRTC长日志被截断问题求助

WebRTC长日志经syslog-ng转发至InfluxDB时被截断的排查与解决

问题描述

通过syslog-ng收集远程设备日志,再用自定义Python输出将日志转发到InfluxDB。大部分日志处理正常,但WebRTC统计类的长日志会被中途截断,短日志无异常,且客户端侧的WebRTC日志是完整的。

相关配置文件片段

source s_skatrone { 
    network( 
        ip(0.0.0.0) 
        port(10823) 
        keep-hostname(yes) 
        flags(no-parse) 
    ); 
};

parser p_skatrone { 
    csv-parser(
        columns("HOSTNAME", "FILENAME", "LOG_CONTENT")
        delimiters(";")
        flags(strip-whitespace)
    ); 
};

parser p_hostname_mapping {
    add-contextual-data(
        selector("${HOSTNAME}")
        database("/etc/syslog-ng/ONE_hostname_mapping.csv")
        default-selector("unknown-host")
    );
};

filter f_unit_analytics {
    match ("unit_analytics" value("FILENAME"));
};

destination d_skatrone { 
    file(
        "/var/log/skatr-one/${HOSTNAME}/${YEAR}-${MONTH}-${DAY}/${FILENAME}.log"
        create_dirs(yes)
        dir-perm(0755)
        perm(0644)
        dir-owner(skatr)
        owner(skatr)
        group(skatr)
        template("${LOG_CONTENT}\n")
    ); 
};

destination d_influxdb_webrtc {
    python( 
        class("influxdb_webrtc_destination.WebRTCInfluxDBDestination")
        batch-lines(1000)
        options(
            "url" "`influxdb_url`"
            "token" "`influxdb_token`"
            "org" "`influxdb_org`"
            "bucket" "skatr-one-v2-webrtc"
        )
    );
};

log {
    source(s_skatrone);
    parser(p_skatrone);
    parser(p_hostname_mapping);
    filter(f_unit_analytics);
    destination(d_skatrone);
    destination(d_influxdb_webrtc);
    # flags(flow-control);
};

log {
    source(s_skatrone);
    parser(p_skatrone);
    parser(p_hostname_mapping);
    filter(f_tablet_states);
    destination(d_skatrone);
    destination(d_influxdb_tablet_states);
    # flags(flow-control);
};

版本信息

  • 主机:Ubuntu Server 23.04
  • syslog-ng:4.7.1
  • Python:3.10.12
  • InfluxDB shell:1.6.7~rc0

排查方向与解决方案

1. 调整syslog-ng网络源的最大消息长度

syslog-ng的network源默认有最大消息长度限制(通常为64KB),超过阈值的日志会被截断。需在源配置中显式设置更大的数值:

source s_skatrone { 
    network( 
        ip(0.0.0.0) 
        port(10823) 
        keep-hostname(yes) 
        flags(no-parse) 
        max-message-size(1048576) # 设置为1MB,可根据实际日志长度调整
    ); 
};

2. 解决CSV解析器的分隔符冲突

如果WebRTC日志的LOG_CONTENT字段包含分隔符;,csv-parser会错误分割字段,导致LOG_CONTENT提前截断。可通过两种方式解决:

  • 改用正则表达式解析:
    parser p_skatrone {
        regexp-parser(
            pattern("^([^;]+);([^;]+);(.*)$")
            columns("HOSTNAME", "FILENAME", "LOG_CONTENT")
            flags(strip-whitespace)
        );
    };
    
  • 转义分隔符:在客户端发送日志时将LOG_CONTENT中的;转义为\;,并修改解析器配置:
    parser p_skatrone { 
        csv-parser(
            columns("HOSTNAME", "FILENAME", "LOG_CONTENT")
            delimiters(";")
            escape-char("\\")
            flags(strip-whitespace)
        ); 
    };
    

3. 排查自定义Python目的地的代码限制

检查WebRTCInfluxDBDestination类的实现:

  • 是否对日志内容长度做了硬编码限制?
  • 批量处理(batch-lines(1000))时是否因内存/缓冲区不足导致截断?
  • 解析WebRTC统计数据(如JSON格式)时是否因格式错误提前终止?

可临时将batch-lines调整为1排除批量影响,同时在Python代码中添加日志打印,确认进入Python阶段前日志是否已被截断。

4. 设置全局最大消息长度

在syslog-ng全局配置中统一设置最大消息长度,确保所有组件遵循同一阈值:

options {
    max-message-size(1048576); # 与network源设置一致
    # 其他全局配置...
};

验证步骤

  1. 修改配置后执行sudo systemctl restart syslog-ng重启服务
  2. 发送WebRTC长日志测试
  3. 检查文件目的地/var/log/skatr-one/.../${FILENAME}.log中的LOG_CONTENT:
    • 若文件中日志完整,问题出在Python目的地或InfluxDB写入阶段
    • 若文件中日志已截断,问题出在syslog-ng的接收或解析阶段

内容的提问来源于stack exchange,提问作者Toon Peters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:53:18