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源设置一致 # 其他全局配置... };
验证步骤
- 修改配置后执行
sudo systemctl restart syslog-ng重启服务 - 发送WebRTC长日志测试
- 检查文件目的地
/var/log/skatr-one/.../${FILENAME}.log中的LOG_CONTENT:- 若文件中日志完整,问题出在Python目的地或InfluxDB写入阶段
- 若文件中日志已截断,问题出在syslog-ng的接收或解析阶段
内容的提问来源于stack exchange,提问作者Toon Peters
相关产品推荐
相关产品推荐

