设置 Nginx、MySQL 日志轮询
1. Nginx 设置日志轮询
机器直接安装的:
/etc/logrotate.d/nginx
/var/log/nginx/*.log {dailymissingokrotate 30compressdelaycompressnotifempty# 修改成实际的create 640 nginx admsharedscriptspostrotateif [ -f /var/run/nginx.pid ]; thenkill -USR1 `cat /var/run/nginx.pid`fiendscript
}
docker 安装的:
/etc/logrotate.d/nginx-docker
:
# 挂载出来的 nginx 日志路径
/path/to/your/nginx/logs/*.log {dailymissingokrotate 30compressdelaycompressnotifemptycreate 640 root rootsharedscriptspostrotate# 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 {dailymissingokrotate 30compressdelaycompressnotifempty# 修改成实际的create 640 mysql admsharedscriptspostrotate# 重新打开 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-logsfiendscript
}
docker 安装的:
比如 data
目录映射成 /path/to/your/mapped/mysql/data
log
目录映射成 /path/to/your/mapped/mysql/log
/path/to/your/mapped/mysql/logs/*.log {dailymissingokrotate 30compressdelaycompressnotifempty# 用 容器里面 mysql 的 uid 和 gidcreate 640 uid gidsharedscriptspostrotate# 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
后,检查日志文件目录,确认日志文件是否被轮询,并且新的日志文件是否被创建。