在 docker.service 文件中的 ExecStart 字段中,添加(或:docker run --log-driver=journald):

--log-driver=journald \

之后:

systemctl daemon-reload
systemctl restart docker.service

配置 journald.conf(此文件的各项正文必须单独占一行,否则不生效) :

[Journal]
#日志存储到磁盘
Storage=persistent
#压缩日志
Compress=yes
#为日志添加序列号
Seal=yes
#每个用户分别记录日志
SplitMode=uid
#日志同步到磁盘的间隔,高级别的日志,如:CRIT、ALERT、EMERG 三种总是实时同步
SyncIntervalSec=1m #即制日志的最大流量,此处指 30s 内最多记录 条日志,超出的将被丢弃
RateLimitInterval=30s
#与 RateLimitInterval 配合使用
RateLimitBurst= #限制全部日志文件加在一起最多可以占用多少空间,默认值是10%空间与4G空间两者中的较小者
SystemMaxUse=64G
#默认值是15%空间与4G空间两者中的较大者
SystemKeepFree=1G #单个日志文件的大小限制,超过此限制将触发滚动保存
SystemMaxFileSize=128M #日志滚动的最大时间间隔,若不设置则完全以大小限制为准
MaxFileSec=1day
#日志最大保留时间,超过时限的旧日志将被删除
MaxRetentionSec=100year #是否转发符合条件的日志记录到本机的其它日志管理系统,如:rsyslog
ForwardToSyslog=yes
ForwardToKMsg=no
#是否转发符合条件的日志到所有登陆用户的终端
ForwardToWall=yes
MaxLevelStore=debug
MaxLevelSyslog=err
MaxLevelWall=emerg
ForwardToConsole=no
#TTYPath=/dev/console
#MaxLevelConsole=info
#MaxLevelKMsg=notice

之后:

mkdir /var/log/journal
chown root:systemd-journal /var/log/journal
chmod /var/log/journal
systemctl reset-failed systemd-journald.service && systemctl restart systemd-journald.service

日志查看工具 journalctl 的用法:

journalctl
-u/--unit=docker.service \ #可以多次使用该选项,按 OR 逻辑筛选显示
-o/--output=export \ #指定显示格式,常用三种: export、json-pretty、cat
-r/--reverse \ #反向显示,即较新的日志显示在最上面
--no-pager \ #不要使用 less 或 more 分页显示
-f/--follow \ #类似 tail -f 效果
--flush \ #将内存中日志同步到磁盘
-D/--directory=DIR \ #指定读取日志的路径
--file=zLogFilePath \ #同上,指定具体文件路径,可同时使用多次指定多个文件
--priority= "emerg" (或 ), "alert" (), "crit" (), "err" (), "warning" (), "notice" (), "info" (), "debug" () \ #指定要显示的日志等级
--since= "2012-10-30 18:17:16" \
--until= "2017-10-30 18:17:16" \
--disk-usage \ #显示所有日志占用的磁盘空间
#export 格式显示的特定进程的标识字段均可以用作筛选,例如:
CONTAINER_ID= \ #以指定容器 ID 为标识显示日志
CONTAINER_NAME= \ #同上,指定容器名称
_PID= \ #以容器进程 ID 为标识显示日志
_UID= \ #显示以某个用户 ID 身份运行的所有容器日志

export 格式输出样例:

 __CURSOR=s=cc2bd54b07c04211996c7eb3a46b4ecc;i=11f8;b=9319f78348534d7c9231b3788881d1be;m=ea1d9a9ab;t=54f2a70366564;x=cb3b442de23e1b6d
