返回首页
当前位置: 主页 > 操作系统 > Linux教程 >

Linux命令行下监控网站日志

时间:2016-05-30 12:45来源:电脑教程学习网 www.etwiki.cn 编辑:admin

下面的内容是使用linux作为网站的朋友一定要懂的方法。虽然有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/\(.*\) - \[[^]]*\]\(.*\)/\1\2/" | #过滤掉一些字段
#分析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$deny\2$norm\3/;t;
s/\([^\"]*\"[^\"]*\" [0-9 -]* \"\)\([^\"]*\)\(\".*\)/\1$high\2$norm\3/;t;
"

保存为 tail_access_log 并在shell中调用,相信这个大家都会的了^_^。

二、近期日志高效监控脚本

如果网站流量很大的话,日志文件是相当庞大的。分析这些日志的时候就需要小心处理了,例如:笔者的访问日志已经有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\t\2/' |
#根据浏览器、用户网段进行排序
sort -k2 -k1,1 |
#合并
uniq -c |
#忽略单个请求
grep -vE "      1 .*(rv:|MSIE|AppleWebKit/|Konqueror|Opera).*" |
#忽略机器人访问
grep -vE -f agents_to_ignore |
#合并订阅用户
sed '
 s/\([^\t]\)\t.*Firefox.*/\1\tFirefox/;
 s/\([^\t]\)\t.*MSIE 7.0.*/\1\tIE7/;
 s/\([^\t]\)\t.*Opera.*/\1\tOpera/;
 s/\([^\t]\)\t.*Akregator.*/\1\tAkregator/;
 s/\([^\t]\)\t.*Thunderbird.*/\1\tThunderbird/;
 s/\([^\t]\)\t.*Liferea.*/\1\tLiferea/;
 s/\([^\t]\)\t.*Google Desktop.*/\1\tGoogle Desktop/;
 ' |
#显示浏览器类型
cut -d"`echo -e '\t'`" -f2 |
#分组
sort |
#计数
uniq -c |
#识别使用google订阅的用户
sed 's/\(.*\)\(feedfetcher.html\)\(.*\)id=\([0-9]*\).*/\1\2.\4\3/' |
#计数
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
------分隔线----------------------------
标签(Tag):Linux Ubuntu Unix 操作系统 Android fedora debian
------分隔线----------------------------
推荐内容
猜你感兴趣