日志快速筛选 之 linux命令grep|uniq|wc|awk
以前我个人的观念是,在线上运行的东西尽量不要记什么流水日志。
但是后来我变了,发现在线上记日志是一个绝对有必要的东西,尤其是在当下很流行的微服务的推动下,没有日志的帮助,犹如一个睁眼瞎,排查问题基本靠猜,这可不行。
那就打印记录每次的访问日志,尤其是访问接口时的参数及返回数据和耗费时间等,这是对自己将问题抛给上层及性能优化的依据。但是日志量应该是非常大的,一定要注意及时清理。
那么问题来了,当发现问题时,如何快速定位到错误的地方就很重要了。
日志样例如下(某次访问的产生的日志):
[-- ::] New request@ip: 112.65.141.22
[-- ::] New request@ip: 112.65.141.22 param: <xml><ToUserName><![CDATA[gh_27923assff]]></ToUserName> <FromUserName><![CDATA[osj3ut7w0VqGU-6k1WssdmAQPVU]]></FromUserName> <CreateTime>
</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[http://satwx.ddd.com/wap]]></Content> <MsgId>6375392430314143735</MsgId> </xml>
[-- ::] cat@http://192.168.1.125:30008/eagleeye/monitor/logEvent @visit, msg=> New request@ip: 112.65.141.22 ...
[-- ::] api begin: [get] http://192.168.1.11:40003/micsite/api/ss/microsite/1.1/wchat/getAcken?wchatName=wx477026f155386
[-- ::] api end: cost: 0.0081648826599121 sec,return data: {"error":"","msg":"无该公众账号的accessToken信息 !","status":""}
[-- ::] get token error [code:status ]: {"error":"","msg":"无该公众账号的accessToken信息 !","status":""}
[-- ::] api begin: [get] https://api.weixin.qq.com/cgi-bin/user/info?access_token=&openid=osj3ut7w0VqGU-6k1WHVi5mAQPVU&lang=zh_CN
[-- ::] api end: cost: 0.08442211151123 sec,return data: {"errcode":,"errmsg":"access_token missing hint: [ohHxoa0723vr30!]"}
[-- ::] get UnionId error: {"errcode":,"errmsg":"access_token missing hint: [ohHxoa0723vr30!]"}
[-- ::] POST https://a1.easemob.com/ddd/xyytest/token {"grant_type":"client_credentials","client_id":"YXA6895cUK3_EeW3YsEU_isqRQ","client_secret":"YXA61QdxmD9yvNcxd9zaHrcmFfTRZ3M"}
[-- ::] return data: {"access_token":"YWMtf7ebhtFWEeaBVquozfw40QAAAA3A67AAAAAAHz3lxQrf8R5bdiwR4FZYgHzdwBPGgDdng322dddssvrzggb2_tQflF-cf4FEO07WzyZJuEQ","expires_in":,"app
lication":"f3de5c50-adff-11e5-b762-c114fe2b2a45"} , cost: 0.19826197624207 sec
[-- ::] POST https://a1.easemob.com/dd/xyytest/messages {"target_type":"users","target":["custom"],"msg":{"type":"txt","msg":"http:\/\/satwx.test.com\/wap"},"from":"hx_callback","ext"
:{"weichat":{"visitor":{"source":"weixin","msgId":"","openid":"osj3ut7w0VqGU-6k1WHVi5mAQPVU","mp":"wx812302f2923a0e2f","userNickname":null}}}}
[-- ::] return data: {"action" : "post","application" : "f3de5c50-adff-11e5-b762-c114fe2b2a45", "path" : "/messages"} , cost: 0.15990281105042 sec
[-- ::] output: (empty)
[-- ::] ---- 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 + -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异常,加内存或者优化代码解决。
日志快速筛选 之 linux命令grep|uniq|wc|awk的更多相关文章
- linux 命令grep
linux 命令grep grep命令用来搜索文本,或从给定的文件中搜索行内包含了给定字符串或单词的文件.通常来说,grep显示匹配的行.使用grep来搜索包括一个或多个正则表达式匹配到的文本行,然后 ...
- 【linux】linux命令grep + awk 详解
linux命令grep + awk 详解 grep:https://www.cnblogs.com/flyor/p/6411140.html awk:https://www.cnblogs.com ...
- 菜鸟学Linux命令:grep配合ls等使用
linux grep命令 (global search regular expression(RE) and print out the line )是一种强大的文本搜索工具,它能使用正则表达式搜索文 ...
- Linux 命令 - grep: 正则搜索文本
grep 搜索文本文件中与指定正则表达式匹配的行 命令格式 grep [OPTIONS] PATTERN [FILE...] 命令参数 Generic Program Information --he ...
- 实例解说Linux命令行uniq
Linux命令uniq的作用是过滤重复部分显示文件内容,这个命令读取输入文件,并比较相邻的行.在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的.该命令加工后的结果 ...
- 初探日志分析常用的linux命令
了解linux常用命令,有助于提升我们的生产力,提升工作效率,更快速地定位问题,当然也是为了更好地解决问题.这两天,趁着在家办公的时间,我把linux系统中常用的命令整理了一下,主要涉及到查找.查看, ...
- (转)Linux命令grep
场景:grep命令在文件搜索中经常会使用到,所以熟练掌握该命令对于日常日志搜索相当有必要! Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.g ...
- [ Linux 命令 ] grep
一.grep是什么? Linux grep命令是用于查找文件里符合条件行的shell命令. 二.为什么要使用grep? 在查找文件内容时候,通过使用grep指定条件,可以快速定位到文件里字符串所在的行 ...
- Linux 命令——grep | 正则表达式
感觉讲的很详细,瞬间懂了grep,正则. from: here 简介 grep (global search regular expression(RE) and print out the line ...
随机推荐
- jmeter参数化之CSV Data Set Config
在jmeter中,可以用CSV Data Set Config实现参数化. 1.准备参数化数据
- Visual Studio 单元测试之三---压力测试
原文:Visual Studio 单元测试之三---压力测试 我们都知道大名鼎鼎的LoadRuner,但是很少有人知道Visual Studio自带的Test也可以做些简单的压力测试,下面我们就介绍一 ...
- openwrt的GPIO控制
为什么有些GPIO可以在/sys/class/gpio中控制,而有些不行呢? 先来看一看普通不需要C程序而是使用脚本的控制方法(Linux普遍适用): First step is making GPI ...
- 解决wps for linux 中文输入法光标不跟随的问题
需要安装qt4-qtconfig和ibus-qt4,安装ibus-qt4之后才能在qt4-qtconfig“界面”选项卡默认输入法选项中看到ibus,选定它,然后设置XIM输入风格为光标跟随风格,保存 ...
- proguard android迷茫
我们收拾它意味着蛊惑项目即将结束.上线.但是,当这个问题就更烦躁人,我也记录因混乱中遇到的问题 首先,我在装android4.0封装版本,有没有在这个文件查看器项目 假设有,请继续点击进入projec ...
- js面向对象学习总结
1.函数作为参数进行传递 function a(str,fun){ console.log(fun(str)) }; function up(str){ return str.toUpperCase( ...
- xheditor 进阶
xhEditor提供两种方式初始化编辑器: 方法1:利用class属性来初始化和传递各种初始化参数,例: class="xheditor {skin:'default'}" 方法 ...
- TodoList开发笔记 – Part Ⅳ
跌跌撞撞总算是把客户端开发好了,后台的代码因为不复杂,就写了些单元测试跑一跑就算通过了,大部分时间都是在调整脚本. 这一节开始部署TodoList项目. 一.了解IIS(Internet Infoma ...
- jquery扩展方法案例
-----------------扩展方法: $.extend({ "max": function (a, b) { if (a > b) return a; }, &quo ...
- viewstate cookie和session原理回顾
--个人理解会存在些错误仅供参考!!! ----浏览器保持会话状态原理 用户发送一次请求,服务器端会检索报文中是否存在sessionid不存在,就分配一个写到cookie当中,存在浏览器的缓存中,当再 ...