__REALTIME_TIMESTAMP=
__MONOTONIC_TIMESTAMP=
_BOOT_ID=9319f78348534d7c9231b3788881d1be
PRIORITY=
_UID=
_GID=
_SYSTEMD_SLICE=system.slice
_MACHINE_ID=783e916069bb40508bd037b154bf7593
_TRANSPORT=journal
_CAP_EFFECTIVE=1fffffffff
_HOSTNAME=x
_COMM=dockerd-current
_EXE=/usr/bin/dockerd-current
_SYSTEMD_CGROUP=/system.slice/docker.service
_SYSTEMD_UNIT=docker.service
_CMDLINE=/usr/bin/dockerd-current --log-driver=journald --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --selinux-enabled --log-driver=journald --signature-verification=false
_SELINUX_CONTEXT=system_u:system_r:container_runtime_t:s0
CONTAINER_TAG=
_PID=
CONTAINER_ID=bc31bfa22688
CONTAINER_ID_FULL=bc31bfa22688736403a5e5e0377630382b4e0ac696b97254e779ce2b90a95b2d
CONTAINER_NAME=hopeful_poitras
MESSAGE
3root@bc31bfa22688:/# date
_SOURCE_REALTIME_TIMESTAMP= __CURSOR=s=cc2bd54b07c04211996c7eb3a46b4ecc;i=11f9;b=9319f78348534d7c9231b3788881d1be;m=ea1daab4f;t=54f2a70376708;x=e8ea5e3b827ffd6a
__REALTIME_TIMESTAMP=
__MONOTONIC_TIMESTAMP=
_BOOT_ID=9319f78348534d7c9231b3788881d1be
PRIORITY=
_UID=
_GID=
_SYSTEMD_SLICE=system.slice
_MACHINE_ID=783e916069bb40508bd037b154bf7593
_TRANSPORT=journal
_CAP_EFFECTIVE=1fffffffff
_HOSTNAME=x
_COMM=dockerd-current
_EXE=/usr/bin/dockerd-current
_SYSTEMD_CGROUP=/system.slice/docker.service
_SYSTEMD_UNIT=docker.service
_CMDLINE=/usr/bin/dockerd-current --log-driver=journald --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --selinux-enabled --log-driver=journald --signature-verification=false
_SELINUX_CONTEXT=system_u:system_r:container_runtime_t:s0
CONTAINER_TAG=
_PID=
CONTAINER_ID=bc31bfa22688
CONTAINER_ID_FULL=bc31bfa22688736403a5e5e0377630382b4e0ac696b97254e779ce2b90a95b2d
CONTAINER_NAME=hopeful_poitras
MESSAGE
Wed May :: UTC
_SOURCE_REALTIME_TIMESTAMP=

日志输出样例

每个容器对应日志中的多个唯一 ID,可以认为在宿主机上,能够 100% 标识每一个容器,如:

    • _BOOT_ID    #标识宿主机是哪次启动的
    • _MACHINE_ID    #宿主机机器标识
    • CONTAINER_ID
    • CONTAINER_ID_FULL
    • CONTAINER_NAME

外部查看指定容器日志常用命令:

journalctl -u docker.service CONTAINER_ID=bc31bfa22688 -D </Path/To/LogBakDir> -o cat

形如这种的形式的,都是已滚动保存的日志(二进制形式):

system@6c8acebb0081486ba83d698c06cd1d33--00054f2c2fe295f9.journal
system@6c8acebb0081486ba83d698c06cd1d33--00054f2c31c92008.journal
system@6c8acebb0081486ba83d698c06cd1d33-000000000000001d-00054f2c3311307d.journal

最后,将这些滚动日志定时复制或移动到指定位置即可。

自动布署脚本示例:

 #!/usr/bin/env sh

 zBakDir="/tmp"

 ###########################
##### docker.service ######
########################### zDockerPathA="/etc/systemd/system/docker.service"
zDockerPathB="/usr/lib/systemd/system/docker.service" if [[ -eq `ls $zDockerPathA >/dev/null | wc -l` ]];then
zPathToDockerService=$zDockerPathA
else
zPathToDockerService=$zDockerPathB
fi if [[ -lt `grep -c 'log-driver=' $zPathToDockerService` ]];then
perl -pi.bak -e 's/(?<=--log-driver=)\w+/journald/g' $zPathToDockerService
else
perl -pi.bak -e 's/(ExecStart=(\/\S+)+)/$1 --log-driver=journald /g' $zPathToDockerService
fi ##############################
## systemd-journald.service ##
############################## zJournaldConfPath="/etc/systemd/journald.conf"
zJournaldConf="[Journal]\nStorage=persistent\nCompress=yes\nSeal=yes\nSplitMode=uid\nSyncIntervalSec=30s\n\nRateLimitInterval=30s\nRateLimitBurst=100000\n\nSystemMaxUse=64G\nSystemKeepFree=1G\nSystemMaxFileSize=64M\nMaxFileSec=1day\nMaxRetentionSec=100year"
echo -e $zJournaldConf > $zJournaldConfPath mkdir -p /var/log/journal
chown -R root:systemd-journal /var/log/journal
chmod -R /var/log/journal ##############################
#### Back up docker log ####
############################## zPath="/etc/systemd/system"
mkdir -p ${zPath} zServName="zDockerLogBakUp"
zBakExec="#!/usr/bin/env sh\n\ncp -np /var/log/journal/*/*@*.journal $zBakDir"
zBakService="[Unit]\nDescription=''\nAfter=docker.service systemd-journald.service\n\n[Service]\nExecStart=${zPath}/${zServName}.sh\n\n[Install]\nWantedBy=multi-user.target"
zBakTimer="[Unit]\nDescription=''\n\n[Timer]\nOnCalendar=*-*-* 02:30:00\nUnit=zDockerLogBakUp.service\n\n[Install]\nWantedBy=multi-user.target" echo -e "$zBakExec" > "${zPath}/${zServName}.sh"
echo -e $zBakService > "${zPath}/${zServName}.service"
echo -e $zBakTimer > "${zPath}/${zServName}.timer" chmod u+x ${zPath}/${zServName}.sh ##############################
#### Start Services ####
############################## systemctl daemon-reload
systemctl reset-failed docker.service
systemctl restart docker.service systemctl reset-failed systemd-journald.service
systemctl restart systemd-journald.service systemctl enable ${zServName}.timer

