Apache日志不记录图片文件设置方法和来源日志的配置
Apache日志不记录图片文件设置方法
<FilesMatch "\.(ico|gif|jpg|swf)">
SetEnv IMAG 1
</FilesMatch>
CustomLog logs/access_log combined env=!IMAG
Apache日志,如果记录所有访问请求,文件会很大;如果使用日志分析软件,分析结果不一定准确。而且如果不安装cronolog工具来截断日志,会在一个整文件中,这样访问量一高,日志文件所占空间是可观的。
通过在httpd.conf文件(虚拟主机可以直接在httpd-vhosts.conf文件中设置)进行这样的设置后,日志将不记录指定文件类型的请求:
〈FilesMatch “\.(ico|gif|jpg|swf)”〉
SetEnv IMAG 1
〈/FilesMatch〉
CustomLog logs/access_log combined env=!IMAG
第一行中,括号中加粗的部分为文件类型,可以自由指定,用竖线“|”隔开。
第四行中,删除线部分为日志文件所在路径,根据实际情况设置;斜体为apache日志4种记录方式(common、combined、referer、agent)之一,根据实际需要选择;env=!IMAG一定要加在最后,指令不记录上面指定的类型。
根据来源地址分别记录日志:
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
#CustomLog logs/access_log common
SetEnvIf Referer baidu\.com localreferer
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2.2.3/logs/access_%Y%m%d.log" combined env=!localreferer ##非百度来源记录到这儿
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache2.2.3/logs/baidu_%Y%m%d.log" combined env=localreferer ##所有来源是百度的记录在这儿
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog logs/access_log combined
</IfModule>
访问日志(Access Log)
| 相关模块 | 相关指令 |
|---|---|
访问日志中会记录服务器所处理的所有请求,其文件名和位置取决于CustomLog指令,LogFormat指令可以简化日志的内容。这里阐述如何配置服务器的访问日志。
实施日志管理,首先当然必须产生访问日志,然后才能分析日志从而得到有用的统计信息。日志分析不是Web服务器的职责,已超出本文的范畴,更多资料和有关分析工具的信息,可以查看Open Directory或Yahoo 。
不同版本的Apache httpd使用了不同的模块和指令来控制对访问的记录,包括mod_log_referer, mod_log_agent和TransferLog指令。现在,CustomLog指令包含了旧版本中相关指令的所有功能。
访问日志的格式是高度灵活的,使用很象C风格的printf()函数的格式字符串。下面有几个例子,完整的说明可以查看用于mod_log_config模块的格式字符串。
通用日志格式(Common Log Format)
这是一个典型的记录格式:
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
它定义了一种特定的记录格式字符串,并给它起了个别名叫common ,其中的"%"指示服务器用某种信息替换,其他字符则不作替换。引号(")必须加反斜杠转义,以避免被解释为字符串的结束。格式字符串还可以包含特殊的控制符,如换行符"\n" 、制表符"\t"。
CustomLog指令建立一个使用指定别名的新日志文件,除非其文件名是以斜杠开头的绝对路径,否则其路径就是相对于ServerRoot的相对路径。
上述配置是一种被称为通用日志格式(CLF)的记录格式,它被许多不同的Web服务器所采用,并被许多日志分析程序所识别,它产生的记录形如:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
记录的各部分说明如下:
127.0.0.1(%h)- 这是发送请求到服务器的客户的IP地址。如果
HostnameLookups设为On,则服务器会尝试解析这个IP地址的主机名并替换此处的IP地址,但并不推荐这样做,因为它会显著拖慢服务器,最好是用一个日志后续处理器来判断主机名,比如logresolve。如果客户和服务器之间存在代理,那么记录中的这个IP地址就是那个代理的IP地址,而不是客户机的真实IP地址。 -(%l)- 这是由客户端
identd进程判断的RFC1413身份(identity),输出中的符号"-"表示此处的信息无效。除非在严格控制的内部网络中,此信息通常很不可靠,不应该被使用。只有在将IdentityCheck指令设为On时,Apache才会试图得到这项信息。 frank(%u)- 这是HTTP认证系统得到的访问该网页的客户标识(userid),环境变量
REMOTE_USER会被设为该值并提供给CGI脚本。如果状态码是401,表示客户未通过认证,则此值没有意义。如果网页没有设置密码保护,则此项将是"-"。 [10/Oct/2000:13:55:36 -0700](%t)- 这是服务器完成请求处理时的时间,其格式是:
[日/月/年:时:分:秒 时区]
日 = 2数字
月 = 3字母
年 = 4数字
时 = 2数字
分 = 2数字
秒 = 2数字
时区 = (+|-)4数字可以在格式字符串中使用
%{format}t来改变时间的输出形式,其中的format与C标准库中的strftime()用法相同。 "GET /apache_pb.gif HTTP/1.0"(\"%r\")- 引号中是客户端发出的包含许多有用信息的请求行。可以看出,该客户的动作是
GET,请求的资源是/apache_pb.gif,使用的协议是HTTP/1.0。另外,还可以记录其他信息,如:格式字符串"%m %U%q %H"会记录动作、路径、查询字符串、协议,其输出和"%r"一样。 200(%>s)- 这是服务器返回给客户端的状态码。这个信息非常有价值,因为它指示了请求的结果,或者是被成功响应了(以2开头),或者被重定向了(以3开头),或者出错了(以4开头),或者产生了服务器端错误(以5开头)。完整的状态码列表参见HTTP规范(RFC2616第10章)。
2326(%b)- 最后这项是返回给客户端的不包括响应头的字节数。如果没有信息返回,则此项应该是"
-",如果希望记录为"0"的形式,就应该用%B。
组合日志格式(Combined Log Format)
另一种常用的记录格式是组合日志格式,形式如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log combined
这种格式与通用日志格式类似,但是多了两个 %{header}i 项,其中的header可以是任何请求头。这种格式的记录形如:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
其中,多出来的项是:
"http://www.example.com/start.html"(\"%{Referer}i\")- "Referer"请求头。此项指明了该请求是被从哪个网页提交过来的,这个网页应该包含有
/apache_pb.gif或者其连接。 "Mozilla/4.08 [en] (Win98; I ;Nav)"(\"%{User-agent}i\")- "User-Agent"请求头。此项是客户端提供的浏览器识别信息。
多文件访问日志
可以简单地在配置文件中用多个CustomLog指令来建立多文件访问日志。如下例,既记录基本的CLF信息,又记录提交网页和浏览器的信息,最后两行CustomLog示范了如何模拟ReferLog和AgentLog指令的效果。
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"
此例也说明了,记录格式可以直接由CustomLog指定,而并不一定要用LogFormat起一个别名。
条件日志
许多时候,根据与请求特征相关的环境变量来有选择地记录某些客户端请求会带来便利。首先,需要使用SetEnvIf指令来设置特定的环境变量以标识符合某种特定条件的请求,然后用CustomLog指令的 env= 子句,根据这些环境变量来决定记录或排除特定的请求。例如:
# 不记录本机发出的请求
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# 不记录对robots.txt文件的请求
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# 记录其他请求
CustomLog logs/access_log common env=!dontlog
再如,将使用英语的请求记录到一个日志,而记录非英语的请求到另一个日志:
SetEnvIf Accept-Language "en" english
CustomLog logs/english_log common env=english
CustomLog logs/non_english_log common env=!english
虽然上述已经展示了条件日志记录的强大和灵活,但这不是控制日志内容的唯一手段,还可以用日志后继处理程序来剔除你不关心的内容,从而使日志更加有用。

日志滚动
即使一个并不繁忙的服务器,其日志文件的信息量也会很大,一般每10000个请求,访问日志就会增加1MB或更多。这就有必要定期滚动日志文件。由于Apache会保持日志文件的打开,并持续写入信息,因此服务器运行期间不能执行滚动操作。移动或者删除日志文件以后,必须重新启动服务器才能让它打开新的日志文件。
用优雅的(graceful)方法重新启动,可以使服务器启用新的日志文件,而不丢失原来尚未写入的信息。为此,有必要等待一段时间,让服务器完成正在处理的请求,并将记录写入到原来的日志文件。以下是一个典型的日志滚动和为节省存储空间而压缩旧日志的例子:
mv access_log access_log.old
mv error_log error_log.old
apachectl graceful
sleep 600
gzip access_log.old error_log.old
另一种执行滚动的方法是使用下一节阐述的管道日志。

管道日志
Apache httpd可以通过管道将访问记录和出错信息传递给另一个进程,而不是写入一个文件,由于无须对主服务器进行编程,这个功能显著地增强了日志的灵活性。只要用管道操作符"|"后面跟一个可执行文件名,就可以使这个程序从标准输入设备获得事件记录。Apache在启动时,会同时启动这个管道日志进程,并且在运行过程中,如果这个进程崩溃了,会重新启动这个进程(所以我们称这个技术为"可靠管道日志")。
管道日志进程由其父进程Apache httpd产生,并继承其权限,这意味着管道进程通常是作为root运行的,所以保持这个程序简单而安全极为重要。
管道日志的一种重要用途是,允许日志滚动而无须重新启动服务器。为此,服务器提供了一个简单的程序rotatelogs 。每24小时滚动一次日志的例子如下:
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
注意:引号用于界定整个管道命令行。虽然这是针对访问日志的,但是其用法对于其他日志也一样。
在其他站点,有一个类似但更灵活的日志滚动程序叫cronolog 。
如果有较简单的离线处理日志的方案,就不应该使用条件日志和管道日志,即使它们非常强大。

虚拟主机
如果服务器配有若干虚拟主机,那么还有几个控制日志文件的功能。首先,可以把日志指令放在<VirtualHost>段之外,让它们与主服务器使用同一个访问日志和错误日志来记录所有的请求和错误,但是这样就不能方便的获得每个虚拟主机的信息了。
如果把CustomLog或ErrorLog指令放在<VirtualHost>段内,所有对这个虚拟主机的请求和错误信息会被记录在其私有的日志文件中,那些没有在<VirtualHost>段内使用日志指令的虚拟主机将仍然和主服务器使用同一个日志。这种方法对虚拟主机较少的服务器很有用,但虚拟主机非常多时,就会带来管理上的困难,还经常会产生文件描述符短缺的问题。
对于访问日志,有一个很好的折衷方案,在同一个访问日志文件中记录对所有主机的访问,而每条记录都注明虚拟主机的信息,日后再把记录拆开存入不同的文件。例如:
LogFormat "%v %l %u %t \"%r\" %>s %b" comonvhost
CustomLog logs/access_log comonvhost
%v 用来附加虚拟主机的信息。有个split-logfile程序可以根据不同的虚拟主机信息对日志进行拆分,并将结果存入不同的文件。

其他日志文件
| 相关模块 | 相关指令 |
|---|---|
记录接收和发送的实际字节数
mod_logio增加了两个额外的LogFormat字段(%I 和 %O)用于记录接收和发送的实际字节数。
对比记录(Forensic Logging)
mod_log_forensic提供了对客户端请求的对比记录,也就是在请求被处理之前和处理完成之后进行两次记录,所以对比日志(forensic log)对于每个请求都包含两条记录。对比记录器(forensic logger)十分严格,不可以进行定制。它可以成为无价的调试和安全工具。
PID文件
在启动时,Apache httpd将会在logs/httpd.pid文件中保存其父进程httpd的进程ID(process id[PID])。该文件名可以用PidFile指令改变。该PID可以被管理员利用来重新启动或者终止服务器后台守护进程。在Windows中,可以使用命令行参数 -k 。更多信息请参见停止和重新启动。
脚本日志
为了方便调试,可以用ScriptLog指令来记录CGI脚本的输入和输出。此功能应该仅用于测试,而不应该用于正常工作的服务器。更多资料请参见mod_cgi文档。
重写日志
在使用强大且灵活的mod_rewrite时,几乎都有必要用RewriteLog来帮助调试。这个日志提供了重写引擎如何转换请求的详细分解信息,其详细程度取决于RewriteLogLevel指令。
Apache日志不记录图片文件设置方法和来源日志的配置的更多相关文章
- Linux centos7 VMware Apache访问日志不记录静态文件、访问日志切割、静态元素过期时间
一.Apache访问日志不记录静态文件 网站大多元素为静态文件,如图片.css.js等,这些元素可以不用记录 vim /usr/local/apache2.4/conf/extra/httpd-vho ...
- android判断文件是否是图片文件的方法
判断一个文件是否是图片文件的方法,采用BitmapFactory去decode然后根据返回的Options参数来确定: public static boolean isImageFile(String ...
- 使apache的日志文件里不记录图片文件
找到: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-A ...
- Apache服务器如何通过.htaccess文件设置防盗链?
Apache服务器通过.htaccess文件设置防盗链 用户经常面对的一个问题就是服务器的流量问题,而站点文件被盗链是其中最为主要的部分.所谓盗链,是指其他网站直接链接我们网站上的文件,一般来说,盗链 ...
- eclipse中关联文件设置方法
在前几次的试验中,只是做了处于应用程序最上层的界面设计,其实还不知程序在运行过程中到底调用了哪些函数,这些函数是怎么实现的,由于搭建环境时没有进行文件关联,所以在环境中无法实现ctrl键+左击鼠标的方 ...
- 你的日志组件记录够清晰嘛?--自己开发日志组件 Logger
现在现成的日志组件实在是太多太多,为什么我还需要自己实现呢????? 需求来源于java的log4j, [07-31 16:40:00:557:WARN : com.game.engine.threa ...
- Apache配置 5.访问日志不记录静态文件
介绍:项目中的CSS.图片.js都是静态文件.一般会将静态文件放到一个单独的目录中,以方便管理. 1. 配置 # vim /usr/local/apache2.4/conf/extra/httpd-v ...
- Visual Studio 2013 Unit Test Project App.config文件设置方法
开放中经常会要做单元测试,新的项目又没有单元测试项目,怎么才能搭建一个单元测试项目呢? 下面跟我四步走,如有错误之处,还请指正! 1.添加项目 2.添加配置文件 新建app.config文件,注意不是 ...
- php上传大文件设置方法
打开php.ini,首先找到 ;;;;;;;;;;;;;;;; ; file uploads ; ;;;;;;;;;;;;;;;; 区域,有影响文件上传的以下几个参数: file_uploads = ...
随机推荐
- 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...
- URAL 1934 Black Spot(最短路)
Black Spot Time limit: 1.0 secondMemory limit: 64 MB Bootstrap: Jones's terrible leviathan will find ...
- Android--解析XML之SAX
前言 既然要说XML解析,那么先来聊聊什么是XML.XML,可扩展标记语言 (Extensible Markup Language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义 ...
- 查找字符串的 KMP 算法
查找字符串是我们平常编程过程中经常遇到的,现在介绍一种查找字符串算法,增加程序的执行速度. 通常我们是这么写的: /* content: search a string in a othor stri ...
- [AMPPZ 2013]Bytehattan
先把题目链接贴在这里喵~ http://main.edu.pl/en/archive/amppz/2013/baj 话说真是一道让我严重怀疑我的智商的好题目, 话说此题第一感觉.嗯?似乎离线做做就可以 ...
- java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比
一:HashMap--->底层存储的是Entry<K,V>[]数组--->Entry<K,V>的结构是一个单向的链表static class Entry<K, ...
- apache性能优化
perfork进程数 http://sookk8.blog.51cto.com/455855/275759/ mod_cache 磁盘缓存 http://www.cnblogs.com/fnng/ar ...
- 新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs)
新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs) 本文翻译自:http://deeplearning4j.o ...
- Intel MKL函数,如何得到相同的计算结果?【转】
在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同. 事实上,程序往往很难保证做到这一点. 为什么呢? 我们先看一个简单的例子: 当程序 ...
- GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考
GPU线程以网格(grid)的方式组织,而每个网格中又包含若干个线程块,在G80/GT200系列中,每一个线程块最多可包含512个线程,Fermi架构中每个线程块支持高达1536个线程.同一线程块中的 ...