Apache运行时记录访问日志与错误日志,日志会收集起来做统一的分析处理,如:

1.基本访问情况统计(页面浏览量,图片浏览量,下载访问量,独立IP数,页面错误数,错误链接地址等情况)
2.IP访问情况分析(IP各省市分布情况,访问量前100位的独立IP);
3.重点业务页面访问分析(动态页面访问数,静态页面访问数,访问次数最多的页面排序,每小时访问数统计)

那么如何上报Apache日志呢?一般apache会在本机落地日志文件,可由运维编写角本定时或按文件大小切割日志,按统一的格式rsync到指定的日志接收服务器。

缺点:

1.日志上报实时性不强

2.运维要编写角本去切割日志统一日志格式rsync日志,需要搭建专门的rsync接收服务器,有一定的工作量与维护量

3.接收服务器有限,apache服务器成百上千,容易造成接收服务器负载升高,导致日志丢失

是否有更好的解决方案了?比如:可以开发apache模块在日志生成时本机不落地直接上报到统一的服务器或者日志中转系统,Apache配置文件httpd.conf里配置加载Apache日志模块 mod_log_config, mod_log_config提供了灵活的方法将客户请求记录到日志。日志可以用自定义的格式直接写入文件。模块提供了三个指令:TransferLog指令用来指定日志文件,LogFormat指令用来定义日志格式,CustomLog指令可以同时完成指定日志文件和定义日志格式。

例如:

LogFormat "%{%Y-%m-%d %H:%M:%S}t|%v|%{X-Forwarded-For}i|%A|%h|%D|%T|%>s|%b|%X|%r|%{Referer}i|%{User-Agent}i|%{X-Original-To}i|" common
CustomLog logs/access_log common

(自定义了一个访问日志格式,并命令为common,然后以此格式记录访问日志到文件logs/access_log )

ErrorLog logs/error_log

(错误日志记录到logs/error_log,日志内容一般分属两类:文档错误和CGI错误。偶尔也会出现配置错误,另外还有服务器启动和关闭信息)

上面的配置把日志记录的相应的日志文件里,其实Apache模块mod_log_config还提供了把日志传送到一个外部程序继续处理的功能,可以开发一个独立的日志接收上报程序(可由C与shell开发),实时接收Apache日志(通过管道拼接读标准输入)并发往日志中转系统,如:

while((n = read(STDIN_FILENO,buf,BUFSIZE))>0)
{
走UDP发往日志中转系统
}

比如开发生成了一个日志接收上报程度/usr/local/bin/custom_logging_program,修改配置文件httpd.conf,如:

CustomLog "|/usr/local/bin/custom_logging_program" common

重启apache进程:httpd -k restart,后续所有访问日志将实时发往日志中转系统,不在本机落地,当然可以通过双向重定向既在本机落地一分,同时也往日志中转系统发送一份:

CustomLog "| tee logs/access_log | /usr/local/bin/custom_logging_program" common

方案的优点:

1.数据实时性强,日志格式容易统一,实现规范上报
2.运维不用关心日志上报,日志本机不落地减少了web服务器磁盘IO,有利于节省人力资源与机器成本
3.实现了一种管道过滤器的模式,对日志的接收与上报完全可控,方便做一些过滤、抽样上报等