日志快速筛选 之 linux命令grep|uniq|wc|awk

  以前我个人的观念是,在线上运行的东西尽量不要记什么流水日志。

  但是后来我变了,发现在线上记日志是一个绝对有必要的东西,尤其是在当下很流行的微服务的推动下,没有日志的帮助,犹如一个睁眼瞎,排查问题基本靠猜,这可不行。

  那就打印记录每次的访问日志,尤其是访问接口时的参数及返回数据和耗费时间等,这是对自己将问题抛给上层及性能优化的依据。但是日志量应该是非常大的,一定要注意及时清理。

  那么问题来了,当发现问题时,如何快速定位到错误的地方就很重要了。

日志样例如下(某次访问的产生的日志):

[2017-01-14 17:38:44]  New [email protected]: 112.65.141.22
[2017-01-14 17:38:44]  New [email protected]: 112.65.141.22 param: <xml><ToUserName><![CDATA[gh_27923assff]]></ToUserName> <FromUserName><![CDATA[osj3ut7w0VqGU-6k1WssdmAQPVU]]></FromUserName> <CreateTime>1484386723
</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[http://satwx.ddd.com/wap]]></Content> <MsgId>6375392430314143735</MsgId> </xml>
[2017-01-14 17:38:44]  cat@http://192.168.1.125:30008/eagleeye/monitor/logEvent @visit, msg=> New [email protected]: 112.65.141.22 ...
[2017-01-14 17:38:44]  api begin: [get] http://192.168.1.11:40003/micsite/api/ss/microsite/1.1/wchat/getAcken?wchatName=wx477026f155386
[2017-01-14 17:38:44]  api end: cost: 0.0081648826599121 sec,return data: {"error":"4000063","msg":"无该公众账号的accessToken信息 !","status":"0"}
[2017-01-14 17:38:44]  get token error [code:status 0]: {"error":"4000063","msg":"无该公众账号的accessToken信息 !","status":"0"}
[2017-01-14 17:38:44]  api begin: [get] https://api.weixin.qq.com/cgi-bin/user/info?access_token=&openid=osj3ut7w0VqGU-6k1WHVi5mAQPVU&lang=zh_CN
[2017-01-14 17:38:44]  api end: cost: 0.08442211151123 sec,return data: {"errcode":41001,"errmsg":"access_token missing hint: [ohHxoa0723vr30!]"}
[2017-01-14 17:38:44]  get UnionId error: {"errcode":41001,"errmsg":"access_token missing hint: [ohHxoa0723vr30!]"}
[2017-01-14 17:38:45]  POST  https://a1.easemob.com/ddd/xyytest/token {"grant_type":"client_credentials","client_id":"YXA6895cUK3_EeW3YsEU_isqRQ","client_secret":"YXA61QdxmD9yvNcxd9zaHrcmFfTRZ3M"}
[2017-01-14 17:38:45]  return data: {"access_token":"YWMtf7ebhtFWEeaBVquozfw40QAAAA3A67AAAAAAHz3lxQrf8R5bdiwR4FZYgHzdwBPGgDdng322dddssvrzggb2_tQflF-cf4FEO07WzyZJuEQ","expires_in":4205288,"app
lication":"f3de5c50-adff-11e5-b762-c114fe2b2a45"} , cost: 0.19826197624207 sec
[2017-01-14 17:38:45]  POST  https://a1.easemob.com/dd/xyytest/messages {"target_type":"users","target":["custom"],"msg":{"type":"txt","msg":"http:\/\/satwx.shoujidai.com\/wap"},"from":"hx_callback","ext"
:{"weichat":{"visitor":{"source":"weixin","msgId":"6375392430314143735","openid":"osj3ut7w0VqGU-6k1WHVi5mAQPVU","mp":"wx812302f2923a0e2f","userNickname":null}}}}
[2017-01-14 17:38:45]  return data: {"action" : "post","application" : "f3de5c50-adff-11e5-b762-c114fe2b2a45", "path" : "/messages"} , cost: 0.15990281105042 sec
[2017-01-14 17:38:45]  output: (empty)
[2017-01-14 17:38:45]  ---- This time cost: 0.52057886123657 sec ----

问题1、我想查看有多少独立访问了这台机器?(可能有多天的访问日志)

grep -n -E "\[2017-01-14 [0-9]{2}:[0-9]{2}:[0-9]{2}\] [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" *log | awk ‘{if(!ip[$3]++) print $3 " ===> " $1 " " $2 " "  $4;}‘ | sort | uniq | less

  想要统计总共有多少ip时,只需后接一个wc -l 的管道命令即可:

cat a.log | wc -l

问题2、发现某个外网接口慢了,怎样查看该接口慢的地方都有哪些?

grep -A1 -n "api.weixin.qq.com/cgi-bin/" *.log | grep -v "api.weixin.qq.com" | awk ‘$6 > 5‘ | less     #grep -v 是将接口访问栏给去掉,只留下时间记录行,过滤出访问时间大于5秒的日志
. | wc -l  #统计总共有多少地方

问题3、假设有错误产生,但是不确定访问是否访问到该机器,是否可以同时看到访问日志与错误日志?

tail -f access_log error_log   # 将访问日志与错误日志同时动态打印出来,如果同时出现则证明访问到该机器且可查看错误

问题4、如何清理日志?用crontab运行定时cron脚本。crontab -e

FilePath=/data/log
find FilePath -mtime +3 -name ‘*.log‘  -exec rm -rf {} \; 

问题5、临时检查某接口是否通畅?使用curl命令

curl -i http://coe.test.com:8080/micro_site/api/user/info  #加-i参加可返回头信息,更多命令可查看帮助文档
ping coe.test.com  #直接看该域名是否可用
telnet coe.test.com #如果需要,也可以使用telnet命令

问题6、使用docker容器进行管理测试环境,一些简单的docker 命令应该知晓

docker ps | grep myserver    #查看docker 进程,过滤想要的行,如查看映射端口及完全的镜像名称
docker exec -it myserver /bin/bash      #进入自己的docker 容器

问题7、其他技巧?

netstat -tunlp          #查看网络端口监听情况,以确定服务器是否有问题
ps -ef | grep httpd    #查看进程相关 pstree 更生动
grep -F -f a.txt b.txt  #求文件交集
sort a.txt b.txt | uniq -d  #求两文件交集
sort a.txt b.txt b.txt | uniq -u   #求两文件不重复的项

说到日志筛选,其实只是想定位到问题在哪里,在这里就多了几句,以备后用吧!

对于php解释型语言,调试起来相对方便,直接在服务器上改掉进行尝试即可,但是也有一个坏处就是没有编译器来给你检查代码,会隐藏一些语法错误。一般来说,将访问日志与错误日志一起打印会让你快速解决问题。语法错误相对好解决,逻辑错误则需要定位代码位置,仔细分析才能解决。

对于像java一类的编译型语言,调试则相对麻烦一些。一般在改动很小或者一两个文件的时候,可以直接通过替换.class文件的方式,重启服务器进行快速调试,但是对于多个文件的更改基本上就得重新打包上传了。.war包的class文件可以方便的通过ftp工作替换,而.jar包则麻烦些,需先将服务器上的jar包下载至本地,用压缩工具打开后,直接替换class文件后,再将整个jar包上传即可。java的日志相对会比较大,所以清理文件会更多或更频繁。

使用svn, git等工具进行代码管理很方便,但有时提交文件修改时,容易忘记添加的文件,多半会引起ClassNotFoundException,快速搞定。

对于NullPointerException异常,找到引发错误的行,观察是哪个变量可能引起该错误,可能是接口响应,可能是数据库问题。

对于OutOfMemoryError异常,加内存或者优化代码解决。

时间: 2024-10-12 17:46:39

日志快速筛选 之 linux命令grep|uniq|wc|awk的相关文章

Linux 命令grep, egrep,正则表达式大全

Linux grep 命令     Linux系统中grep,egrep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户. 1.grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本. 2.egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本. 3.fgrep : 快速grep,这个版

linux 命令grep正则表达式

Linux 命令grep正则表达式 在linux里面有处理文本的三剑,现在我要说的就是grep正则表达式的使用,正则表达式只是一种表示法,只要工具支持这种表示法,那么该工具就可以处理正则表达式的字符串.vi grep ,awk ,sed 等都支持正则表达式..正则表达式有基本正则表达式和扩展正则表达式. grep默认就是基本表达式. 基本正则表达式: 默认匹配次数:贪婪模式,尽可能多的去匹配. 扩展正则表达式:基于基本正则表达式多加了一些功能,基本一样. 1. grep命令 grep [参数]

linux 命令grep

grep命令用来搜索文本,或从给定的文件中搜索行内包含了给定字符串或单词的文件.通常来说,grep显示匹配的行.使用grep来搜索包括一个或多个正则表达式匹配到的文本行,然后只显示匹配到的行. grep命令的语法: grep  ‘word’  文件名 grep  ‘word’  文件1  文件2  文件3 grep  ‘字符串1  字符串2’  文件名 commad  |  grep  ‘ 某个东西 ’ commad  选项1  |  grep  ‘ 数据 ’ grep  --color  ‘数

Linux 命令 - grep: print lines matching a pattern

grep 搜索文本文件中与指定正则表达式匹配的行 命令格式 grep [OPTIONS] PATTERN [FILE...] 命令参数 Generic Program Information --help 打印帮助信息 -V, --version 打印版本信息 Matcher Selection -E, --extended-regexp 使用基本正则表达式(ERE)解释 PATTERN -F, --fixed-strings 每个模式作为一组固定字符串对待(以新行分隔),而不作为正则表达式.

每天一个linux命令-grep

Linux中grep命令是一个强大的文本搜索工具,它能使用正则表达式匹配文件,并将匹配的内容进行打印输出.grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来),他的使用权限是所有用户. 命令格式 grep [option] pattern filename 命令参数 -a,--text : 不要忽略二进制数据 -A,--after-context=NUM: 除了显示符合范本样式的那一列

