设为首页 收藏本站
查看: 1896|回复: 0

[经验分享] 拾遗:使用 systemd-journald 管理 Docker 容器日志

[复制链接]

尚未签到

发表于 2017-12-6 23:19:27 | 显示全部楼层 |阅读模式
  在 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 内最多记录 100000 条日志,超出的将被丢弃
RateLimitInterval=30s
#与 RateLimitInterval 配合使用
RateLimitBurst=100000
#限制全部日志文件加在一起最多可以占用多少空间,默认值是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 0770 /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" (或 0), "alert" (1), "crit" (2), "err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7) \ #指定要显示的日志等级
--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 格式输出样例:


DSC0000.gif DSC0001.gif


__CURSOR=s=cc2bd54b07c04211996c7eb3a46b4ecc;i=11f8;b=9319f78348534d7c9231b3788881d1be;m=ea1d9a9ab;t=54f2a70366564;x=cb3b442de23e1b6d
__REALTIME_TIMESTAMP=1494418573387108
__MONOTONIC_TIMESTAMP=62844938667
_BOOT_ID=9319f78348534d7c9231b3788881d1be
PRIORITY=6
_UID=0
_GID=0
_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=9109
CONTAINER_ID=bc31bfa22688
CONTAINER_ID_FULL=bc31bfa22688736403a5e5e0377630382b4e0ac696b97254e779ce2b90a95b2d
CONTAINER_NAME=hopeful_poitras
MESSAGE
3root@bc31bfa22688:/# date
_SOURCE_REALTIME_TIMESTAMP=1494418573386408
__CURSOR=s=cc2bd54b07c04211996c7eb3a46b4ecc;i=11f9;b=9319f78348534d7c9231b3788881d1be;m=ea1daab4f;t=54f2a70376708;x=e8ea5e3b827ffd6a
__REALTIME_TIMESTAMP=1494418573453064
__MONOTONIC_TIMESTAMP=62845004623
_BOOT_ID=9319f78348534d7c9231b3788881d1be
PRIORITY=6
_UID=0
_GID=0
_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=9109
CONTAINER_ID=bc31bfa22688
CONTAINER_ID_FULL=bc31bfa22688736403a5e5e0377630382b4e0ac696b97254e779ce2b90a95b2d
CONTAINER_NAME=hopeful_poitras
MESSAGE
Wed May 10 12:16:13 UTC 2017
_SOURCE_REALTIME_TIMESTAMP=1494418573452545
日志输出样例  每个容器对应日志中的多个唯一 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-0000000000000001-00054f2c2fe295f9.journal
system@6c8acebb0081486ba83d698c06cd1d33-0000000000000017-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 [[ 1 -eq `ls $zDockerPathA 2>/dev/null | wc -l` ]];then
     zPathToDockerService=$zDockerPathA
else
     zPathToDockerService=$zDockerPathB
fi
if [[ 0 -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 0770 /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
  ...

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421506-1-1.html 上篇帖子: 三、使用vscode在docker中debug 下篇帖子: CentOS6.4安装Docker
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表