Nginx日志格式,分割,分析

本文介绍了Nginx的access_log和error_log日志格式,包括access_log的log_format定义和默认格式,以及error_log的错误等级。接着讲述了如何按日期存储和使用Linux logrotate进行日志分割。最后,文章提供了分析Nginx日志的方法,如统计PV数、获取访问IP数、每分钟请求数量以及查找访问频繁的IP。

参考来源:

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_iso8601ISO8601标准格式下的本地时间,格式为:生成格式: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数
  1. 统计所有的PV数
cat access.log | wc –l
  1. 统计当天的PV数
cat access.log | sed -n /`date "+%d\/%b\/%Y"`/p |wc -l
  1. 统计指定某一天的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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值