Linux命令总结--uniq命令

Linux uniq 命令 Linux 命令大全 Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用. uniq 可检查文本文件中重复出现的行列. 语法 uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件] 参数: -c或--count 在每列旁边显示该行重复出现的次数. -d或--repeated 仅显示重复出现的行列. -f<栏

Linux命令学习(33) wc命令

Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数.字数.行数,并将统计结果显示输出.该命令统计指定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也给出所指定文件的总统计数. 3.命令参数: -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能与 -c 标志一起使用. -w 统计字数.一个字被定义为由空白.

linux命令——grep

在上一个命令中,我们知道可以使用cat来查看文本文件的内容,但是有的时候我们不是需要查看全部内容,而是需要查看包含某些信息的一行,如在渗透中我们需要查看某些配置文件中是否包含一些敏感信息,如密码信息,数据库连接信息等,就可以通过使用grep来进行快速查看我们需要查看的内容了! 使用语法如下: grep 查找内容 要查找内容的文件 如果查找内容中包含空格,那么需要加单引号',如:grep 'test hh' filenema,另外可以在多个文件中进行查找,直接在后面继续添加文件名即可! [emai

Linux 命令——grep | 正则表达式

感觉讲的很详细,瞬间懂了grep,正则. from: here 简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. Unix的grep家族包括grep.egrep和fgrep.egrep和fgrep的命令只跟grep有很小不同.egrep是grep的扩展,支持更多的re元字符, fgrep就是fixe