参考来源:
1.Nginx日志格式
Nginx 日志主要有两种:access_log(访问日志) 和 error_log(错误日志)。
access_log 访问日志
access_log 主要记录客户端访问 Nginx 的每一个请求,格式可以自定义。通过 access_log你可以得到用户地域来源、跳转来源、使用终端、某个 URL访问量等相关信息。
log_format 指令用于定义日志的格式,语法: log_format name string; 其中 name 表示格式名称,string 表示定义的格式字符串。log_format 有一个默认的无需设置的组合日志格式。
默认的无需设置的组合日志格式
log_format combined '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';
access_log 指令用来指定访问日志文件的存放路径(包含日志文件名) 、格式和缓存大小,
语法: access_log path [format_name [buffer=size | off]]; 其中 path 表示访问日志存放路
径,format_name 表示访问日志格式名称,buffer 表示缓存大小,off 表示关闭访问日志。
log_format 使用示例:在 access.log 中记录客户端 IP 地址、请求状态和请求时间
log_format myformat '$remote_addr $status $time_local';
access_log logs/access.log myformat;
需要注意的是:log_format 配置必须放在 http 内,否则会出现警告。Nginx 进程设置的用户
和组必须对日志路径有创建文件的权限,否则,会报错。
定义日志使用的字段及其作用:
| 字段 | 作用 |
|---|---|
| $remote_addr 与 $http_x_forwarded_for | 记录客户端IP地址 |
| $remote_user | 记录客户端用户名称 |
| $request | 记录请求的URI和HTTP协议 |
| $status | 记录请求状态 |
| $body_bytes_sent | 发送给客户端的字节数,不包括响应头的大小 |
| $bytes_sent | 发送给客户端的总字节数 |
| $connection | 连接的序列号 |
| $connection_requests | 当前通过一个连接获得的请求数量 |
| $msec | 日志写入时间。单位为秒,精度是毫秒 |
| $pipe | 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.” |
| $http_referer | 记录从哪个页面链接访问过来的 |
| $http_user_agent | 记录客户端浏览器相关信息 |
| $request_length | 请求的长度(包括请求行,请求头和请求正文) |
| $request_time | 请求处理时间,单位为秒,精度毫秒 |
| $time_iso8601 | ISO8601标准格式下的本地时间,格式为:生成格式:2013-09-25T15:16:35+08:00 |
| $time_local | 记录访问时间与时区,格式为: 25/Sep/2013:15:12:13 +0800 |
error_log 错误日志
error_log 主要记录客户端访问Nginx出错时的日志,格式不支持自定义。通过查看错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志利用好,你可以得到很多有价值的信息。
error_log 指令用来指定错误日志,语法: error_log path [level] ; 其中 path 表示错误日志存放路径,level表示错误日志等级,日志等级包括debug、info、notice、warn、error、crit、alert、emerg,从左至右,日志详细程度逐级递减,即 debug 最详细,emerg 最少,默认为error。
注意: error_log off并不能关闭错误日志记录,此时日志信息会被写入到文件名为 off 的文件当中。如果要关闭错误日志记录,可以使用如下配置:
Linux 系统把存储位置设置为空设备
error_log /dev/null;
http {
# ...
}
Windows 系统把存储位置设置为空设备
error_log nul;
http {
# ...
}
2.Nginx日志分割
按日期存储
$time_iso8601日期格式为:2013-09-25T15:16:35+08:00
if ($time_iso8601 ~ "(\d{4})-(\d{2})-(\d{2})") {
set $time $1$2$3;
}
access_log /data/logs/nginx/test.com_access_${time}.log;
Linux logrotate 分割
参数说明
| 参数 | 含义 |
|---|---|
| compress | 通过gzip 压缩转储以后的日志 |
| nocompress | 不做gzip压缩处理 |
| copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 |
| nocopytruncate | 备份日志文件不过不截断 |
| create mode owner group | 轮转时指定创建新文件的属性,如create 0777 nobody nobody |
| nocreate | 不建立新的日志文件 |
| delaycompress | 和compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
| nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩。 |
| missingok | 如果日志丢失,不报错继续滚动下一个日志 |
| errors address | 专储时的错误信息发送到指定的Email 地址 |
| ifempty | 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。 |
| notifempty | 当日志文件为空时,不进行轮转 |
| mail address | 把转储的日志文件发送到指定的E-mail 地址 |
| nomail | 转储时不发送日志文件 |
| olddir directory | 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
| noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
| sharedscripts | 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 |
| prerotate | 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 |
| postrotate | 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 |
| daily | 指定转储周期为每天 |
| weekly | 指定转储周期为每周 |
| monthly | 指定转储周期为每月 |
| rotate count | 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 |
| dateext | 使用当期日期作为命名格式 |
| dateformat .%s | 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 |
| size(或minsize) log-size | 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).当日志文件 >= log-size 的时候就转储。以下为合法格式:(其他格式的单位大小写没有试过)size = 5 或 size 5 (>= 5 个字节就转储)size = 100k 或 size 100k size = 100M 或 size 100M |
// 编辑logrotate 脚本
vim /etc/logrotate.d/nginx
/home/wwwlogs/nginx1/*.log
/home/wwwlogs/nginx2/*.log #多个目录处理
{
su root adm
daily
rotate 45
missingok
dateext
compress
notifempty
create 640 www www
copytruncate
}
3.Nginx日志分析
确定日志格式
vim nginx.conf
## 在http下加上配置
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent $request_body "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time"';
access_log /var/log/nginx/access.log access;
分析日志
统计PV数
- 统计所有的PV数
cat access.log | wc –l
- 统计当天的PV数
cat access.log | sed -n /`date "+%d\/%b\/%Y"`/p |wc -l
- 统计指定某一天的PV数
cat access.log | sed -n '/20\/Aug\/2017/p' | wc -l
如果要是获取某一天的则修改日期即可。
获取访问IP数
cat access.log | awk '{print $1}' | sort -k1 -r | uniq | wc -l
获取每分钟的请求数量
通过cat、awk等Linux脚本工具,输出成csv文件,然后用excel打开,生成柱状图。
cat access.log | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' | sort -k1 | awk '{print $2","$1}' > access.csv
查看日志中访问次数最多的前10个IP
cat access.log.1 |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10
查看日志中访问次数超过1000次的前10个IP
cat access.log.1 |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{if($1>1000) print $0 }' | head -n 10
本文介绍了Nginx的access_log和error_log日志格式,包括access_log的log_format定义和默认格式,以及error_log的错误等级。接着讲述了如何按日期存储和使用Linux logrotate进行日志分割。最后,文章提供了分析Nginx日志的方法,如统计PV数、获取访问IP数、每分钟请求数量以及查找访问频繁的IP。
1145

被折叠的 条评论
为什么被折叠?



