rsyslog无omstdout模块,合规方案是用omfile写入/dev/stdout或通过imjournal对接journald;需禁用Docker日志驱动、补全时间戳与容器元数据以满足等保/ISO27001审计要求。

omstdout 模块本身并不存在于标准 rsyslog 发行版中——rsyslog 官方不提供 omstdout 输出模块。这是一个常见误解,常源于对 omfile、omfwd 或 systemd-journald 集成机制的混淆。在容器化环境中实现“syslog → 标准输出”的合规平滑代理,真正可行且生产验证的方式是:通过 rsyslog 接收日志 → 重写为结构化格式 → 写入 /dev/stdout(用 omfile)或交由 journald 中转(用 omjournal),而非依赖不存在的 omstdout。
下面分三部分讲清怎么做、为什么这么选、关键避坑点:
容器内 rsyslog 不直接输出到 stdout,而是把 stdout 当作目标文件
rsyslog 的 omfile 模块支持将日志写入任意路径,包括 /dev/stdout 和 /dev/stderr。只要容器运行时能识别该路径(绝大多数 Docker/Podman 环境都支持),即可实现“伪 stdout 输出”。
配置示例(/etc/rsyslog.d/20-stdout.conf):
# 加载必要模块
module(load="imuxsock") # 接收本地进程日志(如 nginx 写入 /dev/stdout 时,实际走的是 journald → imuxsock)
module(load="omfile")
# 定义模板:兼容 Docker 日志解析(JSON-like,含 timestamp、hostname、programname)
template(name="DockerStdoutFormat" type="string" string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg%\n")
# 将所有非内核、非rsyslog自身日志,按模板写入 stdout
if $syslogfacility-text != 'kern' and $syslogtag != 'rsyslogd:' then {
action(type="omfile" file="/dev/stdout" template="DockerStdoutFormat")
stop # 防止重复写入默认日志文件
}⚠️ 注意事项:
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- 必须确保容器以
--log-driver=none启动,否则 Docker 会拦截 stdout/stderr 并覆盖 rsyslog 行为 - 若使用 systemd 容器(如
podman run --systemd=true),需启用StandardOutput=journal,此时应改用omjournal模块 -
/dev/stdout在容器中是符号链接(通常指向/proc/self/fd/1),rsyslog 会以追加模式打开,行为稳定
更推荐方案:跳过 rsyslog 输出层,用 journald 做透明中继
多数容器平台(Docker、Podman、Kubernetes)默认将容器 stdout/stderr 推送至宿主机 journald。此时 rsyslog 只需作为 journald 的消费者,无需自己“写 stdout”。
启用方式(宿主机上):
# 加载 journald 输入模块
module(load="imjournal"
StateFile="/var/lib/rsyslog/journal.state"
PersistStateInterval="10000")
# 抽取特定服务(如 nginx 容器)的日志并打标
if $syslogtag startswith 'nginx' then {
set $.container = "web-front";
action(type="omfile" file="/var/log/containers/web-front.log" template="RSYSLOG_FileFormat")
}优势:
- 零额外进程(不用在容器里跑 rsyslog)
- 自动携带
CONTAINER_ID、CONTAINER_NAME、IMAGE_NAME等元数据(需imjournal支持) - 兼容
docker logs和journalctl -u docker查看链路
关键合规性要点:时间戳、结构、可追溯性不能丢
容器日志若只裸写 stdout,会丢失原始 syslog 时间精度和来源标识,违反等保/ISO27001 对日志完整性的要求。必须补全三项:
-
统一时间源:rsyslog 配置
TimeSource="journal"或TimeSource="system",禁用$RepeatedMsgReduction on(避免合并掩盖真实频次) -
强制字段注入:用
property()函数注入容器上下文template(name="StructuredJSON" type="list") { constant(value="{") property(name="timestamp" format="jsonf" dateFormat="rfc3339") constant(value=",\"host\":\"") property(name="hostname") constant(value="\"") constant(value=",\"service\":\"") property(name="syslogtag" field="tag" format="jsonf") constant(value="\"") constant(value=",\"container\":\"") property(name="$!CONTAINER_NAME" format="jsonf") constant(value="\"") constant(value=",\"msg\":") property(name="msg" format="jsonf") constant(value="}\n") } -
来源可溯:在
imjournal或imudp规则中,用$fromhost-ip或$!docker.container_id建立设备指纹索引
不复杂但容易忽略

















