zoukankan      html  css  js  c++  java
  • Docker.logs-->日志清理

    1.手动清理->切换到日志目录,直接执行命令

    
    #找到需要清理日志的容器Id-->"0cf869a294227d349c946292ea06e9dbfbf4c4a07e16c191e1b02a37a890cc60"
    #可以格式化一下返回结果-->docker ps --format "{{.ID}}	{{.Names}}"
    docker ps
    
    #容器默认目录-->"/var/lib/docker/containers"
    cd /var/lib/docker/containers/0cf869a294227d349c946292ea06e9dbfbf4c4a07e16c191e1b02a37a890cc60/
    
    #查看容器中是否存在log日志文件-->发现确实存在日志文件.{0cf869a294227d349c946292ea06e9dbfbf4c4a07e16c191e1b02a37a890cc60-json.log}
    ll
    
    #清除日志
    cat /dev/null > 0cf869a294227d349c946292ea06e9dbfbf4c4a07e16c191e1b02a37a890cc60-json.log
    
    #验证日志是否清除-->{test}为容器名称
    docker logs test
    
    
    

    自动清理->执行脚本清理Docker容器日志(治标)

    #docker_logs_clean.sh
    echo "------------------------Start Clean Docker Containers Logs------------------------"
    logs=$(find /var/lib/docker/containers/ -name *-json.log)
    for log in $logs
    do
    echo "Clean Logs : $log"
    cat /dev/null > $log
    done
    echo "------------------------End Clean Docker Containers Logs------------------------"
    

    通过配置->设置Docker容器日志大小(治本)

    单独容器设置

    上述方法,日志文件迟早又会涨回来.
    要从根本上解决问题,需要限制容器服务的日志大小上限.
    这个通过配置容器docker-compose的max-size选项来实现

    
    nginx:
    image: nginx:1.12.1
    restart: always
    logging:
    driver: “json-file”
    options:
    max-size: “5g”
    
    

    重启nginx容器之后,其日志文件的大小就被限制在5GB,再也不用担心了.


    全局设置

    新建.{/etc/docker/daemon.json}(若有就不用新建了)
    添加log-dirver和log-opts参数,样例如下↓

    
    # vim /etc/docker/daemon.json
    {
    "registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
    "log-driver":"json-file",
    "log-opts": {"max-size":"500m", "max-file":"3"}
    }
    
    

    max-size=500m,意味着一个容器日志大小上限是500M,

    max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

    
    // 重启docker守护进程
    # systemctl daemon-reload
    # systemctl restart docker
    
    

    注意-->设置的日志大小,只对新建的容器有效.


    附加脚本->查找日志的大小

    
    #错误示范
    [root@node1 ~]# mkdir /root/file/docker_scripts/logs_scripts
    mkdir: cannot create directory ‘/root/file/docker_scripts/logs_scripts’: No such file or directory
    #正确操作(参数.{-p}又忘了...)
    [root@node1 ~]# mkdir -p /root/file/docker_scripts/logs_scripts
    [root@node1 ~]# cd /root/file/docker_scripts/logs_scripts/
    
    #在{/var/lib/docker/containers/}目录下查找以.log结尾的文件名
    
    #查找-->log文件-->参数.{name}不忽略大小写
    find /var/lib/docker/containers/ -name *-json.log
    
    #查找-->log文件-->参数.{iname}不忽略大小写
    find /var/lib/docker/containers/ -iname *-json.LOG
    
    

    docker_logs_size.sh源码(正确版本)

    #!/bin/bash
    
    echo "=========docker containers logs file size ========="
    #注意-->用户自定义变量,变量名称和值之间的等于号("=")不需要空格
    logs=$(find /var/lib/docker/containers/ -name *-json.log)
    
    for log in $logs 
    	do
    		ls -lh $log
    	done
    
    #新建/编辑-->文件
    vim docker_logs_size.sh
    
    

    小结

    小结

    docker_logs_size.sh是我纯手打,
    所以有一些意外的收获(报错),如果直接复制过来的话,
    可能就不会发现这些小细节了...

    并且有个报错-->logs: command not found,
    这个需要有个思想的转换,直接搜索这个错误是不会有太大的提示作用的,
    要理清楚,这一步是做什么导致出错的.
    就像是做功能开发,要先理解需求,
    要将问题抽象出来,
    这个地方抽象出来的搜索关键字就是-->"Shell(Bash)用户自定义变量使用方法"


    附加.1.错误版本

    #!/bin/bash
    o "=========docker containers logs file size ========="
    logs = $(find /var/lib/docker/containers/ -name *-json.log)
    
    for log in $logs 
    	do
    		ls -lh $log
    	done
    

    附加.2.Shell(Bash)用户自定义变量使用方法示范

    Shell(Bash)用户自定义变量使用方法示范(又是一个小细节)

    #正确示范
    [root@node1 logs_scripts]# name="ok"
    [root@node1 logs_scripts]# echo $name
    ok
    
    #错误示范
    [root@node1 logs_scripts]# name = "ok"
    -bash: name: command not found
    
    

    附加.3.报错集锦

    报错-->拼写错误-->chmod

    #"chomod"-->拼写错误.{"正确":"chmod","错误":"chomod"}
    [root@node1 logs_scripts]# chomod +x docker_logs_size.sh
    -bash: chomod: command not found
    [root@node1 logs_scripts]# chmod +x docker_logs_size.sh
    

    报错-->拼写错误-->chmod +x(如果多空格会报错)

    #"chmod +x"-->拼写错误.{"正确":"chmod +x","错误":"chmod + x"}
    [root@node1 logs_scripts]# chomod + x docker_logs_size.sh
    [root@iZ2zeca7jric8sx4f3n7spZ logs]# chmod + x docker_logs_size.sh
    chmod: cannot access 'x': No such file or directory
    #正确
    [root@node1 logs_scripts]# chmod +x docker_logs_size.sh
    

    报错-->拼写错误-->"echo"

    [root@node1 logs_scripts]# ./docker_logs_size.sh
    ./docker_logs_size.sh: line 1: o: command not found
    ./docker_logs_size.sh: line 2: logs: command not found
    
    
    #修改{docker_logs_size.sh}源码
    [root@node1 logs_scripts]# vim docker_logs_size.sh
    #继续报错
    [root@node1 logs_scripts]# ./docker_logs_size.sh
    =========docker containers logs file size =========
    ./docker_logs_size.sh: line 2: logs: command not found
    ls: cannot access logs: No such file or directory
    
    #这个问题是由于用户自定义变量使用不规范导致
    

    报错-->语法错误-->用户自定义变量

    #错误示范(注意空格)
    logs = $(find /var/lib/docker/containers/ -name *-json.log)
    #正确示范
    logs=$(find /var/lib/docker/containers/ -name *-json.log)
    

    摘抄文档

  • 相关阅读:
    C++中几个值得分析的小问题(1)
    《Effective C++》第5章 实现-读书笔记
    《Effective C++》第4章 设计与声明(2)-读书笔记
    《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记
    《Effective C++》第4章 设计与声明(1)-读书笔记
    《Effective C++》第3章 资源管理(2)-读书笔记
    【剑指Offer】24二叉树中和为某一值的路径
    【剑指Offer】23二叉搜索树的后序遍历序列
    【剑指Offer】22从上往下打印二叉树
    【剑指Offer】21栈的压入、弹出序列
  • 原文地址:https://www.cnblogs.com/love-zf/p/14698958.html
Copyright © 2011-2022 走看看