如何将systemd-journald属性捕获到rsyslog文件中?
问题原因及解决方向
以下是导致自定义journal属性丢失的常见原因及对应解决方法:
1. imjournal 默认仅提取基础字段
imjournal模块默认不会同步journald的所有字段,只导入预设的基础字段集合。自定义字段(如MEAS_VAL)不在默认列表中,需要显式配置要包含的字段。
解决方法:
- 在rsyslog配置文件中添加
$imjournalFields指令,指定需要同步的字段,例如:
或者使用更灵活的配置包含所有字段:module(load="imjournal") $imjournalFields _SYSTEMD_UNIT, _PID, MESSAGE, MEAS_VAL$imjournalFieldFilter *
2. rsyslog 输出模板未包含自定义字段
即使rsyslog已经捕获到MEAS_VAL,如果输出日志的模板没有引用该字段,最终日志文件也不会显示它。
解决方法:
- 检查并修改rsyslog的输出模板,确保包含自定义字段。例如,使用JSON格式输出的模板可以这样写:
然后将该模板应用到输出规则中:template(name="CustomJournalFormat" type="list") { constant(value="{") constant(value="\"timestamp\":\"") property(name="timereported" dateFormat="rfc3339") constant(value="\",\"message\":\"") property(name="msg") constant(value="\",\"meas_val\":\"") property(name="MEAS_VAL") constant(value="\"}\n") }action(type="omfile" file="/var/log/custom.log" template="CustomJournalFormat")
3. mmjsonparse 模块的解析过滤
如果配置了mmjsonparse,可能存在过滤规则或解析逻辑导致自定义字段被丢弃。需要确认mmjsonparse的配置是否保留了所有需要的字段。
解决方法:
- 检查mmjsonparse的配置,确保没有设置
exclude规则过滤MEAS_VAL,或者使用include规则明确包含该字段。例如:module(load="mmjsonparse") action(type="mmjsonparse" include="MEAS_VAL")
4. Docker容器内的systemd/journald 权限/通信限制
虽然journalctl能看到字段,但Docker容器内的rsyslog进程可能没有足够权限读取journald的完整字段,或者journald在容器内的运行模式限制了字段导出。
解决方法:
- 确保容器运行时挂载了journald的套接字路径,例如启动容器时添加参数:
docker run -v /run/systemd/journal/socket:/run/systemd/journal/socket ... - 确认容器内的rsyslog进程以足够权限运行(比如root用户),避免因权限不足无法读取完整journal数据。
内容的提问来源于stack exchange,提问作者woodz
相关产品推荐
相关产品推荐

