发表于: 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统计
评论