《squid无故自残...》续缘篇之玩转日志!


      前几天偶被squid日志玩转了,奋发图强了几天,现在轮到偶来玩转squid日志了,咩哈哈哈!!(偶的痛苦经历详见 《squid无故自残,只留下”Exiting due to repeated. frequent failures“之箴言...》

      鉴于在下公司的代理服务器功能单一、机构简单,本想省事而为之,每天丢弃一次已有日志文件就完事了,但前辈们对偶提出了更高的要求,丢弃和分割都要有!!所以潜心研究一下(其实也就是略懂皮毛...),做出了一个squid的日志管理方案(不含日志分析)。如有错误,请大家指正!

     
一、逍遥派--直接丢弃日志文件

/var/log/squid里的日志文件根据squid的配置文件squid.conf的设置默认生成,如果确定不需要保留现有日志,可以全部直接删除,squid重启后这些日志文件会再次生成。

我们来看一下squid.conf文件里关于日志的配置项

#vi /etc/squid/squid.conf



cache和cahce_dir             //网页缓存的相关设置

cache_access_log            //设置squid访问日志access.log的存放路径

cache_log                        //设置squid运行状态记录日志cache.log的存放路径

cache_store_log              //设置缓存动作记录日志store.log的存放路径

备注:
access.log作为squid的访问日志,记录每个终端客户发起的具体请求,是squid的核心日志,体积会随着访问量的增多越变越大。

cache.log记录了squid运行状态和调试信息,squid意外不能启动时可以参考一下该日志文件,一般情况下体积很小,忽略不计。

store.log,我个人认为是一个比较傻冒的日志文件,它只记录每个进入和离开缓存的目标信息,没有什么参考价值而且体积很大!
可以通过修改cache_store_log丢弃store.log日志
cache_store_log none

      偶不太赞成全部取消squid的记录日志功能,山水有相逢,或许某些疑难杂症就在日志中找到答案。

所以逍遥派的方案就是一周清理一次squid日志记录。

1.手动清理
#cd /var/log/squid
进入squid默认日志目录(如果更改了位置请进入自定义的目录)

#rm -rf *
删除所有squid的日志文件(当然删除前先ls一下,避免错删其他文件)

#service squid restart
重启squid


2.自动执行
将我们手动执行的步骤添加到cron(关于cron的详细配置请参考偶的另一篇文章 《Linux计划任务工具cron用法详解》)自动执行

#crontab -e
编辑cron

输入以下语句,完了保存退出。

* 23  *  *  0 rm -rf /var/log/squid/*
10 23 * * 0 /etc/init.d/squid restart

首先在每周日的23点整删除squid所有日志文件
然后在每周日的23点10分重启squid

      这样就可以达到每周自动丢弃squid当前日志文件的目的,如果对日志文件依赖性不高,不需要做系统的访问分析,这种方法还是比较省事的,至少达到了目的,呵呵~~
      另外如果是大型网络,很有可能一周不到日志已经爆满了,可以根据实际情况缩短删除日志的时间间隔。

      够逍遥~~哥的最爱!!!(懒人的借口...)


二、谨慎派--通过rotate对日志进行分割

      squid也挺具前瞻性的,知道日志文件的疯涨总会导致程序崩溃,所以提供了日志分割命令rotate,完全自带的,无需安装第三方软件,操作上也非常简单,下面介绍一下步骤。

1. logfile_rotate
logfile_rotate是squid配置文件中的的一项,用来设置rotate(分割)后保留日志的份数。

#vi /etc/squid/squid.conf



如图所示,logfile_rotate字段后面的数字值表示保留分割日志的份数,例子中的值=5,即如果已经存在5份日志分割文件,就算再执行rotate命令也不会新增加分割文件,而是轮换、滚动更新这5份分割文件。
如果硬盘空间足够可以多保留几分,偶硬盘空间很小,所以只保留5份。

2.执行rotate对日志进行分割

#cd /usr/sbin
进入启动程序目录,squid的启动脚本也放在这里(如果是默认安装的话)

# squid -k rotate
执行日志分割



日志分割后,会在/var/log/squid目录各生成一个分割出来的 access.log.0cache.log.0store.log.0的日志文件



如上图所示,是日志分割前squid日志的情况



如上图所示,是执行rotate分割后的日志情况,生成了access.log.0、cache.log.0和store.log.0文件,同时也将数据量分割出去了,可以见access.log和store.log的已经变小了很多,暂时不会对squid的稳定性造成影响。



如上图所示,再次执行squid -k rotate之后继续产生新的分割后的日志文件



如上图所示,因为logfile_rotate的设置值为5,所以无论执行多少次rotate,最终在/var/log/squid目录下只会乱换保留5个分割后的日志文件。

      总结一下:
      这个谨慎派的方案可以一定程度上保证了squid日志的完整性,如果服务器的硬盘空间足够,而又有翻查日志需求的话,可以考虑一下这个做法~~~


三、学院派--利用newsyslog进行分割日志管理

      学院的东西,最重要流程清晰,稳定可靠。
      所以这个方案是通过第三方软件newsyslog对squid的日志进行分割,可以按日期保留所有squid的访问日志,适合需要长期对日志进行分析、统计、跟踪的环境,配置上稍微复杂一点,但也算是一个比较一劳永逸的方案。
 
      首先到官网下载一个新版的newsyslog的安装包,本文以newsyslog-1.8做实例。

#tar xzvf newsyslog-1.8.tar.gz
加压安装包

#cd newsyslog-1.8
进入安装包目录

##########
./configure
make
make install
##########
安装newsyslog
安装完成后默认在/usr/local/sbin生成一个可执行的程序启动文件newsyslog,其他配置完成后通过执行该文件来分割squid日志。

#cd /usr/local/etc
#touch newsyslog.conf
进入/usr/local/etc目录,如果没有etc目录,可以手动新建一个
然后手动创建newsyslog的配置文件newsyslog.conf
(配置newsyslog需要手动的地方比较多)

#vi newsyslog.conf
编辑配置文件,输入以下内容,完了保存退出。

#########################################
set squid_logpath = /var/log/squid
set squid_log = /var/log/squid/access.log
set date_squid_log = /var/log/squid/access%Y%M%D.log

SQUID{
        restart: run /usr/sbin/squid -k rotate
        log:  SQUID squid_log squid squid 644
        archive: SQUID date_squid_log 0

}
#########################################

squid_logpath            //本机squid日志存放目录,这里是默认
squid_log                   //本机squid访问日志(access.log)存放的绝对路径,也是默认
date_squid_log          //通过系统日期来命名分割出来的日志文件
restart:run                 //本机squid程序启动脚本的绝对路径,默认too

#cd /usr/local/sbin
完成对newsyslog.conf的配置后返回到该目录

#./newsyslog
执行newsyslog对squid日志进行分割



如上图所示,分割出了一个以服务器当前日期命名的日志文件 “access20100413.log.gz”

newsyslog按系统日期当天只能生成一个分割文件,如果同一天内再次执行newsyslog则会有以下提示:




同样,我们可以将newsyslog添加到cron让其定时执行:

#crontab -e

30 23 * * * /usr/local/sbin/newsyslog

     学院派的作风相对要条条框框一些,和谨慎派相比更加全面。
     当然,如果要保留从古到今所有的日志记录,还是得将这些分割出来的日志文件转移到一个足够大的空间进行存储,呵呵~~

     这几天和squid搏斗的经历,让偶发觉自己实在太菜了,果然是学无止境,继续努力加油,感谢各位捧场!!!