zoukankan      html  css  js  c++  java
  • 使用脚本命令监控站点日志

    以下的内容是使用linux/unix作为站点的朋友一定要懂的方法。尽管有N多中工具用于分析比如apache、nginx的訪问日志。可是。不论什么一种都没有linux内置命令来的高效、灵活。比如:当你的图形化系统不起作用的时候(黑客攻击?!),手里掌握一些监控、分析日志的脚本显的尤为重要!以下的代码能够监控近期的訪客日志,相当实用。
    一、实时过滤日志
    使用 tail -f 命令能够查看日志文件近期新增的部分。只是,实际应用中会存在一些麻烦。你会发现输出了一大堆内容占满了整个屏幕。有必要格式化一下这些内容^_^。脚本例如以下:
     
    #须要将脚本保存起来, $COLUMNS 变量才会有效
    #注意: -n10 表示显示最后10行内容,能够自己改动
    deny="`tput bold; tput setaf 1`" #亮红
    high="`tput bold; tput setaf 3`" #亮黄
    norm="`tput sgr0`"
    tail "$@" -s.1 -f access_log |
    grep -Ev --line-buffered -f agents_to_ignore -f files_to_ignore |
    sed -u "s/(.*) - [[^]]*](.*)/12/" | #过滤掉一些字段
    #分析google蜘蛛訪问
    sed -u
    's#(.*) "http://www.(google.[^/]*).*[?&_]q=([^&"]*)[^"]*"#1 "2 (3)" #' |
    #过滤不须要的内容
    sed -u 's/ HTTP/1.[01]//;
    s/.NET CLR [0-9.]*//g;
    s/Gecko/[0-9]*//;
    s/rv:[0-9.]*//;
    s/Mozilla/[0-9.]* //' |
    sed -u "s/^/ /; s/^ *([ 0-9.]{15,}) -/1/" | #对齐IP地址
    sed -u "s/(.{$COLUMNS}).*/1/" | #保证输出行宽度统一
    #高亮显示 referrer行
    sed -u "
    s/([^"]*"[^"]*" 40[34] [0-9]* ")([^"]*)(".*)/1$deny2$norm3/;t;
    s/([^"]*"[^"]*" [0-9 -]* ")([^"]*)(".*)/1$high2$norm3/;t;
    "
     

    保存为 tail_access_log 脚本取代tail命令。


    二、最近日志高效监控脚本
    假设站点流量非常大的话。日志文件是相当庞大的。

    分析这些日志的时候就须要小心处理了,比如:笔者的訪问日志已经有700多MB了,一次性读取的化会相当的慢。通常我们使用 tac 命令读取文件最后一部分内容,sed 命令用于结束读取。

    脚本例如以下:
     
    #!/bin/sh
    # 返回近期N天内 "NCSA" 格式的 HTTP 日志
    days=$1
    log="$2"
    export LANG=C #加速
    export TZ=UTC0
    last_log_date=`tail -1 "$log" |
    sed 's#.*[([^:]*):([^ ]*) .*#1 2#g' |
    tr '/' ' '`
    yesterday=`date --date="$last_log_date $days day ago" +"%d/%b/%Y:%H:%M"`
    #间隔周期10分钟
    yesterday=`echo $yesterday | cut -b-16`
    yesterday="$yesterday[0-9]"
    tac "$log" | sed "#$yesterday#Q"
     
    相同将脚本保存为get_last_days [天数] [文件名称]。就可以使用。


    讲了这个这么多以下来段实例。一般。我们可能会感兴趣会有哪些用户订阅了我们的rss种子。已经採用何种方式订阅的。skyfeed、google等等。


     
    #!/bin/sh
    export LANG=C #加速
    feed="/feed/rss2.xml"
    #查看一周内订阅rss的用户的訪问情况
    ./get_last_days 7 access_log |
    #过滤rss feed url
    grep -F "GET $feed" |
    #剔除通过refer訪问rss的网站
    grep -vE "pixelbeat.org.*(rv:|MSIE|AppleWebKit/|Konqueror|Opera) .* " |
    #获取 ip地址 & 浏览器情况
    sed 's/([0-9]*.[0-9]*).[0-9]*.[0-9]* .*"([^"]*)"$/1 2/' |
    #依据浏览器、用户网段进行排序
    sort -k2 -k1,1 |
    #合并
    uniq -c |
    #忽略单个请求
    grep -vE " 1 .*(rv:|MSIE|AppleWebKit/|Konqueror|Opera).*" |
    #忽略机器人訪问
    grep -vE -f agents_to_ignore |
    #合并订阅用户
    sed '
    s/([^ ]) .*Firefox.*/1 Firefox/;
    s/([^ ]) .*MSIE 7.0.*/1 IE7/;
    s/([^ ]) .*Opera.*/1 Opera/;
    s/([^ ]) .*Akregator.*/1 Akregator/;
    s/([^ ]) .*Thunderbird.*/1 Thunderbird/;
    s/([^ ]) .*Liferea.*/1 Liferea/;
    s/([^ ]) .*Google Desktop.*/1 Google Desktop/;
    ' |
    #显示浏览器类型
    cut -d"`echo -e ' '`" -f2 |
    #分组
    sort |
    #计数
    uniq -c |
    #识别使用google订阅的用户
    sed 's/(.*)(feedfetcher.html)(.*)id=([0-9]*).*/12.43/' |
    #计数
    sed 's/ *[0-9]* .*(http[^;]*).* ([0-9]*) subscriber.*/ 2 1/' |
    #再次合并处理
    uniq -f1 |
    #排序
    sort -k1,1n |
    #对齐
    sed "s/^/ /; s/ *([ 0-9]{7,}) ([^ ].*)/1 2/" |
    #截取
    sed "s/(.{80}).*/1/" #note $COLUMNS not exported

  • 相关阅读:
    JAVA基础语法练习(四)--File 及IO流
    JAVA基础语法练习(三)
    JAVA基础语法练习(二)
    JAVA基础语法练习(一)
    python 面向对象的进阶
    python面向对象基础编程
    Linux远程
    Linux系统的安装、启动及简单的命令使用
    操作系统的结构及发展历史
    操作系统简介
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5269965.html
Copyright © 2011-2022 走看看