Docker从json-file到syslog的集中化管理实战指南
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 实战概述</a></li><li><a href="#_label1">2. 实战步骤</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">2.1 使用默认日志驱动 - json-file</a></li><ul class="third_class_ul"><li><a href="#_label3_1_0_0">2.1.1 查看日志驱动</a></li><li><a href="#_label3_1_0_1">2.1.2 启动测试容器</a></li><li><a href="#_label3_1_0_2">2.1.3 查看日志信息</a></li><li><a href="#_label3_1_0_3">2.1.4 查看日志文件路径</a></li><li><a href="#_label3_1_0_4">2.1.5 查看日志文件内容</a></li></ul><li><a href="#_lab2_1_1">2.2 使用非默认日志驱动 - syslog</a></li><ul class="third_class_ul"><li><a href="#_label3_1_1_5">2.2.1 确保rsyslog启用imuxsock</a></li><li><a href="#_label3_1_1_6">2.2.2 启动测试容器</a></li><li><a href="#_label3_1_1_7">2.2.3 查看日志信息</a></li><li><a href="#_label3_1_1_8">2.2.4 查看日志文件路径</a></li></ul><li><a href="#_lab2_1_2">2.3 修改默认日志驱动</a></li><ul class="third_class_ul"><li><a href="#_label3_1_2_9">2.3.1 设置默认日志驱动</a></li><li><a href="#_label3_1_2_10">2.3.2 重载并重启Docker</a></li><li><a href="#_label3_1_2_11">2.3.3 启动测试容器</a></li><li><a href="#_label3_1_2_12">2.3.4 检查容器采用的日志驱动</a></li><li><a href="#_label3_1_2_13">2.3.5 查看日志文件内容</a></li></ul></ul><li><a href="#_label2">3. 实战总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 实战概述</h2><ul><li>本次实战通过对比 <code>json-file</code> 与 <code>syslog</code> 两种日志驱动,演示了 Docker 容器日志的本地存储与系统日志集成方式,并成功将默认日志驱动全局配置为 <code>syslog</code>,实现日志集中化管理。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>2. 实战步骤</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>2.1 使用默认日志驱动 - json-file</h3>
<p class="maodian"><a name="_label3_1_0_0"></a></p><h4>2.1.1 查看日志驱动</h4>
<p>执行命令:<code>docker info | grep -i logging</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173051.png" /></p>
<p><strong>结果说明</strong>:当前 Docker 日志驱动为 <code>json-file</code>,表示容器日志以 JSON 格式写入本地文件(如 <code>/var/lib/docker/containers/<id>/<id>-json.log</code>),可通过 <code>docker logs</code> 查看。未启用 syslog 或其他远程日志驱动。</p>
<p class="maodian"><a name="_label3_1_0_1"></a></p><h4>2.1.2 启动测试容器</h4>
<p>执行命令</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d \
--name testlog1 \
--log-opt tag="testlog1" \
busybox \
sh -c 'i=1; while true; do echo "Message $((i++)) from testlog1"; sleep 1; done'</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173115.png" /></p>
<p><strong>结果说明</strong>:已成功启动名为 <code>testlog1</code> 的容器,使用默认日志驱动(json-file),并设置日志标签为 <code>testlog1</code>。容器内执行循环脚本,持续输出消息至 stdout,日志将被 Docker 捕获并存储在本地文件中。</p>
<p class="maodian"><a name="_label3_1_0_2"></a></p><h4>2.1.3 查看日志信息</h4>
<p>查看前3条日志</p>
<p>执行命令:<code>docker logs testlog1 | head -3</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173059.png" /></p>
<p><strong>结果说明</strong>:通过 <code>docker logs testlog1 | head -3</code> 成功获取容器 <code>testlog1</code> 的前 3 条日志,显示初始输出内容为 “Message 1 from testlog1” 至 “Message 3 from testlog1”,验证了日志可正常读取并按需截取。</p>
<p>查看指定时间范围内的日志</p>
<p>执行命令:<code>docker logs -f --since="2025-12-29T10:23:19" --until="2025-12-29T10:23:25" testlog1</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173194.png" /></p>
<p><strong>结果说明</strong>:成功获取容器 <code>testlog1</code> 在指定时间范围(2025-12-29T10:23:19 至 10:23:25)内的日志,共输出 6 条消息,显示日志按时间筛选功能正常,且容器持续运行并产生日志。</p>
<p>查看最后3条日志</p>
<p>执行命令:<code>docker logs --tail 3 testlog1</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173088.png" /></p>
<p><strong>结果说明</strong>:成功使用 <code>docker logs --tail 3 testlog1</code> 获取容器 <code>testlog1</code> 的最后 3 条日志,输出显示为 Message 980 至 982,验证了日志尾部内容可正常查看,符合预期。</p>
<p class="maodian"><a name="_label3_1_0_3"></a></p><h4>2.1.4 查看日志文件路径</h4>
<p>执行命令:<code>docker inspect testlog1 | grep -i LogPath</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173132.png" /></p>
<p><strong>结果说明</strong>:容器 <code>testlog1</code> 的日志路径为 <code>/var/lib/docker/containers/.../json.log</code>,表明使用默认 <code>json-file</code> 日志驱动,日志以 JSON 格式存储在本地文件中,可通过 <code>docker logs</code> 查看。</p>
<p class="maodian"><a name="_label3_1_0_4"></a></p><h4>2.1.5 查看日志文件内容</h4>
<p>执行命令:<code>cat /var/lib/docker/containers/4e83e4fa3eb483c79b5fbeebb8818be3365bd09281b485d65c3537a7bf045d55/4e83e4fa3eb483c79b5fbeebb8818be3365bd09281b485d65c3537a7bf045d55-json.log | head -3</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173146.png" /></p>
<p><strong>结果说明</strong>:查看了容器 <code>testlog1</code> 的日志文件,内容为 JSON 格式,包含每条日志的输出内容、时间戳和标签(tag),验证了默认 <code>json-file</code> 日志驱动将 stdout/stderr 写入本地文件,且数据结构完整。</p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.2 使用非默认日志驱动 - syslog</h3>
<p class="maodian"><a name="_label3_1_1_5"></a></p><h4>2.2.1 确保rsyslog启用imuxsock</h4>
<p>执行命令:<code>sed -i 's/^#\(.*imuxsock.*\)/\1/' /etc/rsyslog.conf</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173089.png" /></p>
<p><strong>结果说明</strong>:执行 <code>sed -i 's/^#\(.*imuxsock.*\)/\1/' /etc/rsyslog.conf</code> 命令,成功将 <code>/etc/rsyslog.conf</code> 中以 <code>#</code> 开头的 <code>imuxsock</code> 模块行取消注释,使其启用,以便接收 Docker 通过 Unix socket 发送的日志。</p>
<p>执行命令:<code>systemctl restart rsyslog</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173155.png" /></p>
<p><strong>结果说明</strong>:执行 <code>systemctl restart rsyslog</code> 成功重启 rsyslog 服务,使配置文件中的修改(如启用 imuxsock 模块)生效,确保 Docker 日志可通过 syslog 驱动正常发送并记录。</p>
<p class="maodian"><a name="_label3_1_1_6"></a></p><h4>2.2.2 启动测试容器</h4>
<p>执行命令</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d \
--name testlog2 \
--log-driver=syslog \
--log-opt tag="testlog2" \
busybox \
sh -c 'i=1; while true; do echo "Message $((i++)) from testlog2"; sleep 1; done'</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173279.png" /></p>
<ul><li><strong>结果说明</strong>:成功启动名为 <code>testlog2</code> 的容器,使用 <code>syslog</code> 日志驱动,并设置标签为 <code>testlog2</code>,容器内执行循环脚本持续输出日志,日志将通过 syslog 发送到系统日志服务(如 rsyslog),不再写入本地文件。</li></ul>
<p class="maodian"><a name="_label3_1_1_7"></a></p><h4>2.2.3 查看日志信息</h4>
<p>查看前3条日志</p>
<p>执行命令:<code>docker logs testlog2 | head -3</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173295.png" /></p>
<p><strong>结果说明</strong>:通过 <code>docker logs testlog2 | head -3</code> 成功获取容器 <code>testlog1</code> 的前 3 条日志,显示初始输出内容为 “Message 1 from testlog2” 至 “Message 3 from testlog2”,验证了日志可正常读取并按需截取。</p>
<p>查看指定时间范围内的日志</p>
<p>执行命令:<code>docker logs -f --since="2025-12-29T10:56:19" --until="2025-12-29T10:56:25" testlog2</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173256.png" /></p>
<p><strong>结果说明</strong>:成功获取容器 <code>testlog2</code> 在指定时间范围(2025-12-29T10:56:19 至 10:56:25)内的日志,共输出 6 条消息,显示日志按时间筛选功能正常,且容器持续运行并产生日志。</p>
<p>查看最后3条日志</p>
<p>执行命令:<code>docker logs --tail 3 testlog2</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173261.png" /></p>
<p><strong>结果说明</strong>:成功使用 <code>docker logs --tail 3 testlog1</code> 获取容器 <code>testlog1</code> 的最后 3 条日志,输出显示为 Message 253 至 255,验证了日志尾部内容可正常查看,符合预期。</p>
<p class="maodian"><a name="_label3_1_1_8"></a></p><h4>2.2.4 查看日志文件路径</h4>
<p>执行命令:<code>docker inspect testlog2 | grep -i LogPath</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173263.png" /></p>
<p><strong>结果说明</strong>:容器 <code>testlog2</code> 的 <code>LogPath</code> 为空,表明其使用了非默认日志驱动(如 syslog),日志不写入本地文件,而是通过 syslog 驱动发送至系统日志服务,符合预期配置。</p>
<p>执行命令:<code>grep testlog2 /var/log/messages</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173385.jpg" /></p>
<p><strong>结果说明</strong>:通过 <code>grep testlog2 /var/log/messages</code> 成功查到容器 <code>testlog2</code> 的日志输出,显示其日志已通过 syslog 驱动正确发送至系统日志文件,每条日志包含标签、进程号和消息内容,验证了 syslog 日志驱动配置生效。</p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>2.3 修改默认日志驱动</h3>
<p class="maodian"><a name="_label3_1_2_9"></a></p><h4>2.3.1 设置默认日志驱动</h4>
<p>执行命令:<code>vim /etc/docker/daemon.json</code>,编辑Docker守护进程配置文件</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173331.png" /></p>
<p><strong>结果说明</strong>:配置文件中设置默认日志驱动为 <code>syslog</code>,并指定设施为 <code>local0</code>,标签格式为容器名与ID组合,实现容器日志统一通过 syslog 输出,便于集中管理和监控。</p>
<p class="maodian"><a name="_label3_1_2_10"></a></p><h4>2.3.2 重载并重启Docker</h4>
<p>执行命令:<code>systemctl daemon-reload</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173331.png" /></p>
<p>执行命令:<code>systemctl restart docker</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173384.png" /></p>
<p class="maodian"><a name="_label3_1_2_11"></a></p><h4>2.3.3 启动测试容器</h4>
<p>执行命令</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d \
--name testlog3 \
--log-opt tag="testlog3" \
busybox \
sh -c 'i=1; while true; do echo "Message $((i++)) from testlog3"; sleep 1; done'
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173333.png" /></p>
<p><strong>结果说明</strong>:成功启动名为 <code>testlog3</code> 的容器,使用默认日志驱动(syslog),并设置标签为 <code>testlog3</code>,容器内执行循环脚本持续输出日志,日志通过 syslog 驱动发送至系统日志服务,验证了默认配置生效。</p>
<p class="maodian"><a name="_label3_1_2_12"></a></p><h4>2.3.4 检查容器采用的日志驱动</h4>
<p>执行命令:<code>docker inspect testlog3 --format='容器采用的日志驱动:{{.HostConfig.LogConfig.Type}}'</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173360.png" /></p>
<p><strong>结果说明</strong>:容器 <code>testlog3</code> 采用的日志驱动为 <code>syslog</code>,表明其日志已通过 syslog 驱动输出至系统日志服务,验证了 Docker 默认日志驱动配置成功生效。</p>
<p class="maodian"><a name="_label3_1_2_13"></a></p><h4>2.3.5 查看日志文件内容</h4>
<p>执行命令:<code>grep testlog3 /var/log/messages</code>,查看日志文件<code>/var/log/messages</code>里包含<code>testlog3</code>的条目</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025123011173370.jpg" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>3. 实战总结</h2>
<ul><li>本次实战系统验证了 Docker 日志驱动的两种典型使用场景:默认的 <code>json-file</code> 驱动将日志以 JSON 格式保存在本地文件中,支持 <code>docker logs</code> 查看;而 <code>syslog</code> 驱动则将日志转发至系统日志服务(如 rsyslog),适用于集中日志管理。通过启用 rsyslog 的 <code>imuxsock</code> 模块,确保容器日志能正确写入 <code>/var/log/messages</code>。最终,通过配置 <code>/etc/docker/daemon.json</code> 将默认日志驱动设为 <code>syslog</code>,并验证新容器自动继承该配置。整个过程完整展示了从单容器日志定制到全局策略部署的运维实践,为生产环境日志规范化奠定了基础。</li></ul>
<p>到此这篇关于Docker实战:从json-file到syslog的集中化管理的文章就介绍到这了,更多相关docker json-file到syslog管理内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁:
[1]