标题:linux下常用分析日志命令 出处:沧海一粟 时间:Fri, 10 Feb 2012 11:52:51 +0000 作者:jed 地址:http://www.dzhope.com/post/864/ 内容: grep是一个很强大的命令。这里我们主要来讲使用grep命令来分析网站日志的方法和技巧。 1、合并网站日志 使用ls查看下待合并的日志 合并网站日志 cat *.log >example.log #合并后缀名为log的日志文件,你也可以合并指定的日志 2.拆分我们想要的日志文件 比如拆分百度蜘蛛的日志文件 grep "Baiduspider+" example.log >baiduspider.txt 比如拆分404错误日志 grep "404" example.log >404.txt 还可以同时拆分百度和谷歌的蜘蛛。 这里我们使用的是egrep来实现这一功能。 egrep "Baiduspider+|Googlebot" example.log >spider.txt 3、我们还可以结合awk命令来格式话我们的日志文件 awk倾向于分析一行中的字段,我们需要来看一下网站的日志格式 我们截取百度蜘蛛访问的来源IP、时间、抓取的URL、返回码和抓取的大小。 grep "Baiduspider+" example.log |awk '{print $1 "\t" $4 "\t" $7 "\t" $8 "\t" $9 "\t" $10}' >Baiduspider.txt 这里使用[tab]是为了导入excel文件中更加方便你的分析。 更新:可以不用[tab]来格式化日志,直接选择空格作为分隔符就好。 如何使用命令删选不重复的URL的,由于很多日志的参数设置不一样,具体到详细命令命令会有所不同 首先我们还是要知道蜘蛛抓取你的URL位置在你的日志记录行的位置,拿上面的图为例子 点击在新窗口中浏览此图片 http://www.dzhope.com/attachment.php?fid=65 如图,由于每条记录的时间戳等不一样,我们不能直接使用sort命令去重,再者我们需要的只是蜘蛛抓取的URL这个参数,那么我们就直接拎出$7这个URL参数后再去重。 如我们要计算蜘蛛抓取的不重复URL个数 cat access.log |grep Baiduspider+ |awk '{print $7}'|sort -u|wc 要把蜘蛛抓取的不重复URL导出来,就可以去掉wc后加上>baiduspiderurl.txt等就可以了 cat access.log |grep Baiduspider+ |awk '{print $7}'|sort -u >baiduspiderurl.txt 我们还可以在导出的时候自动给每个URL加上抓取的次数 cat access.log |grep Baiduspider+ |awk '{print $7}'|sort |uniq -c >baiduspiderurl.txt 1. grep查找匹配文本 【a】在文件中查找 $grep 'failed to initialize BeanFactory' upp-account.log 【b】查找并显示匹配行及以下的200行 $grep -A 200 'failed to initialize BeanFactory' upp-account.log 【c】查找并显示匹配行及以上的200行 $grep -B 200 'failed to initialize BeanFactory' upp-account.log 【d】查找,忽略大小写,并显示匹配行及以上的200行 $grep -i -A 200 'failed to initialize BeanFactory' upp-account.log 【Linux下日志分析的几个常用命令】 有时候我们需要对线上的应用日志做一些分析和简单的统计工作,熟悉一下Linux下文本处理的几个命令,可能会有意想不到的收获: more 查看文件内容 grep 在文件中查找 awk 文本处理 sort 排序 sed 文本处理 下面举个两个例子,说明一下这几个命令的简单应用 1、统计一下今天支付宝到淘宝、淘宝到支付宝的接口调用情况 第一步,找到日志文件路径,确定日志格式 因为接口调用走是TC,先ssh到一台tc的服务器,到日志目录下,ll 一下,看到有几个命名为alipay的日志文件,感觉是打印接口调用日志的, more alipay-notify-success.log 输出: 2009-06-29 00:00:00,421 [] INFO alipay-notify-success - *********alipay notify callback********* out_trade_no=T200P2062628786,trade_status=WAIT_BUYER_PAY,notify_action_type=createPartnerTradeAction, input: 从日志看出,这是支付宝回调淘宝接口的日志,格式包括:时间,订单号、状态、通知类型等等 more alipay.log 输出: 2009-06-29 00:00:00,072 [] INFO core.SignedTbClientInvoker - **********Payway Request and Response********* Service Name: trade_create Request URL: http://aligw.alipay.com 从日志上看,这是淘宝调用支付宝的日志,格式包括:时间,接口类型,请求内容等等 第二步,查找特征文本 需要分类型统计接口的调用次数,所以特征字符串就是接口的类型文本,使用grep 命令 grep ‘,notify_action_type’ alipay-notify-success.log 第二个日志比较特殊,特征文本单独一行,没有固定前缀或者后缀特征,而前一行是固定的”Service Name:“,可以查找前一行,然后grep输出的时候多输出一行: grep ‘Service Name:’ -A1 alipay.log grep 命令有很多可选参数,比如忽略大小写,输出前(-B before),后(-A after)行文本等等。 第三步,文本分列 通常,日志文件的一行文本,都由几列组成,中间是分隔字符串,而我们的目标就是找到需要的列,并进行相关的计算,统计,这里就需要用到 awk 命令 对于 alipay-notify-success.log 日志文件,我们使用下面命令: grep ‘,notify_action_type’ alipay-notify-success.log | awk -F’,’ ‘{a[$3]++}END{for (i in a) print i”,”a[i]}’ grep命令找到符合的行,作为awk命令的输入,-F 后面是指定分隔符号,后面是表达式,首先定义一个数组a(也可以理解为是一个map)用分隔出来的第三列作为下标(key),值每次加一,END 后面是最后执行的语句,循环输出数组 awk命令本身很强大,可以全面地看一下它帮助 第四步,排序 第三步已经完成了计算、统计工作,最后我们根据调用次数进行一下排序,方便查看 这里使用sort 命令 grep ‘,notify_action_type’ alipay-notify-success.log | awk -F’,’ ‘{a[$3]++}END{for (i in a) print i”,”a[i]}’ |sort -t, -k2 -n -r -t 跟ark的-F功能类似,是把一行文本分成几列,-k指定需要排序的列,-n表示按数字方式排序,-r 表示倒序 最后,我们看到了输出: notify_action_type=createPartnerTradeAction,52641 notify_action_type=payByAccountAction,44807 notify_action_type=sellerSendGoodsAction,43848 notify_action_type=confirmReceiveAction,40705 notify_action_type=modifyTradeAction,25733 notify_action_type=allowRefundAction,10407 notify_action_type=autoFinishTradeAction,8351 notify_action_type=closeTradeAction,8030 notify_action_type=applyRefundiiiAction,2653 notify_action_type=refundDisburseAction,2330 notify_action_type=confirmDisburseAction,401 notify_action_type=extendTimeoutLimitAction,368 notify_action_type=modifyRefundiiiAction,280 notify_action_type=cancelRefundiiiAction,52 notify_action_type=null,20 notify_action_type=unfreezeTradeAction,1 notify_action_type=refundVoucherCheckPassAction,1 notify_action_type=freezeTradeAction,1 当然这是单台机器的,根据应用的机器数量,可以大致评估一下总的情况。 类似的,对于 日志alipay.log grep ‘Service Name:’ -A1 alipay.log | sed ‘/Service Name:/’d |sed ‘/–/’d | awk -F’ ‘ ‘{a[$2]++}END{for (i in a) print i”,”a[i]}’ | sort -t, -k2 -n -r 输出: trade_create,51326 send_goods_confirm_by_platform,40716 confirmReceiveGoods,39351 modifyTradeFee,25261 cae_charge_agent,10074 close_trade,3871 extendTimeout,378 calculate_service_fee,52 union_data_prepare,15 logistic_sign_in,4 接下来,我们再看一个例子 需求:统计一下,denali机器中,我的淘宝首页 这个页面的请求次数和平均响应时间 还是分几步: 1、首先找到日志和日志格式 Apache 的访问日志,/home/admin/cai/logs/cronlog/2009/06/2002009-06-29-taobao-access_log more 2002009-06-29-taobao-access_log 输出: 58.208.1.15 148452 3251 [29/Jun/2009:00:00:04 +0800] “GET http://my.taobao.com/mytaobao/home/my_taobao.jhtml” 200 14147 “http://my.t aobao.com/mytaobao/home/my_taobao.jhtml” “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; QQDownload 551; User-agent : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;); SLCC1; .NET CLR 2.0.50727; MDDC; .NET CLR 3.5.30729; .NET CLR 3.0.30618) 2、查找特征文本 grep ‘GET http://my.taobao.com/mytaobao/home/my_taobao.jhtml’ 2009-06-29-taobao-access_log 3、文本分列 grep ‘GET http://my.taobao.com/mytaobao/home/my_taobao.jhtml’ 2009-06-29-taobao-access_log | awk -F’ ‘ ‘{i+=$2}END{print NR “,” i/NR/1000}’ Generated by Bo-blog 2.1.1 Release