zoukankan      html  css  js  c++  java
  • 通过实时日志分析_进行访问日志的快速统计

    原文链接

    简介

    很多个人站长在搭建网站时使用nginx作为服务器,为了了解网站的访问情况,一般有两种手段:

    1. 使用CNZZ之类的方式,在前端页面插入js,用户访问的时候触发js,记录访问请求。
    2. 利用流计算、或离线统计分析nginx的access log,从日志中挖掘有用信息。

    两种方式各有优缺点:

    1. CNZZ使用起来比较简单,各种指标定义清楚。但这种方式只能记录页面的访问请求,像ajax之类的请求是无法记录的,还有爬虫信息也不会记录。
    2. 利用流计算、离线计算引擎可以支持个性化需求,但需要搭建一套环境,并且在实时性以及分析灵活性上比较难平衡。

    两种手段相互补充,才能对网站的状况有更加深入的了解。

    日志服务在查询基础上新推出来SQL支持实时日志分析功能,极大的降低了站长们分析access log的门槛,本文将详细介绍如何使用日志服务分析access log中的各种指标。

    Nginx访问日志格式

    一个典型的nginx访问日志配置:

          log_format  main  '$remote_addr - $remote_user [$time_local] "$request" $http_host '
                            '$status $request_length $body_bytes_sent "$http_referer" '
                            '"$http_user_agent"  $request_time';
    
          access_log  access.log  main;
    

    字段解释:

    1. remote_addr : 客户端地址
    2. remote_user : 客户端用户名
    3. time_local : 服务器时间
    4. request : 请求内容,包括方法名,地址,和http协议
    5. http_host : 用户请求是使用的http地址
    6. status : 返回的http 状态码
    7. request_length : 请求大小
    8. body_bytes_sent : 返回的大小
    9. http_referer : 来源页
    10. http_user_agent : 客户端名称
    11. request_time : 整体请求延时

    收集访问日志到日志服务

    1. 首先把日志收集到日志服务

      请参考文档5分钟快速文档

    2. 把日志收集到日志服务后,设置每一列的类型:

      index_attribute

      注:其中request拆分城method 和uri两列

      日志样例:

      sample_log

    分析访问日志

    通常,对access log的访问需求有,查看网站的pv,uv,热点页面,热点方法,错误请求,客户端类型,来源页面等等。下文将逐个介绍各个指标的计算方法。

    1. PV统计不仅可以一段时间总的PV,还可以按照小的时间段,查看每段时间的,比如每5分钟pv

      统计代码

      *|select from_unixtime( __time__- __time__% 300) as t, 
           count(1) as pv  
           group by __time__- __time__% 300 
           order by t limit 60
      
      

      统计结果

      pv

    2. 统计一小时内每5分钟的UV

      统计代码:

      *|select from_unixtime( __time__- __time__% 300) as t,
              approx_distinct(remote_addr) as uv  
              group by __time__- __time__% 300 
              order by t limit 60
      

      uv_5min

    3. 统计一小时内总的UV

      统计代码:

      *|select approx_distinct(remote_addr)  
      

      统计结果:

      uv

    4. 最近一小时访问最多的10个页面

      *|select url,count(1) as pv group by url order by pv desc limit 10
      

      top10page

    5. 最近一小时各种请求方法的占比

      *| select method, count(1) as pv group by method
      

      method

    6. 最近一小时各种http状态码的占比

      *| select status, count(1) as pv group by status
      

      status

    7. 最近一小时各种浏览器的占比

      *| select user_agent, count(1) as pv group by user_agent
      

      user_agent

    8. 最近一小时referer来源于不同域名的占比

      *|select url_extract_host(http_referer) ,count(1) group by url_extract_host(http_referer)
      

      注:url_extract_host为从url中提取域名
      referer

    9. 最近一小时用户访问不同域名的占比

      *|select  http_host ,count(1) group by http_host
      

      host

      一些高级功能

    除了一些访问指标外,站长常常还需要对一些访问请求进行诊断,查看一下处理请求的延时如何,有哪些比较大的延时,哪些页面的延时比较大。

    1. 通过每5分钟的平均延时和最大延时, 对延时的情况有个总体的把握

      *|select from_unixtime(__time__ -__time__% 300) as time, 
               avg(request_time) as avg_latency ,
               max(request_time) as max_latency  
               group by __time__ -__time__% 300 
               limit 60
      

      avg_max_latency

    2. 知道了最大延时之后,我们需要知道最大延时对应的请求页面是哪个,方便进一步优化页面响应。

      *|select from_unixtime(__time__ - __time__% 60) , 
        max_by(url,request_time)  
        group by __time__ - __time__%60
      

      top_latency_req

    3. 从总体把握,我们需要知道网站的所有请求的延时的分布, 把延时分布在十个桶里边,看每个延时区间的请求个数

      *|select  numeric_histogram(10,request_time)
      

      latency_histogram1

    4. 除了最大的延时,我们还需要知道最大的十个延时,对应的值是多少

      *|select max(request_time,10)
      

      top_10_latency

    5. 当我们知道了/0这个页面的访问延时最大,为了对/0页面进行调优,接下来需要统计/0这个页面的访问PV,UV,各种method次数,各种status次数,各种浏览器次数,平均延时,最大延时

      url:"/0"|select count(1) as pv, approx_distinct(remote_addr) as uv, histogram(method) as method_pv,histogram(status) as status_pv, histogram(user_agent) as user_agent_pv, avg(request_time) as avg_latency,  max(request_time) as max_latency
      

      url0

      url0method
      url0useragent
      url0status

    6. 同时,我们也可以限定只查看request_time 大于1000的请求的pv,uv,以及各个url的请求次数

      request_time > 1000 |select count(1) as pv, approx_distinct(remote_addr) as uv, histogram(url) as url_pv
      

      url_pv

      latency1000url

    原文链接

  • 相关阅读:
    问题 B: 投简历
    问题 C: P4 游戏中的Human角色
    绘制直方图
    绘制条形图
    绘制散点图
    问题 A: E2 驾驭const
    问题 B: 矩形类中运算符重载【C++】
    extjs tips
    extjs
    struts1
  • 原文地址:https://www.cnblogs.com/iyulang/p/7000641.html
Copyright © 2011-2022 走看看