滚动 docker 中的 nginx 日志

前端之家收集整理的这篇文章主要介绍了滚动 docker 中的 nginx 日志前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Nginx 自己没有处理日志的滚动问题,它把这个球踢给了使用者。一般情况下,你可以使用 logrotate 工具来完成这个任务,或者如果你愿意,你可以写各式各样的脚本完成同样的任务。本文笔者介绍如何滚动运行在 docker 中的 Nginx 日志文件(下图来自互联网)。

Nginx 官方其实给出了如何滚动日志的说明:opening,the master process closes all open files and sends the message to worker process to ask them to re-open files. Worker processes also open new files and close old files right away. As a result,old files are almost immediately available for post processing,such as compression.

  • 文件重命名
  • Nginx master 进程发送 USR1 信号
  • Nginx master 进程收到信号后会做一些处理,然后要求工作者进程重新打开日志文件
  • 文件并关闭旧的日志文件

Nginx 容器:

$ docker run --p :-v $()/logs/Nginx:/var/log/Nginx \ --restart=--name=Nginx \ Nginx:.

Nginx 的日志绑定挂载到了当前目录下的 logs 目录下。内容保存到 test.sh 文件中:

#!/bin/<span style="color: #0000ff">for ((i=<span style="color: #800080">1;i<=<span style="color: #800080">100000;i++<span style="color: #000000">))
<span style="color: #0000ff">do<span style="color: #000000">
curl http:<span style="color: #008000">//<span style="color: #008000">localhost > /dev/null
<span style="color: #0000ff">sleep <span style="color: #800080">1
<span style="color: #0000ff">done

文件,其内容如下:

#!/bin/getdatestring()
{
TZ
=<span style="color: #800000">'<span style="color: #800000">Asia/Chongqing<span style="color: #800000">' <span style="color: #0000ff">date <span style="color: #800000">"<span style="color: #800000">+%Y%m%d%H%M<span style="color: #800000">"<span style="color: #000000">
}
datestring=<span style="color: #000000">$(getdatestring)

<span style="color: #0000ff">mv /var/log/Nginx/access.log /var/log/Nginx/<span style="color: #000000">access.${datestring}.log
<span style="color: #0000ff">mv /var/log/Nginx/error.log /var/log/Nginx/<span style="color: #000000">error.${datestring}.log
<span style="color: #0000ff">kill -USR1 <span style="color: #0000ff"&gt;cat</span> /var/run/<a href="/tag/Nginx/" target="_blank" class="keywords">Nginx</a>.pid

函数取当前的时间并格式化为字符串,比如 "201807241310",笔者比较喜欢用日期和时间来命名文件。注意这里通过 TZ='Asia/Chongqing' 指定了时区,因为默认情况下格式化的是 UTC 时间,用起来怪怪的(要实时脑补 +8 小时)。重命名日志文件Nginx master 进程发送 USR1 信号。文件添加可执行权限并复制到 $(pwd)/logs/Nginx 目录下:

$ +x rotatelog. rotatelog. $()/logs/Nginx

Nginx 运行在容器中,所以需要在容器中给 Nginx master 进程发送 USR1 信号。因此我们需要通过 docker exec 命令在 myNginx 容器中执行 rotatelog.sh 脚本:

$ docker exec myNginx bash /var/log/Nginx/rotatelog.

文件:

文件的末尾添加下面的行:

* * * * docker exec myNginx bash /var/log/Nginx/rotatelog.

退出就可以了。下图是笔者测试过程中每 5 分钟滚动一次的效果

文件?

内容从宿主机上看和从容器中看都是一样的。但是真正这么做的时候你很可能碰到权限问题。在宿主机中,你一般使用的是普通用户,而在容器中产生的日志文件的所有者是会是特殊的用户,并且一般不会给其它用户写和执行的权限:

用户就不会有问题。

Nginx master 进程发送信号吗?》一文中介绍了容器中信号的捕获问题,感兴趣的朋友可以去看看。在那篇文章中我们介绍了 docker 向容器中进程发送信号的 kill 命令。我们可以通过命令:

$ docker container mynginx -s USR1

猜你在找的Docker相关文章