设置 Nginx、MySQL 日志轮询
1. Nginx 设置日志轮询
机器直接安装的:
/etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
# 修改成实际的
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
docker 安装的:
/etc/logrotate.d/nginx-docker
:
# 挂载出来的 nginx 日志路径
/path/to/your/nginx/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 root root
sharedscripts
postrotate
# Nginx 容器的名称
CONTAINER_NAME="your_nginx_container_name"
# 重新加载 Nginx 配置
docker exec $CONTAINER_NAME /bin/sh -c 'kill -USR1 $(cat /var/run/nginx.pid)'
endscript
}
2. MySQL 设置日志轮询
机器直接安装的:
/etc/mysqladmin.cnf
:
[client]
user=root
password=your_password
修改属主为 mysql 用户
sudo chown mysql:mysql /etc/mysqladmin.cnf
sudo chmod 600 /etc/mysqladmin.cnf
/etc/logrotate.d/mysql
:
/var/log/mysql/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
# 修改成实际的
create 640 mysql adm
sharedscripts
postrotate
# 重新打开 MySQL 日志文件
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin --defaults-extra-file=/etc/mysqladmin.cnf ping &>/dev/null; then
/usr/bin/mysqladmin --defaults-extra-file=/etc/mysqladmin.cnf flush-logs
fi
endscript
}
docker 安装的:
比如 data
目录映射成 /path/to/your/mapped/mysql/data
log
目录映射成 /path/to/your/mapped/mysql/log
/path/to/your/mapped/mysql/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
# 用 容器里面 mysql 的 uid 和 gid
create 640 uid gid
sharedscripts
postrotate
# MySQL 容器的名称
CONTAINER_NAME="your_mysql_container_name"
# 重新打开 MySQL 日志文件
docker exec $CONTAINER_NAME /bin/sh -c 'mysqladmin --defaults-extra-file=/var/lib/mysql/mysqladmin.cnf flush-logs'
endscript
}
3. 测试
- 手动测试
logrotate
配置
使用 -d
选项来调试 logrotate
配置,这个选项会显示 logrotate
将执行的操作,但不会实际执行:
logrotate -d /etc/logrotate.d/nginx-docker
- 手动执行
logrotate
如果调试通过,可以手动执行 logrotate
以立即轮询日志:
logrotate -f /etc/logrotate.d/nginx-docker
- 检查日志文件
执行完 logrotate
后,检查日志文件目录,确认日志文件是否被轮询,并且新的日志文件是否被创建。