【转】纯手工玩转 Nginx 日志

Nginx 日志对于大部分人来说是个未被发掘的宝藏,总结之前做某日志分析系统的经验,和大家分享一下 Nginx 日志的纯手工分析方式。

Nginx 日志相关配置有 2 个地方:access_log 和 log_format 。

默认的格式:

  1. access_log /data/logs/nginx-access.log;
  2. log_format old ‘$remote_addr [$time_local] $status $request_time $body_bytes_sent ‘
  3. ‘"$request" "$http_referer" "$http_user_agent"‘;

相信大部分用过 Nginx 的人对默认 Nginx 日志格式配置都很熟悉,对日志的内容也很熟悉。但是默认配置和格式虽然可读,但是难以计算。

Nginx 日志刷盘相关策略可配置:

比如,设置 buffer,buffer 满 32k 才刷盘;假如 buffer 不满 5s 钟强制刷盘的配置如下:

  1. access_log /data/logs/nginx-access.log buffer=32k flush=5s;

这决定了是否实时看到日志以及日志对磁盘 IO 的影响。

Nginx 日志能够记录的变量还有很多没出现在默认配置中:

比如:

  • 请求数据大小:$request_length
  • 返回数据大小:$bytes_sent
  • 请求耗时:$request_time
  • 所用连接序号:$connection
  • 当前连接发生请求数:$connection_requests

Nginx 的默认格式不可计算,需要想办法转换成可计算格式,比如用控制字符 ^A (Mac 下 ctrl+v ctrl+a 打出)分割每个字段。

log_format 的格式可以变成这样:

  1. log_format new ‘$remote_addr^A$http_x_forwarded_for^A$host^A$time_local^A$status^A‘
  2. ‘$request_time^A$request_length^A$bytes_sent^A$http_referer^A$request^A$http_user_agent‘;

这样之后就通过常见的 Linux 命令行工具进行分析了:

  • 查找访问频率最高的 URL 和次数:

    1. cat access.log | awk -F ‘^A’ ‘{print $10}’ | sort | uniq -c
  • 查找当前日志文件 500 错误的访问:
    1. cat access.log | awk -F ‘^A’ ‘{if($5 == 500) print $0}’
  • 查找当前日志文件 500 错误的数量:
    1. cat access.log | awk -F ‘^A’ ‘{if($5 == 500) print $0}’ | wc -l
  • 查找某一分钟内 500 错误访问的数量:
    1. cat access.log | awk -F ‘^A’ ‘{if($5 == 500) print $0}’ | grep ’09:00’ | wc-l
  • 查找耗时超过 1s 的慢请求:
    1. tail -f access.log | awk -F ‘^A’ ‘{if($6>1) print $0}’
  • 假如只想查看某些位:
    1. tail -f access.log | awk -F ‘^A’ ‘{if($6>1) print $3″|”$4}’
  • 查找 502 错误最多的 URL:
    1. cat access.log | awk -F ‘^A’ ‘{if($5==502) print $11}’ | sort | uniq -c
  • 查找 200 空白页
    1. cat access.log | awk -F ‘^A’ ‘{if($5==200 && $8 < 100) print $3″|”$4″|”$11″|”$6}’
  • 查看实时日志数据流
    1. tail -f access.log | cat -e

    或者

    1. tail -f access.log | tr ‘^A’ ‘|’

总结

照着这个思路可以做很多其他分析,比如 UA 最多的访问;访问频率最高的 IP;请求耗时分析;请求返回包大小分析;等等。

这就是一个大型 Web 日志分析系统的原型,这样的格式也是非常方便进行后续大规模 batching 和 streaming 计算。

转载自: http://blog.eood.cn/nginx_logs    作者: Bruce Dou

时间: 2024-11-03 05:44:31

【转】纯手工玩转 Nginx 日志的相关文章

Nginx 日志分享

Nginx 日志对于大部分人来说是个未被发掘的宝藏,总结之前做某日志分析系统的经验,和大家分享一下 Nginx 日志的纯手工分析方式. Nginx 日志相关配置有 2 个地方:access_log 和 log_format . 默认的格式: access_log /data/logs/nginx-access.log; log_format old '$remote_addr [$time_local] $status $request_time $body_bytes_sent ' '"$re

