
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Docker Journald Plus是一个Docker托管的日志驱动插件(v2版本),通过docker plugin install安装,提供多行日志合并、优先级解析、JSON日志结构化处理等增强功能,同时保留内置journald驱动的容器元数据字段,且占用空间极小(压缩后仅1.7MB)。可在Docker Hub获取:https://hub.docker.com/r/baraverkstad/journald-plus%EF%BC%8C%E6%9B%B4%E5%A4%9A%E4%BF%A1%E6%81%AF%E8%A7%81GitHub%E4%BB%93%E5%BA%93%EF%BC%9Ahttps://github.com/baraverkstad/docker-journald-plus%E3%80%82
<N>前缀或自定义正则模式从日志内容中推断优先级| 功能 | 内置journald驱动 | journald-plus |
|---|---|---|
| 元数据字段 | 是 | 是 |
| 默认标签 | {{.ID}} | {{.Name}} |
| 多行日志合并 | 否 | 是 |
| 优先级检测 | 否 | 是 |
| JSON日志解析 | 否 | 是 |
docker logs支持 | 是(通过journald) | 是(通过本地缓存)1 |
1:Docker会为不支持日志读取API的插件自动启用有限的https://docs.docker.com/engine/logging/dual-logging/%E5%8A%9F%E8%83%BD%E3%80%82%E4%B8%BA%E5%AE%9E%E7%8E%B0%E8%BD%BB%E9%87%8F%E5%8D%A0%E7%94%A8%EF%BC%8Cjournald-plus%E7%9C%81%E7%95%A5%E4%BA%86%E8%AF%A5%E5%8A%9F%E8%83%BD%EF%BC%8C%E5%BB%BA%E8%AE%AE%E4%BD%BF%E7%94%A8%60journalctl%60%E6%9F%A5%E7%9C%8B%E5%A4%84%E7%90%86%E5%90%8E%E7%9A%84%E6%97%A5%E5%BF%97%E8%BE%93%E5%87%BA%E3%80%82
每个日志条目会写入journald并包含以下字段:
| 字段 | 描述 |
|---|---|
MESSAGE | 合并及前缀剥离后的日志消息 |
PRIORITY | 数字型syslog优先级(0-7) |
SYSLOG_IDENTIFIER | 标签值 |
SYSLOG_TIMESTAMP | Docker提供的RFC 3339格式时间戳 |
CONTAINER_ID | 短容器ID(12字符) |
CONTAINER_ID_FULL | 完整容器ID |
CONTAINER_NAME | 容器名称 |
CONTAINER_TAG | 格式化标签 |
IMAGE_NAME | 容器镜像名称 |
此外还包含以下来源的字段:
labels/labels-regex:继承自内置驱动的标签选项env/env-regex:继承自内置驱动的环境变量选项field-*:字段提取功能生成的自定义字段json-parse:JSON日志解析生成的字段bashdocker run --name myapp \ --log-driver baraverkstad/journald-plus:[VERSION] \ --log-opt json-parse=true \ myimage
yamlservices: app: image: myapp:latest logging: driver: baraverkstad/journald-plus:[VERSION] options: json-parse: "true"
json{ "log-driver": "baraverkstad/journald-plus:[VERSION]", "log-opts": { "json-parse": "true" } }
👉 查看配置部分获取所有可用选项。
docker logs从本地缓存读取原始输出(无合并或解析)。如需查看完整处理后的条目,请使用journalctl:
bashjournalctl -t myapp -f # 实时跟踪(类似tail -f) journalctl -t myapp -p warning # 查看警告及以上级别日志 journalctl -t myapp --since -1h # 查看最近1小时日志 journalctl CONTAINER_ID=abc123def456 # 按容器ID过滤 journalctl REQUEST_ID=abc123 # 按JSON或field-*生成的自定义字段过滤
JSON日志解析
使用默认键解析JSON日志:
bashdocker run --log-driver baraverkstad/journald-plus:[VERSION] \ --log-opt json-parse=true \ myapp
应用输出JSON日志:
json{ "level": "error", "message": "database connection failed", "request_id": "abc123", "retry_count": 3 }
解析结果:
MESSAGE=database connection failedPRIORITY=3(错误级别)JSON_REQUEST_ID=abc123JSON_RETRY_COUNT=3自定义非标准格式的键名(如OpenTelemetry):
bash--log-opt json-level-keys='severity,lvl' \ --log-opt json-message-keys='body,text'
跳过高基数字段并将剩余字段内联到消息中:
bash--log-opt json-skip-keys='ts,time,@timestamp' \ --log-opt json-extra=inline
字段提取
通过正则捕获组从日志消息中提取journal字段:
bashdocker run --log-driver baraverkstad/journald-plus:[VERSION] \ --log-opt field-REQUEST_ID='request_id=([a-z0-9]+)' \ --log-opt field-USER_ID='user=(\d+)' \ --log-opt field-TRACE_ID='trace[:\s]+([a-f0-9]{32})' \ myapp
Docker Compose中按服务配置:
yamlservices: api: image: myapi:latest logging: driver: baraverkstad/journald-plus:[VERSION] options: field-REQUEST_ID: "request_id=([a-z0-9]+)" field-USER_ID: 'user=(\d+)' worker: image: myworker:latest logging: driver: baraverkstad/journald-plus:[VERSION] options: field-JOB_ID: "job=([0-9]+)"
Daemon.json配置(需转义反斜杠):
json{ "log-driver": "baraverkstad/journald-plus:[VERSION]", "log-opts": { "field-REQUEST_ID": "request_id=([a-z0-9]+)", "field-USER_ID": "user=(\\d+)" } }
bashARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/') docker plugin install --alias baraverkstad/journald-plus:[VERSION] \ baraverkstad/journald-plus:[VERSION]-$ARCH
别名baraverkstad/journald-plus:[VERSION]用于在daemon.json、compose.yml或--log-driver中引用。请勿直接使用架构特定的标签,仅别名可跨机器移植。
👉 无
latest标签发布。如需最新构建且不固定版本,可使用latest-amd64或latest-arm64,但请注意这会增加升级难度。
正在运行的容器使用的插件无法直接禁用或升级。版本化别名模式允许两个版本共存以实现零停机迁移:
bashARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/') docker plugin install --alias baraverkstad/journald-plus:[NEW-VERSION] \ baraverkstad/journald-plus:[NEW-VERSION]-$ARCH
daemon.json或compose.yml以引用新别名。daemon.json,重启dockerd以应用新默认驱动。bashdocker plugin disable baraverkstad/journald-plus:[OLD-VERSION] docker plugin rm baraverkstad/journald-plus:[OLD-VERSION]
| 选项 | 默认值 | 所属章节 |
|---|---|---|
tag | {{.Name}} | 继承选项 |
labels | (无) | 继承选项 |
labels-regex | (无) | 继承选项 |
env | (无) | 继承选项 |
env-regex | (无) | 继承选项 |
field-FIELDNAME | (无) | 字段提取 |
multiline-regex | ^\s | 多行日志 |
multiline-timeout | 10ms | 多行日志 |
multiline-max-lines | 100 | 多行日志 |
multiline-max-bytes | 1048576 | 多行日志 |
multiline-separator | \n | 多行日志 |
priority-prefix | true | 优先级 |
priority-default-stdout | info | 优先级 |
priority-default-stderr | err | 优先级 |
priority-match-emerg | (无) | 优先级 |
priority-match-alert | (无) | 优先级 |
priority-match-crit | (正则) | 优先级 |
priority-match-err | (正则) | 优先级 |
priority-match-warning | (正则) | 优先级 |
priority-match-notice | (无) | 优先级 |
priority-match-info | (无) | 优先级 |
priority-match-debug | (正则) | 优先级 |
strip-timestamp | false | 时间戳剥离 |
strip-timestamp-regex | (正则) | 时间戳剥离 |
strip-priority | false | 优先级剥离 |
strip-priority-regex | (正则) | 优先级剥离 |
normalize-whitespace | false | 空白符规范化 |
json-parse | false | JSON日志解析 |
json-level-keys | level,severity,log_level | JSON日志解析 |
json-message-keys | message,msg,log | JSON日志解析 |
json-skip-keys | (无) | JSON日志解析 |
json-extra | fields | JSON日志解析 |
| 选项 | 默认值 | 描述 |
|---|---|---|
tag | {{.Name}} | SYSLOG_IDENTIFIER的模板,支持Go模板语法 |
labels | (无) | 需包含为journal字段的容器标签键 |
labels-regex | (无) | 需包含为journal字段的容器标签键(正则匹配) |
env | (无) | 需包含为journal字段的容器环境变量键 |
env-regex | (无) | 需包含为journal字段的容器环境变量键(正则匹配) |
标签模板变量:
| 变量 | 描述 | 示例 |
|---|---|---|
{{.Name}} | 容器名称 | mycontainer |
{{.ID}} | 短容器ID(12字符) | abcdef123456 |
{{.FullID}} | 完整容器ID | abcdef123456... |
{{.ImageName}} | 镜像名称 | nginx:latest |
{{.ImageID}} | 短镜像ID(12字符) | deadbeef1234 |
{{.ImageFullID}} | 完整镜像ID | sha256:deadbeef... |
{{.Command}} | 入口点+参数 | nginx -g daemon off |
{{.DaemonName}} | Docker守护进程名称 | docker |
示例:--log-opt tag="{{.ImageName}}/{{.Name}}"
👉 内置journald驱动默认标签为
{{.ID}}(短容器ID),本插件默认使用{{.Name}}(容器名称),更便于journalctl -t查询。
字段名称 sanitization:
标签和环境变量名称会转换为journald兼容格式:小写转大写,非字母数字字符转为_,以数字开头的名称前缀加_。例如,标签com.example.my-app会转为COM_EXAMPLE_MY_APP。
| 选项 | 描述 |
|---|---|
field-FIELDNAME | 通过正则捕获组提取journal字段1 |
1:选项名称为字段名(如field-REQUEST_ID),值为包含一个捕获组(...)的正则表达式。可使用多个field-*选项。
👉 查看高级示例了解用法。
| 选项 | 默认值 | 描述 |
|---|---|---|
multiline-regex | ^\s | 匹配续行的正则表达式1 |
multiline-timeout | 10ms | 刷新前的最大等待时间(Go duration格式)2 |
multiline-max-lines | 100 | 合并为单个条目的最大行数 |
multiline-max-bytes | 1048576 | 合并条目的最大字节数(1MB) |
multiline-separator | \n | 合并行之间插入的分隔符 |
1:匹配该模式的行将追加到前一条消息。设为空字符串可禁用多行合并。
2:支持Go duration格式:10ms、100ms、1s。
默认^\s模式匹配以空白开头的行,可处理Java堆栈跟踪(at com.example.Foo续行缩进)和Python回溯(帧行以空格开头)。
| 选项 | 默认值 | 描述 |
|---|---|---|
priority-prefix | true | 启用sd-daemon <N>前缀(0-7)1 |
priority-default-stdout | info | stdout的默认优先级 |
priority-default-stderr | err | stderr的默认优先级 |
priority-match-emerg | (无) | 匹配首行→EMERG(0) |
priority-match-alert | (无) | 匹配首行→ALERT(1) |
priority-match-crit | (正则)2 | 匹配首行→CRIT(2) |
priority-match-err | (正则)2 | 匹配首行→ERR(3) |
priority-match-warning | (正则)2 | 匹配首行→WARNING(4) |
priority-match-notice | (无) | 匹配首行→NOTICE(5) |
priority-match-info | (无) | 匹配首行→INFO(6) |
priority-match-debug | (正则)2 | 匹配首行→DEBUG(7) |
1:<N>前缀会在写入journal前从MESSAGE中剥离,详见https://www.freedesktop.org/software/systemd/man/latest/sd-daemon.html%E3%80%82%5C
2:默认正则模式(允许关键字前最多30字符前缀):
priority-match-crit: ^.{0,30}(CRITICAL|\[Critical\])priority-match-err: ^.{0,30}(ERROR|FATAL|\[ERROR\]|\[Fatal\])priority-match-warning: ^.{0,30}(WARN|WARNING|\[Warning\])priority-match-debug: ^.{0,30}(DEBUG|\[Debug\])优先级解析顺序(优先匹配靠前的规则):
<N>前缀(若priority-prefix=true)priority-match-*正则模式(从emerg到debug检查)priority-default-stdout或priority-default-stderrpriority-default-stdout和priority-default-stderr支持以下值:emerg、alert、crit、err、warning、notice、info、debug。
| 选项 | 默认值 | 描述 |
|---|---|---|
strip-timestamp | false | 剥离开头的时间戳1 |
strip-timestamp-regex | (正则) | 覆盖内置正则2 |
1:journald会记录自身时间戳,应用级时间戳通常冗余。
2:仅当strip-timestamp=true时生效。
启用后,时间戳会在优先级检测前剥离。默认优先级模式允许最多30字符前缀,可处理时间戳剥离后剩余的其他前缀。例如,MariaDB日志2026-02-15 15:15:16 0 [Warning] InnoDB:...剥离后变为0 [Warning] InnoDB:...,仍可匹配[Warning]模式。
内置模式支持以下格式:
| 格式 | 示例 |
|---|---|
| ISO 8601 | 2024-01-15T10:30:45Z、2024-01-15 10:30:45 UTC |
| Go日志格式 | 2024/01/15 10:30:45 |
| Syslog格式 | Jan 15 10:30:45 |
| Apache/nginx CLF | 15/Oct/2024:10:30:45 +0200 |
| Log4j DATE格式 | 14 Nov 2017 20:30:20,434 |
| Apache错误格式 | Wed Oct 15 19:41:46.123456 2019 |
时间戳后的分隔符(空白、-、|、:)也会被剥离。时区缩写仅限Z/UTC/GMT,避免误匹配ERROR或WARN等日志级别词。
| 选项 | 默认值 | 描述 |
|---|---|---|
strip-priority | false | 剥离开头的日志级别1 |
strip-priority-regex | (正则) | 覆盖内置正则2 |
1:日志级别同时存在于PRIORITY字段和MESSAGE中通常冗余。
2:仅当strip-priority=true时生效。
启用后,开头的日志级别关键词会在优先级检测后剥离。默认正则匹配消息开头的常见级别关键词(可选带括号):
(?i)^\[?(trace|debug|info|notice|note|warning|warn|critical|error|fatal|alert|emerg)\]?
匹配后的分隔符(空白、-、|、:)也会被剥离。由于正则锚定到^,仅多行合并消息的首行受影响,续行不会被修改。
| 输入 | 剥离后结果 |
|---|---|
INFO request completed | request completed |
[Error] connection refused | connection refused |
WARN: disk space low | disk space low |
| 选项 | 默认值 | 描述 |
|---|---|---|
normalize-whitespace | false | 规范化制表符和连续空格1 |
1:将一个或多个制表符(或两个及以上连续空格)替换为单个空格。在处理流程最后一步应用(时间戳剥离和优先级检测/剥离之后)。
| 输入 | 规范化后结果 |
|---|---|
INFO\t\tStarting server | INFO Starting server |
ERROR connection refused | ERROR connection refused |
[WARN]\t disk space low | [WARN] disk space low |
| 选项 | 默认值 | 描述 |
|---|---|---|
json-parse | false | 将日志行解析为JSON对象 |
json-level-keys | level,severity,log_level | 日志级别对应的JSON键(优先匹配靠前的) |
json-message-keys | message,msg,log | 消息体对应的JSON键(优先匹配靠前的) |
json-skip-keys | (无) | 完全忽略的JSON键 |
json-extra | fields | 剩余字段的处理方式1 |
1:fields(默认):存储为JSON_*journal字段;inline:追加到MESSAGE中。
当json-parse=true时,驱动尝试解析每条日志行为JSON对象:
json-level-keys(按顺序)并映射为syslog优先级json-message-keys(按顺序)并作为MESSAGE值json-skip-keys中的键JSON_*journal字段(json-extra=fields)或追加到消息中(json-extra=inline);为空则忽略支持的级别映射:
| JSON级别 | Syslog优先级 |
|---|---|
debug, trace | DEBUG(7) |
info, information | INFO(6) |
notice | NOTICE(5) |
warn, warning | WARNING(4) |
error, err | ERR(3) |
fatal, critical, crit | CRIT(2) |
panic, alert | ALERT(1) |
emerg, emergency | EMERG(0) |
级别字符串不区分大小写。
👉 查看高级示例了解用法。
行为说明:
_)欢迎提出想法、bug报告和PR。查看DEVELOPMENT.md获取构建说明、测试及开发流程。
Docker Journald Plus基于MIT许可证开源。
版权所有 © 2026 Per Cederberg
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务