发表于: 2018-04-04 17:41:32

1 607


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin) 

学习了脚本中对于文本处理的一些知识。

grep [-acinv]

-a:将二进制文本按照txt搜寻

-c:计算找到需要文本的次数

-i:忽略大小写

-n:输出行号

-v:反向选择


awk是一种将文本按行分块进行处理的强大的文本处理器

具体语法较多。


今天把统计响应时间的脚本写了,首先将日志格式的第一位换成$request_time便于统计数据。当然也可以单独天界一个只显示响应时间的log。

日志格式如下:

0.019 183.192.36.131 - - [05/Apr/2018:00:05:58 +0800] "GET /student/list?currentPage=10 HTTP/1.1" 200 7824 "http://47.97.118.36/student/list" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" -"127.0.0.1:8083, 127.0.0.1:8081 0.001, 0.018 

这样awk $1急可以的得到响应时间

任务需要统计100次的响应时间分布。

脚本如下:


#!/bin/bash

LOG_PATH=/var/log/nginx/access.log

echo nginx响应时间

echo 统计100次的访问

echo 划分时间段

echo 响应时间0.05s以内的次数

tail -100 ${LOG_PATH}|awk 'BEGIN{sum=0}{if($1<0.05)sum++;}END{print sum}'

echo 响应时间0.05--0.1s的次数

tail -100 ${LOG_PATH}|awk 'BEGIN{sum=0}{if(($1>0.05)&&($1<0.1))sum++;}END{print sum}'

echo 响应时间0.1--0.15s的次数

tail -100 ${LOG_PATH}|awk 'BEGIN{sum=0}{if(($1>0.1)&&($1<0.15))sum++;}END{print sum}'

echo 响应时间0.15--0.2s的次数

tail -100 ${LOG_PATH}|awk 'BEGIN{sum=0}{if(($1>0.15)&&($1<0.2))sum++;}END{print sum}'

echo 响应时间0.2s以上的次数

tail -100 ${LOG_PATH}|awk 'BEGIN{sum=0}{if($1>0.2)sum++;}END{print sum}'

因为nginx日志每天会重新建一个文档,可以用cut之前的log到新文件下来减少新日志文件的产生。


统计pv要用到aop,否则最简单、粗暴的方法是给各个需要统计的方法开始和结尾处加的时间戳,然后差值计算结果。

import org.apache.commons.logging.Log;    

import org.apache.commons.logging.LogFactory;    

import org.aspectj.lang.ProceedingJoinPoint;    

import org.aspectj.lang.annotation.Around;    

import org.aspectj.lang.annotation.Aspect;    

import org.aspectj.lang.reflect.MethodSignature;    

import org.springframework.stereotype.Component;  

  

/**  

 * 检测方法执行耗时的spring切面类  

 * 使用@Aspect注解的类,Spring将会把它当作一个特殊的Bean(一个切面),也就是不对这个类本身进行动态代理  

 * 

 * 

 */  

@Aspect  

@Component  

public class TimeInterceptor {  

  

    private static Log logger = LogFactory.getLog(TimeInterceptor.class);  

  

    // 一分钟,即60000ms  

    private static final long ONE_MINUTE = 60000;  

  

    // service层的统计耗时切面,类型必须为final String类型的,注解里要使用的变量只能是静态常量类型的  

    public static final String POINT = "execution (* com.blinkfox.test.service.impl.*.*(..))";  

  

    /**  

     * 统计方法执行耗时Around环绕通知  

     * @param joinPoint  

     * @return  

     */  

    @Around(POINT)  

    public Object timeAround(ProceedingJoinPoint joinPoint) {  

        // 定义返回对象、得到方法需要的参数  

        Object obj = null;  

        Object[] args = joinPoint.getArgs();  

        long startTime = System.currentTimeMillis();  

  

        try {  

            obj = joinPoint.proceed(args);  

        } catch (Throwable e) {  

            logger.error("统计某方法执行耗时环绕通知出错", e);  

        }  

  

        // 获取执行的方法名  

        long endTime = System.currentTimeMillis();  

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();  

        String methodName = signature.getDeclaringTypeName() + "." + signature.getName();  

  

        // 打印耗时的信息  

        this.printExecTime(methodName, startTime, endTime);  

  

        return obj;  

    }  

  

    /**  

     * 打印方法执行耗时的信息,如果超过了一定的时间,才打印  

     * @param methodName  

     * @param startTime  

     * @param endTime  

     */  

    private void printExecTime(String methodName, long startTime, long endTime) {  

        long diffTime = endTime - startTime;  

        if (diffTime > ONE_MINUTE) {  

            logger.warn("-----" + methodName + " 方法执行耗时:" + diffTime + " ms");  

        }  

    }  

  

}  

昨天弄了下没做完。

明天计划的事情:(一定要写非常细致的内容) 

能通过aop做完db统计。

遇到的问题:(遇到什么困难,怎么解决的) 

aop

收获:(通过今天的学习,学到了什么知识)

用脚本写了简单的pv统计


返回列表 返回列表
评论

    分享到