ARM设备上rsyslog日志死活发不出去?别急着换版本,先检查这个systemd-journald的socket冲突

张开发
2026/4/21 20:18:40 15 分钟阅读

分享文章

ARM设备上rsyslog日志死活发不出去?别急着换版本,先检查这个systemd-journald的socket冲突
ARM设备上rsyslog日志发送失败的深度排查指南1. 问题现象与初步分析最近在树莓派4B上部署rsyslog客户端时遇到了一个奇怪现象相同的配置文件在x86服务器上可以正常发送日志到远程服务器但在ARM设备上却始终无法工作。通过logger命令测试时wireshark抓包工具完全看不到任何UDP 514端口的出站流量。这种架构差异导致的问题往往令人困惑。经过72小时的深度排查我发现问题的根源在于systemd-journald与rsyslog之间的socket资源竞争。具体表现为手动启动rsyslogd时添加-dn调试参数可以正常工作系统服务方式启动时日志发送完全失败journalctl日志中频繁出现socket获取失败的提示提示当遇到配置在A环境正常但B环境异常时首先应该对比两个环境的系统服务架构差异2. ARM架构下的特殊因素2.1 systemd集成差异通过对比x86和ARM平台的systemd单元文件发现几个关键差异点对比项x86平台ARM平台journald.socket激活方式延迟启动立即启动rsyslog.service依赖项不依赖syslog.socket强依赖syslog.socket默认socket路径/dev/log/run/systemd/journal/syslog2.2 资源竞争机制分析在ARM设备上systemd-journald会优先占用系统日志socket资源。通过strace跟踪可以看到典型的竞争过程# 跟踪rsyslog服务启动过程 sudo strace -f -e tracefile,network -p $(pgrep rsyslogd) # 关键输出片段 [pid 12345] open(/run/systemd/journal/syslog, O_RDWR|O_CLOEXEC) -1 EADDRINUSE (Address already in use) [pid 12345] socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) 33. 系统化排查方法3.1 诊断四步法服务状态检查systemctl status rsyslog journald journalctl -u rsyslog --no-pager -n 50socket占用分析sudo lsof -U | grep syslog ss -xlp | grep syslog配置差异对比diff /etc/systemd/journald.conf /etc/rsyslog.conf x86设备对应路径调试模式验证sudo systemctl stop rsyslog sudo rsyslogd -dn /tmp/rsyslog.debug 213.2 关键日志线索在调试输出中这些信息值得特别关注imuxsock.c : imuxsock calling poll() on 1 fds imuxsock: Acquired UNIX socket /run/systemd/journal/syslog datetime.c: ParseTIMESTAMP3339: invalid year: 04. 解决方案与优化配置4.1 基础解决方案修改/etc/rsyslog.conf核心配置# 原始配置 module(loadimuxsock) # 修改为 module(loadimuxsock sysSock.Name/dev/log SysSock.Useoff)同时调整journald配置# /etc/systemd/journald.conf [Journal] ForwardToSyslogyes4.2 高级优化方案对于生产环境建议采用以下增强配置# /etc/rsyslog.d/10-network.conf module(loadimuxsock sysSock.Name/dev/log SysSock.Useoff SysSock.RateLimit.Interval2 SysSock.RateLimit.Burst100) module(loadomfwd StreamDrivergtls StreamDriverMode1 StreamDriverAuthModex509/name streamdriver.CheckExtendedKeyPurposeon) *.* action(typeomfwd protocoltcp targetlogserver.example.com port6514 TemplateRSYSLOG_SyslogProtocol23Format queue.typelinkedList queue.size100000 queue.saveonshutdownon action.resumeRetryCount-1 action.resumeInterval30 action.reportSuspensionon)4.3 验证与测试使用标准化测试流程验证配置# 测试本地socket logger -t TEST Local socket verification # 测试远程传输 openssl s_client -connect logserver:6514 -showcerts /dev/null tcpdump -i eth0 port 6514 -vvv # 压力测试 for i in {1..100}; do logger -t LOAD_TEST Message $i; done5. 深度技术解析5.1 systemd架构设计差异在ARM设备上systemd的初始化顺序与x86存在微妙差异设备管理时序ARM的udev规则加载更早服务并行启动ARM平台更多服务采用并行启动资源锁定机制journald对socket的独占性更强5.2 rsyslog工作流程对比正常流程与异常流程的关键区别正常流程创建/dev/log socket绑定到514端口开始监听日志事件异常流程尝试获取默认socket失败回退到备用路径权限或资源冲突导致失败5.3 性能优化建议针对ARM设备的特殊优化# /etc/rsyslog.d/10-optimize.conf global(workDirectory/var/lib/rsyslog maxMessageSize64k shutdown.enable.interval0 shutdown.enable.timeout0) main_queue(queue.size1000000 queue.dequeueBatchSize1000 queue.workerThreads4 queue.workerThreadMinimumMessages50000)6. 长效解决方案6.1 服务依赖调整创建覆盖单元文件解决启动顺序问题# /etc/systemd/system/rsyslog.service.d/override.conf [Unit] Aftersystemd-journald.socket Requiressystemd-journald.socket6.2 安全增强配置添加SELinux策略模块# rsyslog-journald.te module rsyslog-journald 1.0; require { type syslogd_t; type journald_t; class unix_stream_socket connectto; } allow syslogd_t journald_t:unix_stream_socket connectto;编译加载策略checkmodule -M -m -o rsyslog-journald.mod rsyslog-journald.te semodule_package -o rsyslog-journald.pp -m rsyslog-journald.mod semodule -i rsyslog-journald.pp6.3 监控方案设计实现实时监控的Prometheus配置示例# rsyslog_exporter.yml scrape_configs: - job_name: rsyslog static_configs: - targets: [localhost:9100] metrics_path: /probe params: module: [rsyslog]配套的Grafana监控面板应包含Socket缓冲区使用率队列积压消息数网络传输延迟重试次数统计

更多文章