首页 > Linux Usage > 利用Linux的计划任务cron每日提取当天apache访问日志

利用Linux的计划任务cron每日提取当天apache访问日志

2013-01-03 21:16 星期四    浏览: 1,238    绿 发表评论 阅读评论

有时我们需要查看自己的站点的访问日志,如搜索引擎的抓取信息用于改善SEO优化。由于log信息众多,那么如何只提取当天apache的访问日志文件的中的log呢?我们可以利用Linux的计划任务守护进程crond执行某个脚本来实现,脚本则利用sed匹配日期字符串来提取我们需要的信息。

查看日志文件/var/log/httpd/access_log中关于日期时间的格式如下:

[03/Jan/2013:18:35:58 +0800]

使用man date查看date命令的用法:

 date [OPTION]… [+FORMAT]

%d day of month (e.g, 01)

%b     locale’s abbreviated month name (e.g., Jan)

 %Y     year

因此,可以使用命令输出apache日志中的日期格式:date +%d/%b/%Y
03/Jan/2013

因此可以使用sed命令 sed -n ‘/03\/Jan\/2013/ p’   /var/log/httpd/access_log来查看当天的日志。命令中的正则表达式中因为有“/”,所以使用了“\”对其转义。由于不好将date的格式输出并添加上转义符号作为正则表达式,所以将其输出到一个文件中,由sed使用它。下面的echo命令可以得到有转义字符”\”的字符串:

echo “/$(date +%d\\/%b\\/%Y)/ p”

执行结果如下:

/03\/Jan\/2013/ p

将其输出到文件/your_path/expression(将your_path替换成你自己的路径),该文件作为sed使用的脚本文件:

sed -n -f /your_path/expression  /var/log/httpd/access_log >/your_path/$(date +%Y%m%d).log

echo “/$(date +%d\\/%b\\/%Y)/ p” >/your_path/expression

将它们放置到/your_path/get_yesterday_log.sh 文件(并使用chmod a+x添加执行属性)中。因为生成正则表达式的echo命令放在后面,所以在添加计划任务时,先需执行该命令,以让第一次的sed命令如何搜索匹配。提取log完后,它将执行echo命令得到当天的日期匹配表达式,用于下一次的sed命令。get_yesterday_log.sh脚本文件如下:

sed -n -f /your_path/expression /var/log/httpd/access_log >/your_path/$(date +%Y%m%d).log
echo “/$(date +%d\\/%b\\/%Y)/ p” >/your_path/expression

添加计划任务,例如每天的2点30分执行该脚本(五个区域分别代表分钟、小时、日期、月份和星期,不指定用星号代替):

crontab -e

30 2  * * * /home/root/get_yesterday_log.sh 

crontab -l
30 2 * * * /home/root/get_yesterday_log.sh

可用crontab -r删除当前的计划任务。

若各个站点的访问日志配置成存在各自的log文件中,如/etc/httpd/conf.d/的.conf文件中的<VirtualHost></VirtualHost>中指定了CustomLog项:

CustomLog /var/log/httpd/example_access_log combined

则会将站点的日志输出到指定的文件中,combined用于记录搜索引擎(如百度蜘蛛)的访问记录。这时,get_yesterday_log.sh中让sed处理不同的站点log文件然后得到各自的头一天日志信息。

可以处理站点多个虚拟站点的log并考虑了date因locale而导致不同输出的完整的get_yesterday_log.sh:

#!/bin/sh
#Wrote by @BillYang_ycg, Jan 3 2013
#Must execute echo command in the last two lines first before execute this script,
#and make sure get the correct latin date string
INPUT_DIR=/var/log/httpd
OUTPUT_DIR=/your_path/log
HOME_DIR=/home/root

#if your system use Chinese, the output of date will include Chinese charaters
#changing LC_ALL will get latin date string
export LC_ALL=en_US.UTF8

for website in mysite1 mysite2 mysite3
do
  #echo “Handle the log $INPUT_DIR/”$website”_access_log to $OUTPUT_DIR/$(cat $HOME_DIR/prelogfilename)_$website.log”
   sed -n -f $HOME_DIR/expression $INPUT_DIR/”$website”_access_log >$OUTPUT_DIR/$(cat $HOME_DIR/prelogfilename)_$website.log
    chown yourftpname.ftp $OUTPUT_DIR/$(cat $HOME_DIR/prelogfilename)_$website.log
done

echo “/$(date +%d\\/%b\\/%Y)/ p” >$HOME_DIR/expression
echo “$(date +%Y%m%d)”>$HOME_DIR/prelogfilename

当添加新站点时,只需将新站点名称添(来自CustomLog中指定的名称字符串如上面提到的example)加到for语句后面的站点列表中。注:路径变量不可加括号否则被当作命令,给$website加引号后以与其它字符串拼接。

本文链接地址: http://blog.redwolf-soft.com/?p=1927

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
分类: Linux Usage 标签: , ,
  1. 本文目前尚无任何评论.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。