俺ã¨ãã¾ãã¨perlã¯ã³ã©ã¤ãã¼
â»7å·ã®ã俺ã¨ãã¾ãã¨awkãã«ã¯ã¦ãããã£ã±ãã¤ãã¦ç¾¨ã¾ããã£ãã®ã§ã丸ãã¯ããã®ã£ããã¨ã³ããªã§ãã
ãEFK (Elasticsearch + Fluentd + Kibana) ãªãã¦çãã§ãããæ¼¢ã¯é»ã£ã¦ perl | sort | uniq -c ã§ãããã¨èª°ããè¨ã£ã¦ããããªè¨ã£ã¦ãªãã£ããããªæ°ãããã®ã§ãã°ãããæã«èªåããã使ã perl è¸ã«ã¤ãã¦æ¸ãã¾ãã
æ³å®ãã¼ã¿ãµã³ãã«
ãããªãã©ã¼ãããã§åºã TSV å½¢å¼ã® Web ã¢ããªã±ã¼ã·ã§ã³ãã°ããã£ãã¨ãã¾ãã[TAB] ã¯ã¿ãæåã§ãã
æé[TAB]ã¹ãã¼ã¿ã¹[TAB]HTTPã¡ã½ãã[TAB]URI[TAB]ãªã¯ã¨ã¹ãã¿ã¤ã
ä¾ãã°ãããªæãã§ãããã®ãã°ã perl è¸ã§å¦çãã¦ããã¾ãã
access.log
2014-12-05 12:00:00[TAB]200[TAB]GET[TAB]/api/v1/ping[TAB]0.017832 2014-12-05 12:00:01[TAB]200[TAB]POST[TAB]/api/v1/auth[TAB]1.001628 2014-12-05 12:10:00[TAB]404[TAB]GET[TAB]/favicon.ico[TAB]0.017832 2014-12-05 12:10:01[TAB]500[TAB]POST[TAB]/api/v1/login[TAB]5.00003
ï¼åãããã¢ã¯ã»ã¹éã調ã¹ã
ï¼åãããã®ã¢ã¯ã»ã¹éã¯ãããªãããã§èª¿ã¹ãããã§ãããã
$ perl -nale 'print $F[1]' access.log | perl -F: -nale 'print "$F[0]:$F[1]"' | sort | uniq -c 2 12:00 2 12:10
解説ãã¦ããã¨ãæåã® perl ã§æå»ãã£ã¼ã«ããæãåºãã¦ãã¾ãã
$ perl -nale 'print $F[1]' access.log 12:00:00 12:00:01 12:10:00 12:10:01
aãªãã·ã§ã³ã§ããã©ã«ãã®ç©ºç½æåãã¿ãæåãåºåãæåã¨ãã¦ã@Fé
åã«åãã£ã¼ã«ãã®å¤ãã»ããããã¾ãã
print $F[1]
ã®ããã«ãã¦ç¬¬2ãã£ã¼ã«ãã print ãã¦ãã¾ããä»åã®å ´åã¯æå»ã®ãã£ã¼ã«ããåºåããã¾ãã
â»å
¨ä½ã®è¡ããã¹ãã¯$_ã«æ ¼ç´ããã¾ãã
ãã¤ãã§ã¤ãªãã次㮠perl ã§ãæ:å:ç§ãããæ:åãã«å¤æãã¦ãã¾ãã -F ãªãã·ã§ã³ã使ã£ã¦åºåãæåã : ã«å¤æ´ãã第ï¼ãã£ã¼ã«ã(æ)ã:ã第ï¼ãã£ã¼ã«ã(å) ã print ãã¦ãã¾ãã
$ perl -nale 'print $F[1]' access.log | perl -F: -nale 'print "$F[0]:$F[1]"' 12:00 12:00 12:10 12:10
ãã¨ã¯æ £ç¨å¥ã¨è¨ã£ã¦ãè¯ã sort | uniq -c ã«æ¸¡ãã¦ãã¦ãã¼ã¯ãªå¤ã®æ°ãã«ã¦ã³ããã¦åºåãã¦ãã¾ãã
$ perl -nale 'print $F[1]' access.log | perl -F: -nale 'print "$F[0]:$F[1]"' | sort | uniq -c 2 12:00 2 12:10
ã¡ãªã¿ã«ãä¸ã®ä¾ã§ã¯ perl ãï¼å使ãã¾ããããperl ã«ã¯ substr
é¢æ°ãªããããã£ããããã®ã§ã以ä¸ã®ããã«ããã¨ï¼çºã§æ¸ãããããã¾ãã
使ãæ¨ã¦ã¯ã³ã©ã¤ãã¼ãªã®ã§ãè¦ããããæ¹ã使ãã°è¯ããã¨æãã¾ãã
$ perl -nale 'print substr($F[1], 0, 5)' access.log 12:00 12:00 12:10 12:10
ã¡ãªã¿ã«èªåã¯æ£è¦è¡¨ç¾ã§æãåºãäºãå¤ãã§ãã
$ perl -nale '/ (\d\d:\d\d):/;print $1' access.log 12:00 12:00 12:10 12:10
æ £ããã¨Apacheã®ããã©ã«ããã©ã¼ãããã§ããããªãã®ç²¾åº¦ã§å¿ è¦ãªå¤ãæãåºããããã«ãªãã¾ãã
$ head -1 apache_access.log 66.249.71.229 - - [06/Dec/2014:04:04:58 +0900] "GET /robots.txt HTTP/1.1" 200 202 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-" $ perl -nale '/2014:(\d\d:\d\d):.* "GET (\S+)/;print "$1 $2"' apache_access.log 04:04 /robots.txt 04:04 /index.html 05:15 /blog/?category=1
1ç§ä»¥ä¸æéãããã£ã¦ããã¢ã¯ã»ã¹ããªã¹ãã¢ãããã
ä»åã®ãã°ãã©ã¼ãããã§ã¯ãä¸çªæå¾ã®ãã£ã¼ã«ãããªã¯ã¨ã¹ãã¿ã¤ã ã§ããã ä¸çªæå¾ã®ãã£ã¼ã«ã㯠$F[-1] ã§æå®ãããã¨ãã§ãã¾ãã
$ perl -nale 'print $F[-1]' access.log 0.017832 1.001628 0.017832 5.00003
ã§ããã®ãã£ã¼ã«ãã«æ¡ä»¶ãæå®ãã¦ã1ç§ä»¥ä¸æéãããã£ã¦ããè¡ã®ã¿ãifæã§çµãæ··ãã§ã¿ã¾ãã
$ perl -nale 'print if $F[-1] > 1' access.log 2014-12-05 12:00:01 200 POST /api/v1/auth 1.001628 2014-12-05 12:10:01 500 POST /api/v1/login 5.00003
ããå°ãè¤éãªå¦çãæ¸ãå ´åã¯ãor nextçã§ãã®è¡ã®å¦çãã¹ãããããã®ãããããã§ããã
$ perl -nale '$F[-1] > 1 or next;print' access.log 2014-12-05 12:00:01 200 POST /api/v1/auth 1.001628 2014-12-05 12:10:01 500 POST /api/v1/login 5.00003
5xx ã¹ãã¼ã¿ã¹ã³ã¼ãã®ã¢ã¯ã»ã¹ããªã¹ãã¢ãããã
ã¹ãã¼ã¿ã¹ã³ã¼ã 500 ã®è¡ãæãåºãã«ã¯æ¬¡ã®ããã«ããã°ããã§ãããã
$ perl -nale 'print if $F[2] == 500' access.log 2014-12-05 12:10:01 500 POST /api/v1/login 5.00003
æ£è¦è¡¨ç¾ã使ããã¨ãã§ãã¦ã5xx ãªè¡ãæãåºãããå ´åã«ã¯æ¬¡ã®ããã«ããã°ããã§ãã
$ perl -nale 'print if $F[2] =~ /^5/' access.log 2014-12-05 12:10:01 500 POST /api/v1/login 5.00003
ãã¡ãã§ããprint $F[ãã£ã¼ã«ãçªå·]
ã¨ããã°æå®ãããã£ã¼ã«ãã ãåºåããããã¨ãã§ãã¾ãã
$ perl -nale 'print $F[4] if $F[2] =~ /^5/' access.log /api/v1/login
ãã¾ãï¼æ£è¦è¡¨ç¾ãããã¯ãã£ã¼ã«ããæå®ããªãå ´åãè¡å
¨ä½($_) ã«å¯¾ããæ£è¦è¡¨ç¾ããã($_ =~ /æ£è¦è¡¨ç¾/
)ã¨ãªãã®ã§ã以ä¸ã®ããã«æ¸ã㨠grep ã®ãããªå¹æãåºãã¾ãã
$ perl -nale 'print $F[4] if /500/' access.log 2014-12-05 12:10:01 500 POST /api/v1/login 5.00003
åè¨ãªã¯ã¨ã¹ãã¿ã¤ã ãæ±ãã
ã¢ã¯ã»ã¹ãã°ã®ãã¡åè¨ãªã¯ã¨ã¹ãã¿ã¤ã ãæ±ããã«ã¯ãã¡ãã£ã¨ããã©ãããã§ããã次ã®ããã«ãã¾ãã
$ perl -nale 'BEGIN{$sum=0};$sum += $F[-1];END{print $sum}' access.log 6.03732
å¤æ°ã¯ããã©ã«ã㧠0 ã«åæåãããã®ã§ãBEGIN{$sum=0}
ã¯çç¥å¯è½ã§ãã
æ大å¤ãæ±ãããå ´åã¯ã
$ perl -nale '$max = $F[-1] if $F[-1] > $max;END{print $max}' access.log 5.00003
ã¨ãã§ããããããã©ãããã§ãããã¾ããããªããã§ããã
ç¹å®ã®æ¡ä»¶ãã¨ã®ã¢ã¯ã»ã¹æ°ãå¹³åå¿çé度ãåè¨å¿çé度ãæ±ãã
ä¾ã¨ãã¦ã1åãã¨ã®ã¢ã¯ã»ã¹æ°ãå¹³åå¿çé度ãåè¨å¿çé度ãåºåãã¦ã¿ã¾ãã
è¤éãªä¾ã§ããããã®ãããã®å¦çããµã¯ãã¨æ¸ããã¨å種調æ»ãé害æã®åãåãã«ããªãå½¹ç«ã¡ã¾ãã
$ perl -nale '/ (\d\d:\d\d):/;$cnt{$1}++;$sum{$1}+=$F[-1];END{print join " ", ($_, $cnt{$_}, $sum{$_}/$cnt{$_}, $sum{$_}) for sort keys %cnt}' access.log 12:00 2 0.50973 1.01946 12:10 2 2.508931 5.017862
%cntã%sumã«æ½åºããæ¡ä»¶(ä»åã¯æé)ãã¨ã®ã¢ã¯ã»ã¹æ°ã¨å¿çé度ãã«ã¦ã³ãã¢ãããã¦ãããæå¾ã«ã¾ã¨ãã¦åºåãã¦ãã¾ãã
LTSV ãªãã°ãå¦çãã
æè¿ã¯ LTSV ãã©ã¼ãããã人æ°ã§ãã
ä¾ãã°ã次ã®ãã㪠LTSV ãã°ããã£ãã¨ãã¦ã
time:2014-08-13T14:10:10Z[TAB]status:200 time:2014-08-13T14:10:12Z[TAB]status:500
status ãã£ã¼ã«ãã®å¤ã ãã perl ã§æãåºããã¨ããã¨ãããªãããã«ãªãã§ããããã
$ perl -F'\t' -nale 'for(@F){($k, $v) = split(":", $_, 2);$h{$k} = $v};print $h{status}' ltsv.log 200 500
ãLTSVãã°ããã¼ã¹ããæå¼·ã®ã¯ã³ã©ã¤ãã¼éãã«ã¯ä»¥ä¸ã®ãããªè¨æ³ãç´¹ä»ããã¦ãã¾ãã
$ perl -F'\t' -nale '%h=map{split/:/,$_,2}@F;print $h{status}' ltsv.log 200 500
çªå¤ç·¨ï¼sedã®ä»£ããã«ä½¿ã
nãªãã·ã§ã³ã®ä»£ããã«pãªãã·ã§ã³ã使ã£ã¦ãå¼æ°ã«så¼ã渡ãã¨sedã¨åãããã«ä½¿ãã¾ãã
$ perl -pe 's/\tstatus:\d+$//' ltsv.log time:2014-08-13T14:10:10Z time:2014-08-13T14:10:12Z
perläºæã®æ£è¦è¡¨ç¾ã使ããã®ã§é常ã«ä¾¿å©ã§ãã iãªãã·ã§ã³ãªã©ãåãããã«ä½¿ãã¾ãã
ãããã«
ããã¼ãperl ãµã¤ã³ã¼ã§ããããã°ãææã¡ã§ perl ã³ãã³ãæã£ã¦éè¨ãããªãã¦å¹¸ãããã¦æ³£ãã¦ãã¾ãããEnjoy happy perl life!