利用 ELK系统分析Nginx日志并对数据进行可视化展示

一.写在前面 结合之前写的一篇文章:Centos7 之安装Logstash ELK stack 日志管理系统,上篇文章主要讲了监控软件的作用以及部署方法.而这篇文章介绍的是单独监控nginx 日志分析再进行可视化图形展示,并在用户前端使用nginx 来代理kibana的请求响应,访问权限方面暂时使用HTTP 基本认证加密用户登录.(关于elk权限控制,我所了解的还有一种方式-Shield),等以后有时间了去搞下.下面开始正文吧... 注意:环境默认和上一篇大致一样,默认安装好了E.L.K.3个软

使用elk+redis搭建nginx日志分析平台

logstash,elasticsearch,kibana 怎么进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每个请求的状态等都有日志文件进行记录.其次,需要有个队列,redis的list结构正好可以作为队列使用.然后分析使用elasticsearch就可以进行分析和查询了. 我们需要的是一个分布式的,日志收集和分析系统.logstash有agent和indexer两个角色.对于agent角色,放在单独的web机器上面,然后这个agent不断地读取nginx的日志文件

shell脚本分析nginx日志

第一版,比较粗糙,仅限于能用 正在写入的文件不能用tar进行压缩 --------压缩日志---------------------- 94 access.log 95 tar: access.log: file changed as we read it 96 #### 压缩日志失败 #### #!/bin/sh #分析nginx日志 DATE=`date '+%Y%m%d-%H%M'` ARCHIVE=/usr/log_bak/nginx_$DATE.tar.gz MESSAGE=/usr/

Goaccess---良心nginx日志分析工具

Goaccess是一个非常良心的开源软件,它的良心之处体现在如下方面: 1)安装简单: 2)操作容易: 3)界面酷炫: 安装Goaccess十分的简单,在centos里直接#yum install goaccess,如果yum源里没有goaccess,可以先安装epel.安装epel的方法如下: wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm wget http://rpms.famil

Nginx日志切割并计划任务自动上传到FTP服务器

枫城浪子原创,转载请标明出处! 微信bh19890922 QQ445718526,490425557 更多技术博文请见个人博客: https://fengchenglangzi.000webhostapp.com http://fengchenglangzi.blog.51cto.com 一.简述 Nginx WEB服务器每天会产生大量的访问日志,而且不会自动地进行切割,如果持续天数访问,将会导致该access.log日志文件容量非常大,不便于SA查看相关的网站异常日志,并且后期进行分割非常不易

Flume采集Nginx日志到HDFS

下载apache-flume-1.7.0-bin.tar.gz,用 tar -zxvf 解压,在/etc/profile文件中增加设置: export FLUME_HOME=/opt/apache-flume-1.7.0-bin export PATH=$PATH:$FLUME_HOME/bin 修改$FLUME_HOME/conf/下的两个文件,在flume-env.sh中增加JAVA_HOME: JAVA_HOME=/opt/jdk1.8.0_121 最重要的,修改flume-conf.pr

Nginx日志变量说明

# Nginx日志变量说明|   |   || ------------ | ------------ ||  $remote_addr |  记录访问网站的客户端ip地址. ||  $http_x_forwarded_for |  当前端有代理服务器时,设置Web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也要进行相关的x_forwarded_for设置. ||$remote_user|远程客户端用户名称||$time_local|记录访问时间和时区||$request|用户的ht

Nginx 日志分析及性能排查

最近一直在做性能排查,思路就是根据分析Nginx日志,得到响应耗时的url.以及请求时间,再得到这段时间的请求量,并发量,分析是并发的原因,还是本身就比较慢,如果是应用本身的原因,只需要找到对应的代码,然后进行优化就好了 找到的几个原因,基本就是后端sql运行的比较多,单次访问看不出来,但是人比较多的时候就比较慢了,人少的时候20-200毫秒,人多的时候,200-6000毫秒,优化之后基本保持在几十毫秒,优化策略就是减少不必要的sql,加上缓存,基本解决了卡顿的问题,顺便把这次用的一系列命令记录