码迷,mamicode.com
首页 > 其他好文 > 详细

[centos][docker][logrotate][nginx] 为docker内的程序配置logrotated方法

时间:2019-12-24 12:16:22      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:mis   操作   ack   www   规则   run   compress   missing   share   

情景

一般情况下,我们都会映射一个外部目录到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

---

 

[centos][docker][logrotate][nginx] 为docker内的程序配置logrotated方法

标签:mis   操作   ack   www   规则   run   compress   missing   share   

原文地址:https://www.cnblogs.com/hugetong/p/12090417.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!