0%

公司没有日志采集平台,又不太可能在业务系统里面搞事情。好在之前有玩过elk日志分析组合。直接从服务器上面撸出日志简单的用linux命令分析下吧。

Ngxin 日志格式化

  • Nginx提供的访问日志里就蕴藏着大量有用信息。今天这篇要说的就是如果修改Nginx默认日志格式,以便于我们更好的挖掘有效指标。

编辑/etc/nginx.conf配置文件,在日志部分添加下面两段代码,编辑完成后重启Nginx服务即可。

1
2
3
4
log_format main '$host - $remote_addr - [$time_local] "$request" '
'$status $upstream_response_time $request_time "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for" $body_bytes_sent ';
access_log /var/log/nginx/access.log main;

简单罗列一下变量的含义:

  • $host 访问域名
  • $remote_addr 客户端IP地址
  • $time_local 访问时间
  • $status 访问状态码
  • $upstream_response_time 应用返回到Nginx的时间
  • $request_time 请求时间
  • $http_referer 请求来源
  • $http_user_agent 访问客户端
  • $http_x_forwarded_for 客户端IP地址
  • $body_bytes_sent 返回给客户端大小

在server中不生效的问题

  • 在server中增加 access_log /var/log/nginx/access.log main;

日期显示问题

  • [01/Jul/2020:03:25:17 +0800] 官方默认是这种

  • 修改默认格式

1
2
3
4
log_format main '$host - $remote_addr - [$time_iso8601] "$request" '
'$status $upstream_response_time $request_time "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for" $body_bytes_sent ';
access_log /var/log/nginx/access.log main;
  • 在server中增加下面代码
1
2
3
4
5
6
7
8
9
10
11
12
server {

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
set $minutes $5;
set $seconds $6;
}

}

Nginx日志统计

(日志文件叫access.log 在当前目录下)

统计 PV,就是日志行数

cat access.log |wc -l

UV, 即是统计 IP 数

cat access.log |awk '{print $1}' |sort |uniq -c |wc -l

使用linux grep 进行统计

grep -E "POST|GET" access.log | awk -F '"' '{print $2,$3}' | awk '{print $2}'| sort | uniq -c | sort -k1nr | head -100

耗时的请求发生时间、所请求的 URI 和耗时

cat access.log | awk '{print $4,$7,$10,$NF}' | sort -k3 -nr | head -100

统计nginx访问频次最高的100Ip**

grep -E "POST|GET" access.log | awk -F '"' '{print $(NF-1)}' | sort | uniq -c | sort -k1nr | head -100

统计nginx访问不正常(状态码400+)的前100url和频次

grep -E "POST|GET" access.log | awk -F '"' '{print $2,$3}' | awk '{if ($4>="400") {print $4,$1,$2}}' | sort | uniq -c | sort -k1nr | head -100

统计nginx访问状态码非200的前100个url和频次**

grep -E "POST|GET" access.log | awk -F '"' '{print $2,$3}' | awk '{if ($4!=200) {print $4,$1,$2}}' | sort | uniq -c | sort -k1nr | head -100

不同 URI 的平均耗时

grep -E "POST|GET" access.log | awk '{s[$10] += $NF;c[$10]++}END{for(i in s){print i,s[i]/c[i]}}' |sort -k2 -nr | head

每秒请求量统计

统计每秒的请求数,top100的时间点(精确到秒)

grep -E "POST|GET" access.log | awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100

每分钟请求量统计

统计每分钟的请求数,top100的时间点(精确到分钟)

grep -E "POST|GET" access.log | awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

每小时请求量统计

统计每小时的请求数,top100的时间点(精确到小时)

grep -E "POST|GET" access.log | awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

统计蜘蛛抓取次数

grep 'Baiduspider' access.log |wc -l

好久没更新博客,最近公司让我出一个代码规范,我吓了一跳。赶忙翻出阿里《 码出高效》,不敢造次,我就补充点个人的想法吧。代码是给人看的。代码风格应该遵循极简主义

写好代码

  • 可维护性(maintainability)
    • 所谓的“维护”无外乎就是修改 bug、修改老的代码、添加新的代码之类的工作。所谓“代码易维护”就是指,在不破坏原有代码设计、不引入新的 bug 的情况下,能够快速地修改或者添加代码。
  • 可读性(readability)
    • 我们在编写代码的时候,时刻要考虑到代码是否易读、易理解。除此之外,代码的可读性在非常大程度上会影响代码的可维护性。
  • 可扩展性(extensibility)
    • 我们在不修改或少量修改原有代码的情况下,通过扩展的方式添加新的功能代码。说直白点就是,代码预留了一些功能扩展点,你可以把新功能代码,直接插到扩展点上,而不需要因为要添加一个功能而大动干戈,改动大量的原始代码。
  • 灵活性(flexibility)
    • 灵活性是一个挺抽象的评价标准。如果一段代码易扩展、易复用或者易用,我们都可以称这段代码写得比较灵活。
  • 简洁性(simplicity)
    • KISS 原则:“Keep It Simple,Stupid”。这个原则说的意思就是,尽量保持代码简单。代码简单、逻辑清晰,也就意味着易读、易维护。我们在编写代码的时候,往往也会把简单、清晰放到首位。
  • 可复用性(reusability)
    • 代码的可复用性可以简单地理解为,尽量减少重复代码的编写,复用已有的代码。在后面的很多章节中,我们都会经常提到“可复用性”这一代码评价标准。
  • 可测试性(testability)
    • 代码的可测试性差,比较难写单元测试,那基本上就能说明代码设计得有问题。

避免复杂、追求简单

日常开发中,除了解决业务问题还需要解决许多的工程问题。如何选择当下合适的方法解决问题;需要不断尝试和摸索,没有最好的方法只有更好的方法。

