<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OurApache &#187; 日志</title>
	<atom:link href="http://ourapache.com/archives/tag/%e6%97%a5%e5%bf%97/feed" rel="self" type="application/rss+xml" />
	<link>http://ourapache.com</link>
	<description>我们致力于一个Apache知识的分享网站</description>
	<lastBuildDate>Tue, 13 Apr 2010 05:18:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>玩转apache之日志</title>
		<link>http://ourapache.com/archives/243</link>
		<comments>http://ourapache.com/archives/243#comments</comments>
		<pubDate>Mon, 01 Jun 2009 03:55:00 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache初级应用]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[日志]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=243</guid>
		<description><![CDATA[要有效地管理Web服务器，就有必须了解服务器的状态、性能以及出现的问题。Apache提供了非常全面而灵活的日志记录功能。本文将阐述如何配置文件以及如何理解日志内容。]]></description>
			<content:encoded><![CDATA[<h2>引言</h2>
<p>要有效地管理Web服务器，就有必须了解服务器的状态、性能以及出现的问题。Apache提供了非常全面而灵活的日志记录功能。本文将阐述如何配置文件以及如何理解日志内容。</p>
<p> </p>
<h3>1.使用combined获取更详细的日志</h3>
<p>编辑httpd.conf文件（下面几乎都是更改这个文件），搜索CustomLog<br />
CustomLog logs/access_<a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">log</a> combined<br />
用这个格式不会有什么损失，而且还能获得一些额外的信息（referer和user-agent）。</p>
<h3>2.让错误信息更全面</h3>
<p>通过定义loglevel来实现<br />
搜索LogLevel</p>
<p>日志级别如下。（debug产生的信息最多。emerg产生的信息最少）</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top">
<p align="left"><strong>Level</strong></p>
</td>
<td valign="top">
<p align="left"><strong>描述</strong></p>
</td>
<td valign="top">
<p align="left"><strong>例子</strong></p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">emerg</p>
</td>
<td valign="top">
<p align="left">紧急(系统无法使用)</p>
</td>
<td valign="top">
<p align="left">“Child cannot open lock file. Exiting”</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">alert</p>
</td>
<td valign="top">
<p align="left">必须立即采取措施</p>
</td>
<td valign="top">
<p align="left">“getpwuid: couldn’t determine user name from uid”</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">crit</p>
</td>
<td valign="top">
<p align="left">致命情况</p>
</td>
<td valign="top">
<p align="left">“socket: Failed to get a socket, exiting child”</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">error</p>
</td>
<td valign="top">
<p align="left">错误情况</p>
</td>
<td valign="top">
<p align="left">“Premature end of script headers”</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">warn</p>
</td>
<td valign="top">
<p align="left">警告情况</p>
</td>
<td valign="top">
<p align="left">“child process 1234 did not exit, sending another SIGHUP”</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">notice</p>
</td>
<td valign="top">
<p align="left">一般重要情况</p>
</td>
<td valign="top">
<p align="left">“httpd: caught SIGBUS, attempting to dump core in …”</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">info</p>
</td>
<td valign="top">
<p align="left">普通信息</p>
</td>
<td valign="top">
<p align="left">“Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)…”</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">debug</p>
</td>
<td valign="top">
<p align="left">调试信息</p>
</td>
<td valign="top">
<p align="left">“Opening config file …”</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<h3>3.记录以POST方式传送的数据</h3>
<p>使用mod_secutiry,增加如下配置<br />
SecAuditLogType Concurrent<br />
SecAuditLogStorageDir /var/www/audit_log/data/<br />
SecAuditLog /var/www/audit_log/index<br />
SecAuditLogParts ABCFHZ<br />
注：<br />
post方式与get方式<br />
1、采用post方式传输数据时,不需要在URL中显示出来,而get方式要在URL当中进行显示(不安全性).<br />
2、post方式的传输数据量较大,理论上来说是没有限制的,而get方式由于受到UEL长度的限制,只能传递GET方式提交的数据最多只能有1024字节.<br />
3、post顾名思义,就是为了将数据传送到服务器端,Get就是为了从服务器端取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.post的信息作为http请求的内容，而Get是在Http头部传输的。<br />
我们的form表单的method方法，post,get.它在页面传值的时候的区别也就是上面提到的三点.</p>
<h3>4.记录cookie</h3>
<p>记录从客户端<strong>收到的cookie</strong></p>
<p>CustomLog logs/cookies_in.log “%{UNIQUE_ID}e %{Cookie}i”<br />
CustomLog logs/cookies2_in.log “%{UNIQUE_ID}e %{Cookie2}i”</p>
<p>记录由服务器<strong>发送的cookie</strong></p>
<p>CustomLog logs/cookies_out.log “%{UNIQUE_ID}e %{Set-Cookie}o”<br />
CustomLog logs/cookies2_out.log “%{UNIQUE_ID}e %{Set-Cookie2}o”<br />
注：本方法记录所有的cookie ，如何区分是个问题。我只在实验的时候用，真实生产环境用的不多。<br />
cookie与Set-cookie标头字段是最常用到的。cookie2与set-cookie对应的字段比较新。</p>
<h3>5.忽略来自本站的请求</h3>
<p>追踪盗链的时候比较有用。<br />
定义后缀<br />
SetEnvIfNoCase Referer “^http://www.example.com/” 你的网站 local_referrer=1</p>
<p>CustomLog logs/access_log combined env=!local_referrer</p>
<p>注：SetEnvIfNoCase与SetEnvIf相同，但是前者无视大小写。</p>
<h3>6.按时间生产日志</h3>
<p>有时需要间隔N小时生产一次日志。</p>
<p>CustomLog “| /path/to/rotatelogs /path/to/logs/access_log.%Y-%m-%d 86400″ combined</p>
<p>注：使用了CustomLog和rotatelogs （red hat默认就有）。<br />
使用秒来控制间隔时间。</p>
<h3>7.在每月的第一天更新日志文件</h3>
<p>在每月的第一天结束上个月的日志文件，同时开始新的记录。</p>
<p><code>CustomLog "|/usr/bin/cronolog /www/logs/access%Y%m.log" combined</code></p>
<p>注：需要使用cronolog，十分好用的工具，下载地址请google之。</p>
<h3>8.为虚拟主机建立各自的日志</h3>
<p>首先，需要将虚拟主机的信息放入日志中。</p>
<p>LogFormat “%v %h %l %u %t \”%r\” %&gt;s %b” vhost<br />
CustomLog logs/multiple_vhost_log vhost</p>
<p>这将用日志的普通格式来创建一个日志文件。但会在每条记录前加上正式的虚拟主机名(就是在ServerName指令中定义的那个)。<br />
现在将日志文件分开(每个虚拟主机一个日志文件)</p>
<p>split-logfile &lt; /logs/multiple_vhost_log</p>
<p>注：split-logfile不是自动安装的，而是在配置过程以后，装在”support”目录下的<br />
附表</p>
<h3>9.记录响应请求的ip地址</h3>
<p>当服务器有多个ip时想知道是哪个ip响应了请求。</p>
<p>CustomLog logs/served-by.log “%A”</p>
<h3>10.记录访客来源</h3>
<p>知己知彼，了解访客是从哪个网站过来的。</p>
<p>%{Referer}i</p>
<p>注：默认已经包含在logformat</p>
<h3>11.记录访客使用的浏览器</h3>
<p>%{User-Agent}i</p>
<p>注：默认已经包含在logformat</p>
<h3>12.使用syslog记录apache日志</h3>
<p>第一步：配置syslog<br />
/etc/syslog.conf是syslog的配置文件。<br />
里面的每一行都用一个或者多个空格或者TAB隔开，分成两个段<br />
如：<br />
mail.info /var/log/maillog<br />
意思是把日志对象mail的info级别及以上级别的日志记录到/var/log/maillog中去<br />
在这里，前面一段是 : 日志对象.日志级别。后面一段是:日志的记录位置，这个位置可以是<strong>文件</strong>(如/var/log/maillog)，可以是某个<strong>TTY</strong>（如/dev/tty1）可以是某个登录的<strong>用户的控制台</strong> （如用户名jean）也可以是当前所有的下在登录的用户所在的控制台（用＊号表示所有用户）还可以是一台<strong>远程的主机</strong>（@remote_host_ip）<br />
现在加入这一行</p>
<p>local0.info /var/log/apache.log</p>
<p>然后重新启动syslog。service syslog restart<br />
第二步<br />
在apache配置中加入</p>
<p>CustomLog “|logger -t apache -p local0.info” combined</p>
<h3>补充</h3>
<p>HTTP状态码</p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<thead>
<tr>
<td>
<p align="center"><strong>编码</strong></p>
</td>
<td>
<p align="center"><strong>描述</strong></p>
</td>
</tr>
</thead>
<tbody>
<tr>
<td colspan="2">
<p align="left">Informational 1xx</p>
</td>
</tr>
<tr>
<td>
<p align="left">100</p>
</td>
<td>
<p align="left">Continue</p>
</td>
</tr>
<tr>
<td>
<p align="left">101</p>
</td>
<td>
<p align="left">Switching protocols</p>
</td>
</tr>
<tr>
<td colspan="2">
<p align="left">Successful 2xx</p>
</td>
</tr>
<tr>
<td>
<p align="left">200</p>
</td>
<td>
<p align="left">OK</p>
</td>
</tr>
<tr>
<td>
<p align="left">201</p>
</td>
<td>
<p align="left">Created</p>
</td>
</tr>
<tr>
<td>
<p align="left">202</p>
</td>
<td>
<p align="left">Accepted</p>
</td>
</tr>
<tr>
<td>
<p align="left">203</p>
</td>
<td>
<p align="left">Nonauthoritative information</p>
</td>
</tr>
<tr>
<td>
<p align="left">204</p>
</td>
<td>
<p align="left">No content</p>
</td>
</tr>
<tr>
<td>
<p align="left">205</p>
</td>
<td>
<p align="left">Reset content</p>
</td>
</tr>
<tr>
<td>
<p align="left">206</p>
</td>
<td>
<p align="left">Partial content</p>
</td>
</tr>
<tr>
<td colspan="2">
<p align="left">Redirection 3xx</p>
</td>
</tr>
<tr>
<td>
<p align="left">300</p>
</td>
<td>
<p align="left">Multiple choices</p>
</td>
</tr>
<tr>
<td>
<p align="left">301</p>
</td>
<td>
<p align="left">Moved permanently</p>
</td>
</tr>
<tr>
<td>
<p align="left">302</p>
</td>
<td>
<p align="left">Found</p>
</td>
</tr>
<tr>
<td>
<p align="left">303</p>
</td>
<td>
<p align="left">See other</p>
</td>
</tr>
<tr>
<td>
<p align="left">304</p>
</td>
<td>
<p align="left">Not modified</p>
</td>
</tr>
<tr>
<td>
<p align="left">305</p>
</td>
<td>
<p align="left">Use proxy</p>
</td>
</tr>
<tr>
<td>
<p align="left">306</p>
</td>
<td>
<p align="left">(Unused)</p>
</td>
</tr>
<tr>
<td>
<p align="left">307</p>
</td>
<td>
<p align="left">Temporary redirect</p>
</td>
</tr>
<tr>
<td colspan="2">
<p align="left">Client error 4xx</p>
</td>
</tr>
<tr>
<td>
<p align="left">400</p>
</td>
<td>
<p align="left">Bad request</p>
</td>
</tr>
<tr>
<td>
<p align="left">401</p>
</td>
<td>
<p align="left">Unauthorized</p>
</td>
</tr>
<tr>
<td>
<p align="left">402</p>
</td>
<td>
<p align="left">Payment required</p>
</td>
</tr>
<tr>
<td>
<p align="left">403</p>
</td>
<td>
<p align="left">Forbidden</p>
</td>
</tr>
<tr>
<td>
<p align="left">404</p>
</td>
<td>
<p align="left">Not found</p>
</td>
</tr>
<tr>
<td>
<p align="left">405</p>
</td>
<td>
<p align="left">Method not allowed</p>
</td>
</tr>
<tr>
<td>
<p align="left">406</p>
</td>
<td>
<p align="left">Not acceptable</p>
</td>
</tr>
<tr>
<td>
<p align="left">407</p>
</td>
<td>
<p align="left">Proxy authentication required</p>
</td>
</tr>
<tr>
<td>
<p align="left">408</p>
</td>
<td>
<p align="left">Request timeout<a name="I_indexterm3_d1e3983"></a></p>
</td>
</tr>
<tr>
<td>
<p align="left">409</p>
</td>
<td>
<p align="left">Conflict</p>
</td>
</tr>
<tr>
<td>
<p align="left">410</p>
</td>
<td>
<p align="left">Gone</p>
</td>
</tr>
<tr>
<td>
<p align="left">411</p>
</td>
<td>
<p align="left">Length required</p>
</td>
</tr>
<tr>
<td>
<p align="left">412</p>
</td>
<td>
<p align="left">Precondition failed</p>
</td>
</tr>
<tr>
<td>
<p align="left">413</p>
</td>
<td>
<p align="left">Request entity too large</p>
</td>
</tr>
<tr>
<td>
<p align="left">414</p>
</td>
<td>
<p align="left">Request-URI too long</p>
</td>
</tr>
<tr>
<td>
<p align="left">415</p>
</td>
<td>
<p align="left">Unsupported media type</p>
</td>
</tr>
<tr>
<td>
<p align="left">416</p>
</td>
<td>
<p align="left">Requested range not satisfiable</p>
</td>
</tr>
<tr>
<td>
<p align="left">417</p>
</td>
<td>
<p align="left">Expectation failed</p>
</td>
</tr>
<tr>
<td colspan="2">
<p align="left">Server error 5xx</p>
</td>
</tr>
<tr>
<td>
<p align="left">500</p>
</td>
<td>
<p align="left">Internal server error</p>
</td>
</tr>
<tr>
<td>
<p align="left">501</p>
</td>
<td>
<p align="left">Not implemented</p>
</td>
</tr>
<tr>
<td>
<p align="left">502</p>
</td>
<td>
<p align="left">Bad gateway</p>
</td>
</tr>
<tr>
<td>
<p align="left">503</p>
</td>
<td>
<p align="left">Service unavailable</p>
</td>
</tr>
<tr>
<td>
<p align="left">504</p>
</td>
<td>
<p align="left">Gateway timeout</p>
</td>
</tr>
<tr>
<td>
<p align="left">505</p>
</td>
<td>
<p align="left">HTTP version not supported</p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"> </p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年02月26号 -- <a href="http://ourapache.com/archives/184" title="Apache日志文件（配置和管理）">Apache日志文件（配置和管理）</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/176" title="网站服务器(Apache)的日志与监视">网站服务器(Apache)的日志与监视</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/172" title="查询并禁止apache中异常访问量的用户">查询并禁止apache中异常访问量的用户</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/227" title="通过SNMP协议来监视Apache服务器">通过SNMP协议来监视Apache服务器</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/224" title="监视并记录Apache网站服务器的运行">监视并记录Apache网站服务器的运行</a></li><li>2009年02月11号 -- <a href="http://ourapache.com/archives/130" title="实时跟踪log变化的工具Apachetop">实时跟踪log变化的工具Apachetop</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/117" title="让Apache按日期保存日志数据">让Apache按日期保存日志数据</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/primary" title="Apache初级应用" rel="tag">Apache初级应用</a>, <a href="http://ourapache.com/archives/tag/log" title="log" rel="tag">log</a>, <a href="http://ourapache.com/archives/tag/%e6%97%a5%e5%bf%97" title="日志" rel="tag">日志</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/243/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过SNMP协议来监视Apache服务器</title>
		<link>http://ourapache.com/archives/227</link>
		<comments>http://ourapache.com/archives/227#comments</comments>
		<pubDate>Mon, 09 Mar 2009 06:45:52 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache高级应用]]></category>
		<category><![CDATA[SNMP]]></category>
		<category><![CDATA[日志]]></category>
		<category><![CDATA[监视]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=227</guid>
		<description><![CDATA[    SNMP 是简单网管协议，支持SNMP的服务器或网络设备可以被OpenView、Tivoli等网管软件统一管理，目前有很多开源的SNMP模块可以加装到 Apache网站服务器之上，对于Apache 1.3版来讲，mod_snmp模块可以支持第1版和2版的SNMP协议；对于Apache 2版来讲，mod_apache_snmp模块可以编译成Apache的DSO直接支持第1版、第2版和第3版的SNMP协议。有了SNMP模块，外部网管软件就可以对Apache网站服务器的各种实时性能参数进行查看了，这些参数包含“服务器连续在线时间、平均负载、一段时间内的错误数、提供网站服务的字节数和连接请求数”。SNMP模块遇到突然激增的并发连接请求数时会向控制台报警。管理SNMP资源的开源工具软件有：“net-snmp, OpenNMS,Najios等”。]]></description>
			<content:encoded><![CDATA[<p>    <a href="http://ourapache.com/archives/tag/snmp" class="st_tag internal_tag" rel="tag" title="标签 SNMP 下的日志">SNMP</a> 是简单网管协议，支持SNMP的服务器或网络设备可以被OpenView、Tivoli等网管软件统一管理，目前有很多开源的SNMP模块可以加装到 Apache网站服务器之上，对于Apache 1.3版来讲，mod_snmp模块可以支持第1版和2版的SNMP协议；对于Apache 2版来讲，mod_apache_snmp模块可以编译成Apache的DSO直接支持第1版、第2版和第3版的SNMP协议。有了SNMP模块，外部网管软件就可以对Apache网站服务器的各种实时性能参数进行查看了，这些参数包含“服务器连续在线时间、平均负载、一段时间内的错误数、提供网站服务的字节数和连接请求数”。SNMP模块遇到突然激增的并发连接请求数时会向控制台报警。管理SNMP资源的开源工具软件有：“net-<a href="http://ourapache.com/archives/tag/snmp" class="st_tag internal_tag" rel="tag" title="标签 SNMP 下的日志">snmp</a>, OpenNMS,Najios等”。</p>
<p><strong>用开源工具分析日志</strong></p>
<p>    有很多开源和商业版的工具软件可以对产生的Apache日志文件做分析和处理，通常的步骤是：<br />
1.选取一个日志文件。<br />
2.分析日志文件内容。<br />
3.生成包含不同类别内容的统计信息网页输出。</p>
<p>    Webalizer(<a onclick="pageTracker._trackPageview('/outbound/article/www.mrunix.net');" href="http://www.mrunix.net/webalizer/">http://www.mrunix.net/webalizer/</a>)和AWStats(<a onclick="pageTracker._trackPageview('/outbound/article/awstats.sf.net');" href="http://awstats.sf.net/">http://awstats.sf.net</a>)是较为流行的日志文件分析工具；还有一些工具可以记录来访者具体访问路线，比如Vistors和Pathalizer工具，可以分别从<a onclick="pageTracker._trackPageview('/outbound/article/www.hping.org');" href="http://www.hping.org/visitors/">http://www.hping.org/visitors/</a>和<a onclick="pageTracker._trackPageview('/outbound/article/pathalizer.bzzt.net');" href="http://pathalizer.bzzt.net/">http://pathalizer.bzzt.net/</a>下载。</p>
<p><strong>实时监视日志</strong></p>
<p>    使用apachetop命令行工具来显示apache服务器当前的运行状态，类似于Unix等系统下的top命令工具。对流量比较低的Unix- Apache网站也可以使用tail命令来记录实时日志信息，tail -f /logfile/。通过扫描错误日志文件中的记录，分析出恶意连接请求，常用的错误日志文件扫描工具有Logscan和ScanErrLog，可以分别从<a onclick="pageTracker._trackPageview('/outbound/article/www.garand.net');" href="http://www.garand.net/security.php">http://www.garand.net/security.php</a>和<a onclick="pageTracker._trackPageview('/outbound/article/www.librelogiciel.com');" href="http://www.librelogiciel.com/software/">http://www.librelogiciel.com/software/</a>去下载这些工具。</p>
<p><strong>将连接请求日志记录到数据库</strong></p>
<p>    Apache 本身没有将记录转发到数据库的功能，必须要第三方脚本和模块来支持。这里列举几个：mod_<a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">log</a>_sql模块允许将连接请求直接记入MySQL数据库，然后用Apache LogView SQL工具来参看库中的记录；pglogd工具可以记录日志到PostgreSQL数据库中。</p>
<p><strong>将日志文件转存和归档</strong><br />
CustomLog “|bin/rotatelogs /var/logs/apachelog<br />
86400″ common</p>
<p>    如果网站流量较高，日志文件很容易就会变得很大，需要进行转存和归档处理。转存日志文件时需要压缩和保存，在线进行这项工作可以使用Apache提供的rotatelogs来完成，类似工具还可以在<a onclick="pageTracker._trackPageview('/outbound/article/cronolog.org');" href="http://cronolog.org/">http://cronolog.org/</a>上找到。例子中用rotatelogs工具将每天的日志做了转存和归档处理，一天共有86400秒。查看Apache帮助文件可以了解更多的rotatelogs工具参数。注意如果rotatelogs工具所在的目录名含有空格，则需要用跳转符号\来指定。</p>
<p><strong>IP地址和域名之间对应处理</strong></p>
<p>    将HostNameLookups 设置成on，那么日志记录中将显示来访者所在的域名，设置成on可降低服务器性能。为了解决这一问题，Apache提供了一个事后分析IP地址域名信息的工具logresolve，例如$ logresolve &lt; access_log &gt; resolved_log</p>
<p>    如果用代理服务器或网关设备来完成的网站访问，Apache服务器将只能记录到代理服务器和网关的IP地址和域名。</p>
<p>如何自动启动Apache服务器</p>
<blockquote><p>#!/bin/bash<br />
if [ 'ps -waux | grep -v grep | grep -c httpd' -lt 1<br />
]; then apachectl restart; fi</p></blockquote>
<p>    在windows 平台下以服务方式启动的Aapche遇到意外退出后可以由服务管理器自动自动，Unix平台下需要借助watchdog脚本来实现自动启动功能， watchdog程序专门用来监视其他程序的运行状态，发现被监视的程序退出或停止后可以重新将他们启动。例子中简单的linux脚本将监视系统的进程表，如果网站服务器httpd进程消失，则负责将它重新启动，使用该脚本的条件有2个，首先保证该脚本文件具备可执行权限，第二必须将该文件设置到 cron文件中，使之可以在预定的时间间隔内运行，如果使用Solaris系统，需要将例子中的ps -waux改成ps -ef。用户可以访问<a onclick="pageTracker._trackPageview('/outbound/article/perl.apache.org');" href="http://perl.apache.org/docs/general/control/control.html">http://perl.apache.org/docs/general/control/control.html</a>网页发现更多高级的watchdog类脚本工具，大多数linux发行版自带一些用于Apache的脚本工具。</p>
<p><strong>日志文件的分割和合并</strong></p>
<p>    如果用户的网站环境是用服务器集群来搭建的，通常需要将所有服务器上的日志做合并成单个文件后，才可以进行分析和处理。相似的道理，如果在单台服务器上运行多个虚拟网站，则需要将单个日志文件分割成多个部分供不同的虚拟网站用户去分析。在Apache服务器源码的support/文件夹下可以找到相应的脚本工具split-logfile等。在<a onclick="pageTracker._trackPageview('/outbound/article/www.coker.com.au');" href="http://www.coker.com.au/logtools/">http://www.coker.com.au/logtools/</a>网页可以找到一些其他的日志工具。比如vlogger工具就可以替代cronologs来对单个服务器上的虚拟网站日志进行分别处理，该工具在<a onclick="pageTracker._trackPageview('/outbound/article/n0rp.chemlab.org');" href="http://n0rp.chemlab.org/vlogger/">http://n0rp.chemlab.org/vlogger/</a>下载。</p>
<p>为虚拟网站保存独立的日志文件</p>
<blockquote><p>&lt;virtualhost&gt;<br />
  ServerName vhost1.21nw.com<br />
  CustomLog logs/vhost1.21nw.com_log combined<br />
  ErrorLog logs/vhost2.21nw.com_log<br />
  …….<br />
&lt;/virtual host&gt;</p></blockquote>
<p>    使用CustomLog标志段在Apache配置文件的&lt;Virtualhost&gt;区块内实现虚拟网站日志文件的独立处理。</p>
<blockquote><p>LogFormat “%v %h %l %u %t \”%r\” %&gt;s %b” common_virtualhost<br />
CustomLog logs/access_log common_virtualhost</p></blockquote>
<p>    在Apache全局配置中配置方法，其中的v%负责把提供服务的虚拟网站记录下来，对于配置了很多虚拟网站的单台服务器来说，这种配置不错。如果不想记录虚拟服务器的日志只需要在配置文件中加入”CustomLog /dev/null”就可以了。</p>
<p><strong>日志文件中常见的条目</strong></p>
<p>缺少favicon.ico文件，该文件可在浏览器的标题栏显示网站的个性图案；<br />
缺少robots.txt文件，利于站点复制工具和搜索引擎使用；<br />
覆写httpd.pid文件，网站服务器不正常退出后遗留的PID记录文件；<br />
陌生的长记录条，</p>
<blockquote><p>“SEARCH /\x90\x02\xb1\x02\xb1\x02\xb1\x02 …”<br />
“GET /scripts/..%252f../winnt/system32/cmd.exe?/<br />
  c+dir HTTP/1.0…”<br />
“GET /default.ida?NNNNNNN NNNNNNNNNNNNNNNNNN …”</p></blockquote>
<p>    类似的记录条表示访问者请求了网站上根本没有的cmd.exe，root.exe或dir等文件。<br />
日志文件中的一些条目经常反映了那些自动探测网站服务器漏洞的动作，多数来源于针对IIS网站服务器的蠕虫和恶意程序。有时候也会发现一些针对Apache的漏洞，所以为了保证Apache的正常运行，用户应保持经常更新Apache软件。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年06月1号 -- <a href="http://ourapache.com/archives/243" title="玩转apache之日志">玩转apache之日志</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/224" title="监视并记录Apache网站服务器的运行">监视并记录Apache网站服务器的运行</a></li><li>2009年02月26号 -- <a href="http://ourapache.com/archives/184" title="Apache日志文件（配置和管理）">Apache日志文件（配置和管理）</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/176" title="网站服务器(Apache)的日志与监视">网站服务器(Apache)的日志与监视</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/172" title="查询并禁止apache中异常访问量的用户">查询并禁止apache中异常访问量的用户</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/117" title="让Apache按日期保存日志数据">让Apache按日期保存日志数据</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/advanced" title="Apache高级应用" rel="tag">Apache高级应用</a>, <a href="http://ourapache.com/archives/tag/snmp" title="SNMP" rel="tag">SNMP</a>, <a href="http://ourapache.com/archives/tag/%e6%97%a5%e5%bf%97" title="日志" rel="tag">日志</a>, <a href="http://ourapache.com/archives/tag/%e7%9b%91%e8%a7%86" title="监视" rel="tag">监视</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/227/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>监视并记录Apache网站服务器的运行</title>
		<link>http://ourapache.com/archives/224</link>
		<comments>http://ourapache.com/archives/224#comments</comments>
		<pubDate>Mon, 09 Mar 2009 06:25:29 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache高级应用]]></category>
		<category><![CDATA[日志]]></category>
		<category><![CDATA[监视日志]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=224</guid>
		<description><![CDATA[Apache提供了广泛记录运行时各方面信息的工具。比如有条件性的记录日志，日志循环，确定IP地址等时普遍会遇到的问题。还讲解很多用于检测您的Apache服务器状态以及分析其日志的捆绑的第三方模块和工具。]]></description>
			<content:encoded><![CDATA[<p> Apache提供了广泛记录运行时各方面信息的工具。比如有条件性的记录日志，日志循环，确定IP地址等时普遍会遇到的问题。还讲解很多用于检测您的Apache服务器状态以及分析其日志的捆绑的第三方模块和工具。</p>
<p>默认的Apache日志文件</p>
<p>    Apache提供很多检测和日志工具来追踪服务器的正确运行。默认的Apache配置提供两个日志文件，放置在安装目录下的日志目录里面。</p>
<p>access_<a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">log</a> 这个文件（在windows下对应access.log文件）包含了服务器已经处理过的请求的信息，比如说请求的URL，客户端的IP地址，请求是否被成功完成等。error_<a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">log</a> 这个文件（在windows下对应error.log文件）包含了与错误情况相关的信息，以及服务器生命周期中不同的大事件。</p>
<p>创建日志格式</p>
<blockquote><p>LogFormat “%h %l %u %t “%r” %&gt;s %b” common<br />
LogFormat “%h %l %u %t “%r” %&gt;s %b”    “%{Referer}i” “%{User-agent}i”” combined</p></blockquote>
<p>    LogFormat 指令允许你告诉Apache你想要记录请求的哪些方面。而你仍需附加的指令来告诉Apache在哪里记录那些信息，这在下一章中将会介绍。下面的例子显示了两种最受欢迎的格式的配置：普通日志格式和整合日志格式。当Apache收到一个请求，他将会用相应的请求属性来替代以%为前缀的每一个域。如果您正在使用普通日志格式，您的日志文件里的每一项输入看起来都将是这样的：</p>
<blockquote><p>192.168.200.4 &#8211; someuser [12/Jun/2005:08:33:34    +0500] “GET /example.png HTTP/1.0″ 200 1234</p></blockquote>
<p>    如果您正在使用整合日志格式，您的日志文件里的每一项输入看起来则都将是这样的：</p>
<blockquote><p>192.168.200.4 &#8211; someuser [12/Jun/2005:08:33:34     +0500] “GET /example.png HTTP/1.0″ 200 1234<br />
    <a onclick="pageTracker._trackPageview('/outbound/article/www.example.com');" href="http://www.example.com/index.html">http://www.21nw.com/index.html</a> “Mozilla/5.0    (Windows; U; Windows NT 5.1; en-US; rv:1.7.7)”</p></blockquote>
<p>    尽管有附件提供日志格式的详尽索引，下表描述了一些最为重要的域：</p>
<blockquote><p># %h: 客户端（例如，浏览器）向服务器发出连接请求时自己的当时的IP地址或域名(需开启HostNameLookups)。<br />
# %u: 使用HTTP方式认证用户时，记录下的用户的编号。<br />
# %t: 服务器接受到连接请求的时间。<br />
# %r: 客户端发出的原始连接请求中的文本信息，包含所使用的HTTP方法。<br />
# %&gt;s: 服务器应答浏览器后的返回状态代码，200表示请求成功。.<br />
# %b: 服务器应答浏览器发出的单个请求的回传对象的内容大小（字节为单位），不统计数据包头部字节。<br />
整合日志格式在普通日志格式的基础上扩展出了两个附加的域。定义为：<br />
# %{Referer}i: 连接请求数据包包头，包含指向当前页面的文档关联信息。<br />
# %{User-agent}i: 用户代理连接请求数据包包头，包含客户浏览器的信息。</p></blockquote>
<p>创建一个自定义日志文件</p>
<blockquote><p>CustomLog logs/access_log common<br />
TransferLog logs/sample.log</p></blockquote>
<p>    您可能会想创建Apache自带以外的新的日志文件。下面的例子将运用CustomLog来创建一个新的日志文件，并保存由一个之前定义好的日志格式，即前一章提到的common，所定义的信息。您还可以用格式本身的定义来替换昵称。一个附加的，更为简单的指令是Transferlog，它只接受最后一个 LogFormat指令提供的定义。</p>
<p>重导向日志到一个外部的程序</p>
<blockquote><p>TransferLog “|bin/rotatelogs /var/logs/apachelog 86400″</p></blockquote>
<p>    你也可以用CustomLog或TransferLog将日志的输出重导向（输出）到一个外部的程序，而不是一个文件。要做到这一点，首先您需要以输出字符 “|”开头，跟着是接收日志标准输入信息的程序之路经。本例运用Apache自带的rotatelogs程序，在稍后的章节中会对其有所介绍。</p>
<p>    当有一个外部程序被使用，它将作为启动httpd的用户被运行。如果服务器是被超级管理员所启动，它就会是超级管理员，完全确保这个程序是安全的。并且，当进入一个非Unix平台上的一个文件路径时，需要小心确保只有正斜杠被使用，即使这个平台可能是允许使用反斜杠的。总的来说，在整个配置文件中总是使用正斜杠是个好主意。</p>
<p>有条件的日志请求</p>
<blockquote><p>SetEnvIf Request_URI “(.gif|.jpg)$” image<br />
CustomLog logs/access_log common env=!image<br />
SetEnvIf Remote_Addr 192.168.200.5 specialmachine<br />
CustomLog logs/special_access_log common env=specialmachine</p></blockquote>
<p>    你可以根据可变的环境决定是否记录一个请求。这种可变可以根据许多参数，比如客户端的IP地址或请求中某个头部的存在，事先设置好。正如本例中所显示， CustomLog指令可以将可变的环境作为第三个参数来接受。如果存在可变的环境，它就将被记录，否则就不会。如果这个可变的环境被一个”!”开头否定，那么不存在可变的环境将会被记录。本例将告诉您如何避免在日志里以GIF和JPEG的格式记录图像，及如何从一个特定的IP地址记录请求道一个单独的日志文件。另一个例子请参加下一节。</p>
<p>谁在连接你的网站</p>
<blockquote><p>SetEnvIfNoCase Referer www.21nw.com internalreferral<br />
LogFormat “%{Referer}i -&gt; %U” referer<br />
CustomLog logs/referer.log referer env=!internalreferral</p></blockquote>
<p>    可以通过记录Referer的值来检测哪些人连接了你的网站，Referer变量位于用户发送连接请求数据包的头部，数据包头中还包含了用户访问的目的网站的URL地址。通过这种方法可以记录下绝大部分网站访问者。也可以把来自特定网站(<a href="http://www.21nw.com">www.21nw.com</a>)地址段的来访者排除出日志记录文件。</p>
<p>利用模块参数(mod_status)来监视Apache服务器</p>
<blockquote><p>&lt;location /server-status&gt;<br />
  SetHandler server-status<br />
  Order Deny,Allow<br />
  Deny from all<br />
  Allow from 192.168.0<br />
&lt;/location&gt;</p></blockquote>
<p>    Apache 服务器中可以使用的功能模块很多，有服务器内置的也有外挂的，这些模块工作的状态和性能就是通过mod_status参数来记录的，记录的内容有“哪些模块参与了网站应答服务、哪些模块处于空闲状态、服务器的开启/关闭时间。正在处理的连接请求数和访问者数量(需要指定ExtendedStatus记号) -该模块记录对高负荷网站服务器性能有很大影响”。例子中记录的模块状态统计结果可以用浏览器访问<a onclick="pageTracker._trackPageview('/outbound/article/www.example.com');" href="http://www.example.com/server-status">http://www.21nw.com/server-status</a>页面来查看。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年06月1号 -- <a href="http://ourapache.com/archives/243" title="玩转apache之日志">玩转apache之日志</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/227" title="通过SNMP协议来监视Apache服务器">通过SNMP协议来监视Apache服务器</a></li><li>2009年02月26号 -- <a href="http://ourapache.com/archives/184" title="Apache日志文件（配置和管理）">Apache日志文件（配置和管理）</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/176" title="网站服务器(Apache)的日志与监视">网站服务器(Apache)的日志与监视</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/172" title="查询并禁止apache中异常访问量的用户">查询并禁止apache中异常访问量的用户</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/117" title="让Apache按日期保存日志数据">让Apache按日期保存日志数据</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/advanced" title="Apache高级应用" rel="tag">Apache高级应用</a>, <a href="http://ourapache.com/archives/tag/%e6%97%a5%e5%bf%97" title="日志" rel="tag">日志</a>, <a href="http://ourapache.com/archives/tag/%e7%9b%91%e8%a7%86%e6%97%a5%e5%bf%97" title="监视日志" rel="tag">监视日志</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/224/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache日志文件（配置和管理）</title>
		<link>http://ourapache.com/archives/184</link>
		<comments>http://ourapache.com/archives/184#comments</comments>
		<pubDate>Thu, 26 Feb 2009 04:07:19 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[日志]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=184</guid>
		<description><![CDATA[Apache日志文件（配置和管理）]]></description>
			<content:encoded><![CDATA[<p><strong>1.安全警告：</strong></p>
<p>任何人只要对Apache存放日志文件的目录具有写权限，也就当然地可以获得启动Apache的用户(通常是root)的权限，绝对不要随意给予任何人存放日志文件目录的写权限。</p>
<p><strong>2.错误日志(Error <a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">Log</a>)</strong></p>
<p>Apache httpd将在这个文件中存放诊断信息和处理请求中出现的错误，由于这里经常包含了出错细节以及如何解决，如果服务器启动或运行中有问题，首先就应该查看这个错误日志</p>
<p>错误日志通常被写入一个文件(unix系统上一般是error_log ，Windows和OS/2上一般是error.log)。在unix系统中，错误日志还可能被重定向到syslog或通过管道操作传递给一个程序。</p>
<p><strong>3.访问日志(Access Log)</strong></p>
<p>记录服务器所处理的所有请求，其文件名和位置取决于CustomLog指令，LogFormat指令可以简化日志的内容。</p>
<p>不同版本的Apache httpd使用了不同的模块和指令来控制对访问的记录，包括mod_log_referer, mod_log_agent和TransferLog指令。现在，CustomLog指令包含了旧版本中相关指令的所有功能。</p>
<p><strong>通用日志格式</strong>(Common Log Format)，下面是一个典型的记录格式：<br />
LogFormat “%h %l %u %t \\”%r\\” %&gt;s %b” common<br />
CustomLog logs/access_log common<br />
它定义了一种特定的记录格式字符串，并给它起了个别名叫common ，其中的”%”指示服务器用某种信息替换，其他字符则不作替换。引号(”)必须加反斜杠转义，以避免被解释为字符串的结束。格式字符串还可以包含特殊的控制符，如换行符”\\n” 、制表符”\\t”。<br />
CustomLog指令建立一个使用指定别名的新日志文件，除非其文件名是以斜杠开头的绝对路径，否则其路径就是相对于ServerRoot的相对路径。</p>
<p><strong>组合日志格式</strong>(Combined Log Format)，形式如下：<br />
LogFormat “%h %l %u %t \\”%r\\” %&gt;s %b \\”%{Referer}i\\” \\”%{User-agent}i\\”” combined<br />
CustomLog log/access_log combined<br />
这种格式与通用日志格式类似，但是多了两个 %{header}i 项，其中的header可以是任何请求头。</p>
<p><strong>多文件访问日志</strong>：<br />
可以简单地在配置文件中用多个CustomLog指令来建立多文件访问日志。如下例，既记录基本的CLF信息，又记录提交网页和浏览器的信息，最后两行CustomLog示范了如何模拟ReferLog和AgentLog指令的效果。<br />
LogFormat “%h %l %u %t \\”%r\\” %&gt;s %b” common<br />
CustomLog logs/access_log common<br />
CustomLog logs/referer_log “%{Referer}i -&gt; %U”<br />
CustomLog logs/agent_log “%{User-agent}i”<br />
此例也说明了，记录格式可以直接由CustomLog指定，而并不一定要用LogFormat起一个别名。</p>
<p><strong>条件日志</strong>：<br />
许多时候，根据与请求特征相关的环境变量来有选择地记录某些客户端请求会带来便利。首先，需要使用SetEnvIf指令来设置特定的环境变量以标识符合某种特定条件的请求，然后用CustomLog指令的 env= 子句，根据这些环境变量来决定记录或排除特定的请求。例如：<br />
# 不记录本机发出的请求<br />
SetEnvIf Remote_Addr “127\\.0\\.0\\.1″ dontlog<br />
# 不记录对robots.txt文件的请求<br />
SetEnvIf Request_URI “^/robots\\.txt$” dontlog<br />
# 记录其他请求<br />
CustomLog logs/access_log common env=!dontlog</p>
<p><strong>4.日志滚动</strong></p>
<p>由于Apache会保持日志文件的打开，并持续写入信息，因此服务器运行期间不能执行滚动操作。移动或者删除日志文件以后，必须重新启动服务器才能让它打开新的日志文件。</p>
<p>用优雅的(graceful)方法重新启动，可以使服务器启用新的日志文件，而不丢失原来尚未写入的信息。为此，有必要等待一段时间，让服务器完成正在处理的请求，并将记录写入到原来的日志文件。以下是一个典型的日志滚动和为节省存储空间而压缩旧日志的例子：<br />
mv access_log access_log.old<br />
mv error_log error_log.old<br />
apachectl graceful<br />
sleep 600<br />
gzip access_log.old error_log.old</p>
<p><strong>5.管道日志</strong></p>
<p>Apache httpd可以通过管道将访问记录和出错信息传递给另一个进程，而不是写入一个文件，由于无须对主服务器进行编程，这个功能显著地增强了日志的灵活性。只要用管道操作符”|”后面跟一个可执行文件名，就可以使这个程序从标准输入设备获得事件记录。Apache在启动时，会同时启动这个管道日志进程，并且在运行过程中，如果这个进程崩溃了，会重新启动这个进程(所以我们称这个技术为”可靠管道日志”)。</p>
<p>管道日志进程由其父进程Apache httpd产生，并继承其权限，这意味着管道进程通常是作为root运行的，所以保持这个程序简单而安全极为重要。（yes）</p>
<p>管道日志的一种重要用途是，允许日志滚动而无须重新启动服务器。为此，服务器提供了一个简单的程序rotatelogs 。每24小时滚动一次日志的例子如下：<br />
CustomLog “|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400″ common<br />
注意：引号用于界定整个管道命令行。虽然这是针对访问日志的，但是其用法对于其他日志也一样。</p>
<p>在其他站点，有一个类似但更灵活的日志滚动程序叫cronolog 。</p>
<p>如果有较简单的离线处理日志的方案，就不应该使用条件日志和管道日志，即使它们非常强大。</p>
<p><strong>6.虚拟主机日志</strong></p>
<p>如果服务器配有若干虚拟主机，那么还有几个控制日志文件的功能。首先，可以把日志指令放在&lt;VirtualHost&gt;段之外，让它们与主服务器使用同一个访问日志和错误日志来记录所有的请求和错误，但是这样就不能方便的获得每个虚拟主机的信息了。</p>
<p>如果把CustomLog或ErrorLog指令放在&lt;VirtualHost&gt;段内，所有对这个虚拟主机的请求和错误信息会被记录在其私有的日志文件中，那些没有在&lt;VirtualHost&gt;段内使用日志指令的虚拟主机将仍然和主服务器使用同一个日志。这种方法对虚拟主机较少的服务器很有用，但虚拟主机非常多时，就会带来管理上的困难，还经常会产生文件描述符短缺的问题。</p>
<p><strong>7.其他日志文件</strong><br />
略。。。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年06月1号 -- <a href="http://ourapache.com/archives/243" title="玩转apache之日志">玩转apache之日志</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/176" title="网站服务器(Apache)的日志与监视">网站服务器(Apache)的日志与监视</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/172" title="查询并禁止apache中异常访问量的用户">查询并禁止apache中异常访问量的用户</a></li><li>2010年03月9号 -- <a href="http://ourapache.com/archives/318" title="Apache2中俩种设置PHP的异同">Apache2中俩种设置PHP的异同</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/227" title="通过SNMP协议来监视Apache服务器">通过SNMP协议来监视Apache服务器</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/224" title="监视并记录Apache网站服务器的运行">监视并记录Apache网站服务器的运行</a></li><li>2009年02月11号 -- <a href="http://ourapache.com/archives/130" title="实时跟踪log变化的工具Apachetop">实时跟踪log变化的工具Apachetop</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/123" title="Apache高级配置中文详解">Apache高级配置中文详解</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/117" title="让Apache按日期保存日志数据">让Apache按日期保存日志数据</a></li><li>2009年01月22号 -- <a href="http://ourapache.com/archives/66" title="Apache配置文件(httpd.conf)中文说明">Apache配置文件(httpd.conf)中文说明</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/log" title="log" rel="tag">log</a>, <a href="http://ourapache.com/archives/tag/%e6%97%a5%e5%bf%97" title="日志" rel="tag">日志</a>, <a href="http://ourapache.com/archives/tag/%e9%85%8d%e7%bd%ae" title="配置" rel="tag">配置</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/184/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网站服务器(Apache)的日志与监视</title>
		<link>http://ourapache.com/archives/176</link>
		<comments>http://ourapache.com/archives/176#comments</comments>
		<pubDate>Wed, 25 Feb 2009 10:20:53 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[日志]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=176</guid>
		<description><![CDATA[Apache提供很多检测和日志工具来追踪服务器的正确运行。默认的Apache配置提供两个日志文件，放置在安装目录下的日志目录里面。access_log这个文件（在windows下对应access.log文件）包含了服务器已经处理过的请求的信息，比如说请求的URL，客户端的IP地址，请求是否被成功完成等。error_log 这个文件（在windows下对应error.log文件）包含了与错误情况相关的信息，以及服务器生命周期中不同的大事件。]]></description>
			<content:encoded><![CDATA[<p><strong>默认的Apache日志文件</strong></p>
<p>Apache提供很多检测和日志工具来追踪服务器的正确运行。默认的Apache配置提供两个日志文件，放置在安装目录下的日志目录里面。access_log这个文件（在windows下对应access.log文件）包含了服务器已经处理过的请求的信息，比如说请求的URL，客户端的IP地址，请求是否被成功完成等。error_<a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">log</a> 这个文件（在windows下对应error.log文件）包含了与错误情况相关的信息，以及服务器生命周期中不同的大事件。</p>
<p><strong>创建日志格式</strong></p>
<blockquote><p>LogFormat “%h %l %u %t \”%r\” %&gt;s %b” common<br />
LogFormat “%h %l %u %t \”%r\” %&gt;s %b”<br />
\”%{Referer}i\” \”%{User-agent}i\”" combined</p></blockquote>
<p>LogFormat指令允许你告诉Apache你想要记录请求的哪些方面。而你仍需附加的指令来告诉Apache在哪里记录那些信息，这在下一章中将会介绍。下面的例子显示了两种最受欢迎的格式的配置：普通日志格式和整合日志格式。当Apache收到一个请求，他将会用相应的请求属性来替代以%为前缀的每一个域。如果您正在使用普通日志格式，您的日志文件里的每一项输入看起来都将是这样的：</p>
<blockquote><p>192.168.200.4 &#8211; someuser [12/Jun/2005:08:33:34<br />
+0500] “GET /example.png HTTP/1.0&#8243; 200 1234</p></blockquote>
<p>如果您正在使用整合日志格式，您的日志文件里的每一项输入看起来则都将是这样的：</p>
<blockquote><p>192.168.200.4 &#8211; someuser [12/Jun/2005:08:33:34<br />
+0500] “GET /example.png HTTP/1.0&#8243; 200 1234<br />
<a href="http://www.example.com/index.html" target="_blank"><span style="color: #0000ff;">http://www.example.com/index.html</span></a> “Mozilla/5.0<br />
(Windows; U; Windows NT 5.1; en-US; rv:1.7.7)”</p></blockquote>
<p>尽管有附件提供日志格式的详尽索引，下表描述了一些最为重要的域：</p>
<blockquote><p># %h: 客户端（例如，浏览器）向服务器发出连接请求时自己的当时的IP地址或域名(需开启HostNameLookups)。<br />
# %u: 使用HTTP方式认证用户时，记录下的用户的编号。<br />
# %t: 服务器接受到连接请求的时间。<br />
# %r: 客户端发出的原始连接请求中的文本信息，包含所使用的HTTP方法。<br />
# %&gt;s: 服务器应答浏览器后的返回状态代码，200表示请求成功。.<br />
# %b: 服务器应答浏览器发出的单个请求的回传对象的内容大小（字节为单位），不统计数据包头部字节。<br />
整合日志格式在普通日志格式的基础上扩展出了两个附加的域。定义为：<br />
# %{Referer}i: 连接请求数据包包头，包含指向当前页面的文档关联信息。<br />
# %{User-agent}i: 用户代理连接请求数据包包头，包含客户浏览器的信息。</p></blockquote>
<p><strong>创建一个自定义日志文件</strong></p>
<blockquote><p>CustomLog logs/access_log common<br />
TransferLog logs/sample.log</p></blockquote>
<p>您可能会想创建Apache自带以外的新的日志文件。下面的例子将运用CustomLog来创建一个新的日志文件，并保存由一个之前定义好的日志格式，即前一章提到的common，所定义的信息。您还可以用格式本身的定义来替换昵称。一个附加的，更为简单的指令是Transferlog，它只接受最后一个LogFormat指令提供的定义。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年06月1号 -- <a href="http://ourapache.com/archives/243" title="玩转apache之日志">玩转apache之日志</a></li><li>2009年02月26号 -- <a href="http://ourapache.com/archives/184" title="Apache日志文件（配置和管理）">Apache日志文件（配置和管理）</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/172" title="查询并禁止apache中异常访问量的用户">查询并禁止apache中异常访问量的用户</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/227" title="通过SNMP协议来监视Apache服务器">通过SNMP协议来监视Apache服务器</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/224" title="监视并记录Apache网站服务器的运行">监视并记录Apache网站服务器的运行</a></li><li>2009年02月11号 -- <a href="http://ourapache.com/archives/130" title="实时跟踪log变化的工具Apachetop">实时跟踪log变化的工具Apachetop</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/117" title="让Apache按日期保存日志数据">让Apache按日期保存日志数据</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/log" title="log" rel="tag">log</a>, <a href="http://ourapache.com/archives/tag/%e6%97%a5%e5%bf%97" title="日志" rel="tag">日志</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/176/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>查询并禁止apache中异常访问量的用户</title>
		<link>http://ourapache.com/archives/172</link>
		<comments>http://ourapache.com/archives/172#comments</comments>
		<pubDate>Wed, 25 Feb 2009 10:17:50 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache初级应用]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[日志]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=172</guid>
		<description><![CDATA[Apache中的异常访问，通常指的是频繁、大量访问的用户，通过apache的log，结合linux下的几个命令，可以分析这些用户，并通过apache的配置文件来禁止他们访问。]]></description>
			<content:encoded><![CDATA[<p>Apache中的异常访问，通常指的是频繁、大量访问的用户，通过apache的log，结合linux下的几个命令，可以分析这些用户，并通过apache的配置文件来禁止他们访问。</p>
<p>首先，更改apache的log方式，不记录一些图像、css等文件，这样在log中每一行基本上都能对应一次访问，如果不去除图像等文件的记录，正常用户访问一个页面，同时也会下载页面上的图像、css等文件，会产生多条log记录，影响计数的结果。在apache的conf文件中增加如下配置：</p>
<p>SetEnvIfNoCase Request_URI \.css$ useless-file<br />
SetEnvIfNoCase Request_URI \.gif$ useless-file<br />
SetEnvIfNoCase Request_URI \.ico$ useless-file<br />
SetEnvIfNoCase Request_URI \.jpg$ useless-file<br />
SetEnvIfNoCase Request_URI \.js$ useless-file<br />
CustomLog logs/fwolf.com/access.<a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">log</a> combined env=!useless-file</p>
<p>这样就可以了，关于SetEnvIf的其他用法，可以参见Apache文档中SetEnvIf和Environment Variables in Apache部分。</p>
<p>接下来，经过一段时间的运行，我们就可以分析log文件中访问量最大的用户了，只需要一条命令：</p>
<p>cat access.log |awk &#8216;{print $1}&#8217;| sort | uniq -c |sort -n</p>
<p>一点点的来看：</p>
<p>cat就不用说了；<br />
awk的作用，就是把第一列，也就是客户端ip地址分拣出来；<br />
第一个sort，是把分拣出来的ip地址排序，这样相同的ip地址会排在一起<br />
uniq是一个去除重复值的工具，但是带上-c参数，就可以统计出每个值出现了多少次<br />
最后的sort，把uniq产生的结果进行排序，按照-n这个参数的默认设置，最大的排在最下面。<br />
所以，我们得到的结果应该是这样的：</p>
<p>&#8230;&#8230;<br />
2040 219.148.106.198<br />
2047 218.12.78.14<br />
2149 218.12.26.233<br />
2205 121.28.4.34</p>
<p>第一列就是访问次数，第二列是ip地址，再回去对照log文件中的详细内容，如果发现哪个访问量大户是某某机器人的话，就可以禁止掉了，还是修改apache的conf文件：</p>
<p>&lt;Directory /&gt;<br />
    Order Deny,Allow<br />
    Deny from 219.143.69.2<br />
    Deny from 218.12.26.233<br />
    Deny from 61.135.162.51<br />
    Allow from all<br />
&lt;/Directory&gt;</p>
<p>如此反复监测、设置，直到没有人捣乱为止。</p>
<p>同理，如果想查看反复刷新查看某一页面的用户，可以用如下命令：</p>
<p>grep “GET /url/to/some/file” access.log |awk &#8216;{print $1}&#8217; |sort |uniq -c |sort -n</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年06月1号 -- <a href="http://ourapache.com/archives/243" title="玩转apache之日志">玩转apache之日志</a></li><li>2009年02月26号 -- <a href="http://ourapache.com/archives/184" title="Apache日志文件（配置和管理）">Apache日志文件（配置和管理）</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/176" title="网站服务器(Apache)的日志与监视">网站服务器(Apache)的日志与监视</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/227" title="通过SNMP协议来监视Apache服务器">通过SNMP协议来监视Apache服务器</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/224" title="监视并记录Apache网站服务器的运行">监视并记录Apache网站服务器的运行</a></li><li>2009年02月11号 -- <a href="http://ourapache.com/archives/130" title="实时跟踪log变化的工具Apachetop">实时跟踪log变化的工具Apachetop</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/117" title="让Apache按日期保存日志数据">让Apache按日期保存日志数据</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/primary" title="Apache初级应用" rel="tag">Apache初级应用</a>, <a href="http://ourapache.com/archives/tag/log" title="log" rel="tag">log</a>, <a href="http://ourapache.com/archives/tag/%e6%97%a5%e5%bf%97" title="日志" rel="tag">日志</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/172/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让Apache按日期保存日志数据</title>
		<link>http://ourapache.com/archives/117</link>
		<comments>http://ourapache.com/archives/117#comments</comments>
		<pubDate>Tue, 10 Feb 2009 07:01:27 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache基础知识]]></category>
		<category><![CDATA[日志]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=117</guid>
		<description><![CDATA[今天是2007年3月27日，那今天的日志文件存储名为20070327.log,明天的存储名就是20070328.log，这样循环下去。]]></description>
			<content:encoded><![CDATA[<p>今天是2007年3月27日，那今天的日志文件存储名为20070327.<a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">log</a>,明天的存储名就是20070328.<a href="http://ourapache.com/archives/tag/log" class="st_tag internal_tag" rel="tag" title="标签 log 下的日志">log</a>，这样循环下去。</p>
<p>方法如下：</p>
<p>Luinx<br />
CustomLog “|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/%Y_%m_%d.access.log 86400 480″ common<br />
其中/usr/local/是你安装apache的路径,这样每一天生成一个日志文件</p>
<p>windows<br />
CustomLog “|bin/rotatelogs.exe -l youapachelogdir/access%Y%m%d.log 86400″ common</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年06月1号 -- <a href="http://ourapache.com/archives/243" title="玩转apache之日志">玩转apache之日志</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/227" title="通过SNMP协议来监视Apache服务器">通过SNMP协议来监视Apache服务器</a></li><li>2009年03月9号 -- <a href="http://ourapache.com/archives/224" title="监视并记录Apache网站服务器的运行">监视并记录Apache网站服务器的运行</a></li><li>2009年02月26号 -- <a href="http://ourapache.com/archives/184" title="Apache日志文件（配置和管理）">Apache日志文件（配置和管理）</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/176" title="网站服务器(Apache)的日志与监视">网站服务器(Apache)的日志与监视</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/172" title="查询并禁止apache中异常访问量的用户">查询并禁止apache中异常访问量的用户</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/basic" title="Apache基础知识" rel="tag">Apache基础知识</a>, <a href="http://ourapache.com/archives/tag/%e6%97%a5%e5%bf%97" title="日志" rel="tag">日志</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/117/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

