默认情况下,我们的项目中都会对接口的请求以及响应记录日志,然后我们可以把这条日志发给消息中间件(kafka),然后去做大数据的分析与统计。
但是,有时候并发过高导致50x错误,实际上,有些请求是没有转发出去的,也就没法在项目中去做记录了,比如,想知道服务器崩掉时的实际请求并发数。于是,我们需要对nginx的access.log日志做处理。
默认配置下,日志是记录在一个文件里的,文件会很大,需要修改配置,按小时来记录日志
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})")
{
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
set $minutes $5;
set $seconds $6;
}
access_log /var/logs/xxxx/access/xxxxx_xx_access_$year-$month-$day-$hour.log main;
其中 $time_iso8601为内嵌变量,格式如下:2018-09-21T16:01:02+02:00
此时,日志将会以小时为文件单位记录,当然还需要做一个shell脚本和定时任务定期清理的机制。
默认nginx的日志格式为
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# access_log logs/access.log main;
表现形式为
127.0.0.1 - - [03/Jul/2019:00:25:36 +0800] "GET /phpinfo.php HTTP/1.1" 200 25049 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
修改配置,使用时间格式 $time_iso8601
log_format test1 '$remote_addr - $remote_user [$time_iso8601] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log test1;
表现形式为
127.0.0.1 - - [2019-07-03T00:27:05+08:00] "GET /phpinfo.php HTTP/1.1" 200 25048 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"
这样就方便通过时间来筛选日志了。
多项目的话可以将配置写入location中
修改 nginx/logs 目录的权限
此时完成了日志文件的记录工作。
于是,就可以定时做一些统计了:
参考地址:https://www.cnblogs.com/david-cloud/p/8166159.html
以上是针对流量不大的服务器,当流量大时,性能不好。
大流量场景的应对方案
日志采集
可选择的工具比较多,比如 logstash、flume 等,我推荐使用 lua-resty-kafka 模块编写Lua扩展将数据按照一定格式拼接后写入消息队列。而且也完全可以关掉 Nginx 本身的日志开关,减少磁盘消耗。
消息队列
可以选择 Redis 或者 Kafka,主要取决于你们是否需要对日志做其它的利用。Redis 轻量级一些,Kafka的优势是高吞吐量、分布式架构, 并且除了做异常监控,还可以将数据放到 Hadoop/离线数据仓库中做用户行为分析。
异常监控计算
这一步其实和最开始的简单方案的类似,需要实现指标计算、告警发送和异常数据输出保存。如果日志采集时使用了logstash,那么这一步也推荐使用logstash保持一致,具体做法我就不多说了,看官方文档吧。但如果是使用Lua扩展采集的自定义格式数据,我推荐使用Heka来做。Heka使用Go语言编写,性能不错,内置丰富的插件可以满足大部分的需求。若不满足需求,可以使用Go或者Lua自行开发扩展。在Filter阶段做指标计算,有错误时向Heka消息流中写入告警消息,SMTPOuter匹配到告警消息后通过自定义的Encoder定制好邮件内容后发送,使用ElasticSearchOutput匹配异常数据写入ES节点。
可视化
前面使用Message Matcher Syntax匹配异常数据写入到Elasticsearch后, 搭建一个Kibana。这样在收到告警邮件后,就可以进入Kibana后台查看异常的Log。还可以定制一些图表以查看系统的错误趋势情况。