下面就是 CentOS 7.0 下 nginx 实现每天定时分割日志的完整攻略。
1. 安装 logrotate 工具
logrotate 是 Linux 下用于管理日志文件的工具,我们需要先安装该工具。在 CentOS 7.0 中可以通过 yum 命令安装:
sudo yum install logrotate
2. 编写 logrotate 配置文件
在 nginx 的配置文件中,我们需要指定日志的保存目录(例如 /var/log/nginx/
)和文件名(例如 access.log
)。同时,我们需要通过 logrotate 配置文件来告诉 logrotate 工具如何处理这些日志。
以下是一个示例的 logrotate 配置文件,文件名为 /etc/logrotate.d/nginx
:
# 每天执行日志分割
daily
# 保留最近 7 天的日志文件
rotate 7
# 缩写历史日志文件名,否则会重复命名
dateext
# 如果日志文件为空则不进行日志备份
notifempty
# 指定日志文件的位置
/var/log/nginx/*.log {
# 按照每周分割日志
weekly
# 保留最近 5 周的日志文件
rotate 5
# 使用 gzip 进行压缩
compress
# 指定压缩后的文件名
missingok
notifempty
sharedscripts
# 避免日志文件权限和所有者被修改
postrotate
/bin/kill -USR1 $(cat /run/nginx.pid 2>/dev/null) 2>/dev/null || true
endscript
}
以上的 logrotate 配置文件中,我们指定了:
- 每天执行日志分割;
- 保留最近 7 天的日志文件;
- 按照每周分割日志;
- 保留最近 5 周的日志文件;
- 使用 gzip 进行压缩;
- 删除已经 compress 过的日志文件;
- 避免日志文件权限和所有者被修改。
你需要根据自己的需求来调整这些参数。
3. 修改 nginx 配置文件
安装 logrotate 和编写配置文件之后,我们需要修改 nginx 的配置文件,以便在分割日志时不会影响 nginx 的服务。
为了实现这个目的,我们需要在 nginx 配置文件中加入如下代码:
# 定义日志格式
log_format timed_combined '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time" us="$upstream_status" cs=$upstream_cache_status';
# 定义访问日志文件和格式
access_log /var/log/nginx/access.log timed_combined;
# 定义错误日志文件和级别
error_log /var/log/nginx/error.log notice;
这段代码中,我们通过 access_log
指定了访问日志保存的路径和格式,通过 error_log
指定了错误日志保存的路径和级别。
4. 测试 logrotate 操作
最后,我们可以手动执行一下 logrotate 操作来测试配置是否成功。执行以下命令:
sudo logrotate -f /etc/logrotate.d/nginx
这条命令将强制执行 logrotate 操作,而不等到定时任务执行。你可以通过查看日志文件的变化来观察是否成功完成了分割和压缩操作。
示例
例如,我们可以通过以下代码来在 nginx 中显示访问日志:
server {
listen 80;
server_name example.com;
location / {
root /usr/share/nginx/html;
index index.html;
}
location /logs {
alias /var/log/nginx/;
autoindex on;
autoindex_exact_size off;
}
}
然后访问 http://example.com/logs
,就可以看到 nginx 的访问日志了。此时,你可以手动执行一下 logrotate 操作来测试配置是否成功。
另外,我们可以通过以下代码来在 nginx 中关闭 access log:
server {
listen 80;
server_name example.com;
location / {
root /usr/share/nginx/html;
index index.html;
}
location = /dev/null {
access_log off;
return 204;
}
}
这里的 location = /dev/null
指定了一个不存在的路径,用于关闭访问日志。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CentOS 7.0下nginx实现每天定时分割日志 - Python技术站