合理平滑的处理技术债务

技术的演变速度太快,如何避免长时间的技术债务是非常严重的问题,总之弊大于利。尽可能保持轻装上阵,避免拖油瓶项目。

关键字:

  • 一方库: 本工程内部子项目模块依赖的库(jar 包)。
  • 二方库: 公司内部发布到中央仓库,可供公司内部其它应用依赖的库(jar包)。
  • 三方库: 公司之外的开源库(jar 包)。

『避免过度封装』

特别是没有完整的技术人员编制的情况下,怎么简单怎么处理(去除中间商赚差价一个道理。)避免过度开发一方库;建议使用原生方式(综合评估代码量)避免框架过度封装。(Java的方法调用链过长是出了名的恶心)

『避免代码过度重复』

每次开发业务都会写很多的代码。定期对公司项目进行基础代码的重构。合理的拆分业务无关的基础代码

『避免版本混乱』

使用统一的版本管理。约束所有的项目jar版本依赖。防止因为过度使用三方库出现奇怪的bug。公司bom需要单独处理。尽量保持与社区版本同步,比如springboot最新版是2.1.3 ,那么公司使用的版本最好是近半年的GA版本。

『物极必反』

请勿过度依赖某框架栈或者解决方式,客观的对比相关解决方案优缺点。

『选择大于努力』

集中精力掌握核心知识。按照目前技术演变的速度,更新最快的是应用技术,其次是行业规范相关技术。最后才是革命性的技术。

阅读全文 »

有必要记录下自己常用的插件,避免特殊事件的发生。

MybatisX

Mybatis 插件,可以定位java和xml关系。通过java接口快速生成相关xml文件或者方法。

Mybaits Log plugin

使用插件将mybaits默认的日志输出转换成可以运行的sql日志。

Alibaba-java-coding-guidelines

阿里巴巴java代码检查工具

jclasslib bytecode viewer

byte字节码查看

json2pojo

json转bean的工具

PlantUML integration

画图的软件

SequenceDiagram

时序图

Translation

翻译

查看某个方法被调用的地方。(鼠标选中方法名称)

Navigate | Call Hierarchy 快捷键control + option + h

Genterate 代码生成

Code | Genterate #快捷键 command + n

Edit | Copyright | Copyright profiles

  • 样板
1
2
3
Copyright (c) $today.year  
@Author:z201.coding@gamil.com
@LastModified:$today.format("yyyy-MM-dd")
阅读全文 »

0x00 阅读源代码

长达9天的断网终于结束了。

下载源代码

  • 代码仓库地址 https://gitee.com/Z201/skywalking.git
  • 阅读版本号 v6.0.0-GA
  • 下载版本git clone -b v6.0.0-GA https://github.com/apache/skywalking.git
    • 由于github下载速度是在太慢了,这里用gitee克隆一个镜像。
    • 下载版本git clone -b v6.0.0-GA https://gitee.com/Z201/skywalking.git

查看源代码结构

源码设计子项目过多,这里简单暂时2级目录。

1
2
3
4
5
6
7
tree -d L 2
.
├── src
│ ├── main # 源代码
│ ├── site # 站点稳当
│ └── test # 单元测试
└── travis # 官方的ci集成
  • 查看项目源码主目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜  skywalking git:(8b638258b) tree -d -L 1
.
├── apm-application-toolkit
├── apm-checkstyle
├── apm-commons
├── apm-dist
├── apm-protocol # pd文件
├── apm-sniffer # 插件
├── apm-webapp
├── docker
├── docs
├── licenses
├── oap-server # 这里和5.x 有很大的不同改动了很多东西。
├── skywalking-ui
└── tools
  • 将项目导入idea中。

官方文档:如何构建

git submodule init

git submodule update

1
2
3
4
5
6
7
8
9
10
11
12
➜  skywalking git:(8b638258b) git submodule init
Submodule 'apm-protocol/apm-network/src/main/proto' (https://github.com/apache/incubator-skywalking-data-collect-protocol.git) registered for path 'apm-protocol/apm-network/src/main/proto'
Submodule 'oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol' (https://github.com/apache/incubator-skywalking-query-protocol.git) registered for path 'oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol'
Submodule 'skywalking-ui' (https://github.com/apache/incubator-skywalking-ui) registered for path 'skywalking-ui'
➜ skywalking git:(8b638258b) git submodule update
Cloning into '/Users/zengqingfeng/word/source-code/skywalking/apm-protocol/apm-network/src/main/proto'...
Cloning into '/Users/zengqingfeng/word/source-code/skywalking/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol'...
Cloning into '/Users/zengqingfeng/word/source-code/skywalking/skywalking-ui'...
Submodule path 'apm-protocol/apm-network/src/main/proto': checked out 'b66fa070fd647662f06497e4ed3657eb258cb6e9'
Submodule path 'oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol': checked out 'c65a23bd6b9bba8d1df30d4de261624952df2b7b'
Submodule path 'skywalking-ui': checked out 'c44642f73b9f73a54b0d716cade5094304e1a67b'

clean package -DskipTests

这个时候慢慢等吧v6.0.0-GA有120个子项目。更新完之后导入IDEA就好了。

END

最近在看项目的时候发现一个临时问题,就是redis.timeout设置0依然超时的问题。

  • 代码适用版本 jedis:2.9.0 , org.springframework.data.redis:1.8.1

timeout设置0的问题

spring.redis.timeout =0 如果设置成0 redis默认超时时间就是2秒.

根据debug发现设置0点时候依然是2000毫秒。

根据初始化方法找到的原因。

这里可以看到,当timeout设置0点时候不会被赋值。

END