一、配置日志格式
Syntax: log_format name
[escape=default|json|none]
string ...;
Default: log_format combined "...";
Context: http
常用的变量:
- $remote_addr:客户端 IP 地址
- $remote_user:客户端用户名称
- $http_x_forwarded_for:请求头 x_forwarded_for
- $http_referer:记录从哪个页面链接访问过来的
- $http_user_agent:记录客户端浏览器相关信息
- $request:记录请求的 URL 和 HTTP 协议
- $request_length:请求的总长度,包括请求行、请求头和请求正文
- $request_time:请求处理时间,单位为秒,精度毫秒
- $time_iso8601:ISO8601 标准格式下的本地时间
- $time_local:通用日志格式下的本地时间
- $status:记录请求状态码
- $body_bytes_sent:发送给客户端的字节数,不包括响应头的大小
- $bytes_sent:发送给客户端的总字节数
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
二、日志文件描述符缓存
定义一个缓存,用于存储名称包含变量的常用日志的文件描述符。
Syntax: open_log_file_cache max=N
[inactive=time] [min_uses=N]
[valid=time];
open_log_file_cache off;
Default: open_log_file_cache off;
Context: http, server, location
- max:设置缓存中的文件描述符的最大数量,如果缓存被占满,采用 LRU 算法将文件描述符关闭。
- inactive:设置缓存描述符关闭的时间(如果在此时间内没有访问);默认为 10 秒。
- min_uses:在 inactive 参数定义的时间内设置文件使用的最小数量,以使描述符在缓存中保持打开状态; 默认情况下为 1。
- valid:设置检查文件是否仍存在同名文件的时间;默认情况下为 60 秒。
- off:禁用缓存。
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
三、访问日志配置
Syntax: access_log path [format
[buffer=size] [gzip[=level]]
[flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location,
if in location, limit_except
- path:访问日志的存放位置。
- format:日志的格式。默认使用预定义的 combined。
- buffer:日志写入时的缓存大小。默认是 64k。
- flush:将缓存中的日志写入磁盘的周期。
- gzip:开启日志压缩。压缩率可以指定,从 1 到 9 数值越大压缩比越高速度越慢。默认是 1。
- if:条件判断。如果指定的条件计算为 0 或空字符串,那么该请求不会写入日志。
- off:关闭访问日志。
# 设置访问日志位置、使用自定义日志格式 main
access_log /opt/nginx/logs/server-80.log main;
# 设置日志缓存与刷盘时间
access_log /opt/nginx/logs/server-80.log main buffer=64k flush=1s;
四、错误日志
Syntax: error_log file [level];
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location
- file:错误日志的位置。
- level:日志的级别,debug, info, notice, warn, error, crit, alert, emerg。
五、日志分割
1. 通过 shell 脚本的方式
#!/bin/bash
# 日志路径
LOG_PATH="/opt/nginx/logs"
# 生成一个时间的字符串
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d-%H-%M-%S)
# nginx 的 PID
PID=/opt/nginx/logs/nginx.pid
# 移动文件
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
# 向 Nginx 主进程发送 USR1 信号,
# 用于重新打开日志文件
kill -USR1 `cat $PID`
设置定时任务:
# 设置脚步可执行权限
$ chmod +x cut_nginx_log.sh
# 使用 crontab 设置定时任务
$ crontab -e
0 0 * * * /opt/nginx/sbin/cut_nginx_log.sh
2. 使用 linux logrotate 工具
主流 Linux 发行版上都默认安装有 logrotate 包,如果没有通过 yum 安装即可。
logrotate 配置文件位置:
- /etc/logrotate.conf 全局配置,通用配置放这里。
- /etc/logrotate.d/ 独立配置,针对不同服务的配置放这里,如 nginx。
常见 nginx 日志归档规则:
$ vim /etc/logrotate.d/nginx
/opt/nginx/logs/*.log {
create 0644 nobody root
daily
rotate 30
dateext
olddir /opt/nginx/logs
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/bin/kill -USR1 `cat /opt/nginx/logs/nginx.pid` 2>/dev/null || true
endscript
}
- create:创建新的日志文件时的权限和属主属组。
- daily: 每天进行一次轮转。
- rotate: 保留的轮转后的日志文件副本数量。
- dateext:轮转后的日志文件后缀格式为 YYYYMMDD。
- olddir:归档的日志存放目录。
- missingok: 如果日志文件不存在,不报错,继续滚动下一个日志。
- notifempty: 如果日志文件为空,则不轮转。
- compress:通过 gzip 压缩转储后的日志。
- delaycompress: 转储的日志文件到下一次转储时再压缩,与 compress 配合使用。
- sharedscripts: 所有日志文件都转储完成后,统一执行一次脚本。
- postrotate 和 endscript: 这两个选项之间的内容是在日志文件轮转后执行的命令。
# 检查配置的正确性
logrotate -d /etc/logrotate.d/nginx
# 强制轮转
logrotate -f /etc/logrotate.d/nginx
在大多数 Linux 发行版中,Logrotate 的 Cron 作业已经预先配置好了。通常,这个作业被设置为每天运行一次。你可以在 /etc/cron.daily/ 目录中找到名为 "logrotate" 的脚本。
本文暂时没有评论,来添加一个吧(●'◡'●)