...

拾遗:使用 systemd-journald 管理 Docker 容器日志的更多相关文章

  1. docker容器日志管理

    docker容器日志分为两类:docker引擎日志(Docker本身运行的日志)和容器日志(各个容器内产生的日志) 一.Docker引擎日志: Centos系统下的docker引擎日志一般给syste ...

  2. docker容器日志管理(清理)

    原文:docker容器日志管理(清理) 前言 在使用docker容器时候,其日志的管理是我们不得不考虑的事情.因为docker容器的日志文件会占据大量的磁盘空间.下面介绍的就是对docker容器日志的 ...

  3. docker容器日志收集方案汇总评价总结

    docker日志收集方案有太多,下面截图罗列docker官方给的日志收集方案(详细请转docker官方文档).很多方案都不适合我们下面的系列文章没有说. 经过以下5篇博客的叙述简单说下docker容器 ...

  4. docker 容器日志集中 ELK + filebeat

    docker 容器日志集中 ELK ELK 基于 ovr 网络下 docker-compose.yaml version: '2' networks: network-test: external: ...

  5. docker容器日志收集方案(方案二 filebeat+syslog本地日志收集)

    与方案一一样都是把日志输出到本地文件系统使用filebeat进行扫描采集 不同的是输出的位置是不一样的 我们对docker进行如下设置 sudo docker service update  --lo ...

  6. docker容器日志收集方案(方案一 filebeat+本地日志收集)

    filebeat不用多说就是扫描本地磁盘日志文件,读取文件内容然后远程传输. docker容器日志默认记录方式为 json-file 就是将日志以json格式记录在磁盘上 格式如下: { " ...

  7. Docker 容器日志格式化

    Docker容器的日志文件每一行都是一个json对象,其包含log.stream.time三个属性,下面的HTML从textarea中读取输入的日志信息,格式化为表格显示. <!DOCTYPE ...

  8. 实时查看docker容器日志

    实时查看docker容器日志 $ sudo docker logs -f -t --tail 行数 容器名 例:实时查看docker容器名为s12的最后10行日志 $ sudo docker logs ...

  9. docker容器日志清理

    1.先查看磁盘空间 df -h 2.找到容器的containerId-json.log文件,并清理(治标不治本,log迟早还会大的) 查看各个容器的log文件大小 find /var/lib/dock ...

随机推荐

  1. 81、Tensorflow实现LeNet-5模型,多层卷积层,识别mnist数据集

    ''' Created on 2017年4月22日 @author: weizhen ''' import os import tensorflow as tf import numpy as np ...

  2. c# DataTable select 过滤返回新DataTable

    Select(); Select("id>='3' and name='3--hello'");//支持and Select("id>='3' or id=' ...

  3. POJ 2254 Globetrotter (计算几何 - 球面最短距离)

    题目链接:POJ 2254 Description As a member of an ACM programming team you'll soon find yourself always tr ...

  4. Apache和Tomcat的区别是什么?

    Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. Apache是web服 ...

  5. innobackupex2.4选项参考

    该innobackupex2.4选项参考¶ 此页面记录了innobackupex的所有命令行选项. 选项 --apply-log BACKUP-DIR通过应用xtrabackup_logfile位于同 ...

  6. Invoke-Obfuscation混淆ps文件绕过Windows_Defender

    前提 powershell只能针对win7之后的系统,之前的win操作系统默认没有安装powershell. 所在目录:C:\Windows\System32\WindowsPowerShell\v1 ...

  7. Ansible批量自动化管理工具(二)

    Ansible批量自动化管理工具(二) 链接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g 提取码:ncy2 复制这段内容后打开百度网盘手机App,操 ...

  8. 使用Gradle发布项目到JCenter仓库 (转载)

    原文:使用Gradle发布项目到JCenter仓库 这篇文章介绍通过Gradle把开源项目发布到公共仓库JCenter中,方便你我他的事情,我们都是很懒的嘛.JCenter现在是Android Stu ...

  9. 【Luogu】【关卡2-10】分治算法(2017年10月)

    任务说明:将大问题拆分为小问题,分而治之,各个击破,然后在合并回来. 取余运算||快速幂 幂次方 逆序对 南蛮图腾

  10. 【Luogu】【关卡2-9】带有技巧的搜索(2017年10月)

    任务说明:这里的搜索不仅包含了dfs和bfs,还包括剪枝.记录等技巧以加快速度. [USACO06FEB]数字三角形Backward Digit Su… 滑雪 吃奶酪 靶形数独 P1118 [USAC ...