rsyslog日志发不出去绝大多数是因为默认未启用udp/tcp模块或防火墙/selinux拦截;需先运行rsyslogd -n1确认imudp/imtcp是否加载,未加载则在配置文件开头添加module(load="imudp")和module(load="imtcp")并配置对应input规则。

rsyslog 配置远程转发时,为什么日志发不出去?
绝大多数情况是 rsyslog 默认没启用 UDP/TCP 网络模块,或防火墙/SELinux 拦截了连接。确认配置前先检查模块是否加载:
- 运行
rsyslogd -N1,若报错imudp或imtcpnot found,说明对应模块未加载 - 在
/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf开头添加:module(load="imudp")<br>input(type="imudp" port="514")<br>module(load="imtcp")<br>input(type="imtcp" port="514")
- UDP 转发不保证可靠,生产环境建议用 TCP(加
@@前缀),但需确保接收端也监听 TCP
如何把特定 facility 的日志单独发到远程服务器?
不能只靠全局 *.* @@remote:514,否则所有日志混在一起。要用规则匹配 + 模板 + 动作分离:
- 定义模板避免时间戳/主机名格式不一致:
template(name="RemoteFormat" type="string" string="%protocol-version% %timestamp:::date-rfc3339% %hostname% %app-name% %procid% %msg%\n")
- 按 facility 过滤并绑定模板:
if $syslogfacility-text == 'auth' then {<br> action(type="omfwd" target="192.168.10.20" port="514" protocol="tcp" template="RemoteFormat")<br>} -
$syslogfacility-text是字符串值(如auth、daemon),不是数字;用==比较,不要用=~正则除非必要
journalctl 日志能否直接远程转发?
不能直接转发,systemd-journald 不提供原生网络输出。必须通过 rsyslog 或 syslog-ng 接入:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 确保
/etc/rsyslog.conf中有$ModLoad imjournal(rsyslog v8+) - 重启
rsyslog后,journal 日志会自动注入 rsyslog 流程,再按前述规则转发 - 若发现 journal 日志缺失,检查
imjournal是否启用,以及/run/systemd/journal/dev-log权限是否为srw-rw---- systemd-journal - 注意:journal 的
_HOSTNAME和SYSLOG_IDENTIFIER字段会被映射为 rsyslog 的$hostname和$programname,可用于过滤
远程转发失败时,怎么快速定位是哪一环断了?
别只盯着 rsyslog 配置,分层验证更省时间:
- 本地测试:用
logger -p auth.info "test msg"发一条日志,然后tail -f /var/log/syslog看是否生成 → 排除应用层问题 - 本地收发测试:在本机启动临时接收端
nc -u -l -p 514(UDP)或nc -l -p 514(TCP),再发日志看能否收到 → 判断 rsyslog 输出是否生效 - 网络连通性:用
telnet 192.168.10.20 514(TCP)或nc -u 192.168.10.20 514(UDP)测端口 → 确认防火墙和路由 - 接收端检查:远程服务器上运行
ss -tuln | grep :514,确认监听的是0.0.0.0:514而非127.0.0.1:514
最容易被忽略的是接收端的 bind 地址和 SELinux 的 syslogd_port_t 上下文——哪怕端口开着,SELinux 也可能静默丢包。










