zoukankan      html  css  js  c++  java
  • [centos][docker][logrotate][nginx] 为docker内的程序配置logrotate的方法

    情景

    一般情况下,我们都会映射一个外部目录到docker里边,docker里边的程序会将数据,包括

    日志写在这个目录里,这个时候,日志是docker内外都可见的。例如常用的ngingx部署方法。

     [class_tong @ https://www.cnblogs.com/hugetong/]

    背景

    logrotate是一个日志回滚的工具,它会根据文件大小规则,对日志文件进行切分以及删除

    操作。

    logrotate本身不是一个daemon进程,他是一个crond任务,每天调用一次。

    另外,logrotate在做了文件操作之后是需要通知写日志的进程的,一般是发一个信号。

    这个操作需要在logrotate的配置文件中显式设置。

    方法

    目前,我能总结出的方法。(建议直接阅读方法三)

    在docker内,除了启动你的服务外,同时启动一个crond任务,在docker内完成logrotate工作。

    如下生成docker镜像:注意红字

    FROM nginx:1.11
    
    # Remove sym links from nginx image
    RUN rm /var/log/nginx/access.log
    RUN rm /var/log/nginx/error.log
    
    # Install logrotate
    RUN apt-get update && apt-get -y install logrotate
    
    # Copy MyApp nginx config
    COPY config/nginx.conf /etc/nginx/nginx.conf
    
    #Copy logrotate nginx configuration
    COPY config/logrotate.d/nginx /etc/logrotate.d/
    
    # Start nginx and cron as a service
    CMD service cron start && nginx -g 'daemon off;'

    在docker host上。显式的对映射出来的目录文件进行logrotate的配置,这样

    传统情况下的一般配置,并没有什么不同。除了为服务进程发信号的方式,因为

    我们需要将信号发到docker里面去。当然,这也没什么大不了的,方法如下:注意红字

    $ sudo vi /etc/logrotate.d/test
    /home/test/logs/*log {
        rotate 90
        missingok
        ifempty
        sharedscripts
        compress
        postrotate
            docker exec -it nginx-test nginx -s reload > /dev/null 2>/dev/null || true
        endscript
    }

    在方法三面前,前两者都弱爆了。它是这样的:在docker里边安装好logrote(这是必须的),

    同时在docker外边的host上,安装包:docker-logrotate

    我们看,这个包里都有啥:

    [root@caotong ~]# rpm -ql docker-logrotate
    /etc/cron.daily/docker-logrotate
    /usr/share/doc/docker-logrotate-1.12.86
    /usr/share/doc/docker-logrotate-1.12.86/README.docker-logrotate

    只有一个cron的task,我们再来看这个task都做了什么:

    [root@caotong ~]# cat /etc/cron.daily/docker-logrotate 
    #!/bin/sh
    
    LOGROTATE=true
    [ -f /etc/sysconfig/docker ] && source /etc/sysconfig/docker
    
    if [ $LOGROTATE == true ]; then
        for id in $(docker ps -q); do
            exec $(docker exec $id logrotate -s /var/log/logstatus /etc/logrotate.conf > /dev/null 2>&1)
        done
    fi
    exit 0

    它调用了,所有docker里边的logrotate。

    于是,我们只需要在docker内正常的每一个docker配置logrotate就行了,host会根据这个任务自动调用他们。

     [class_tong @ https://www.cnblogs.com/hugetong/]

     

    结论

    综上,我推荐,并仅推荐方法三。

    参考:https://stackoverflow.com/questions/46323978/logrotate-nginx-logs-not-rotating-inside-docker-container

    ---

  • 相关阅读:
    sprint2第五天任务完成情况
    sprint2第四天任务完成情况
    sprint2第三天任务完成情况
    spark编程基础1
    git基本命令
    自定义bean对象实现序列化接口(Writable)
    HDFS 2.X新特性
    win10-idea连接hdfs集群
    centos6-yum源失效问题
    hadoop-源码编译
  • 原文地址:https://www.cnblogs.com/hugetong/p/12090417.html
Copyright © 2011-2022 走看看