Home

zhangyiqun

Thoughts, stories and ideas.

Notes Blog Archives About
24 Feb 2009

玩转apache之日志

 

作者:张逸群

Mail:jeantoe@gmail.com

引言

要有效地管理Web服务器,就有必须了解服务器的状态、性能以及出现的问题。Apache提供了非常全面而灵活的日志记录功能。本文将阐述如何配置文件以及如何理解日志内容。

1.使用combined获取更详细的日志

编辑httpd.conf文件(下面几乎都是更改这个文件),搜索CustomLog

CustomLog logs/access_log combined

用这个格式不会有什么损失,而且还能获得一些额外的信息(referer和user-agent)。

2.让错误信息更全面

通过定义loglevel来实现

搜索LogLevel

日志级别如下。(debug产生的信息最多。emerg产生的信息最少)

Level

描述

例子

emerg

紧急(系统无法使用)

“Child cannot open lock file. Exiting”

alert

必须立即采取措施

“getpwuid: couldn’t determine user name from uid”

crit

致命情况

“socket: Failed to get a socket, exiting child”

error

错误情况

“Premature end of script headers”

warn

警告情况

“child process 1234 did not exit, sending another SIGHUP”

notice

一般重要情况

“httpd: caught SIGBUS, attempting to dump core in …”

info

普通信息

“Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)…”

debug

调试信息

“Opening config file …”

 

3.记录以POST方式传送的数据

使用mod_secutiry,增加如下配置

SecAuditLogType Concurrent

SecAuditLogStorageDir /var/www/audit_log/data/

SecAuditLog /var/www/audit_log/index

SecAuditLogParts ABCFHZ

注:

post方式与get方式

1、采用post方式传输数据时,不需要在URL中显示出来,而get方式要在URL当中进行显示(不安全性).

2、post方式的传输数据量较大,理论上来说是没有限制的,而get方式由于受到UEL长度的限制,只能传递GET方式提交的数据最多只能有1024字节.

3、post顾名思义,就是为了将数据传送到服务器端,Get就是为了从服务器端取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.post的信息作为http请求的内容,而Get是在Http头部传输的。

我们的form表单的method方法,post,get.它在页面传值的时候的区别也就是上面提到的三点.

4.记录cookie

记录从客户端收到的cookie

CustomLog logs/cookies_in.log “%{UNIQUE_ID}e %{Cookie}i”

CustomLog logs/cookies2_in.log “%{UNIQUE_ID}e %{Cookie2}i”

记录由服务器发送的cookie

CustomLog logs/cookies_out.log “%{UNIQUE_ID}e %{Set-Cookie}o”

CustomLog logs/cookies2_out.log “%{UNIQUE_ID}e %{Set-Cookie2}o”

注:本方法记录所有的cookie ,如何区分是个问题。我只在实验的时候用,真实生产环境用的不多。

cookie与Set-cookie标头字段是最常用到的。cookie2与set-cookie对应的字段比较新。

5.忽略来自本站的请求

追踪盗链的时候比较有用。

定义后缀

SetEnvIfNoCase Referer “^http://www.example.com/” 你的网站 local_referrer=1

CustomLog logs/access_log combined env=!local_referrer

注:SetEnvIfNoCase与SetEnvIf相同,但是前者无视大小写。

6.按时间生产日志

有时需要间隔N小时生产一次日志。

CustomLog “ /path/to/rotatelogs /path/to/logs/access_log.%Y-%m-%d 86400″ combined

注:使用了CustomLog和rotatelogs (red hat默认就有)。

使用秒来控制间隔时间。

7.在每月的第一天更新日志文件

在每月的第一天结束上个月的日志文件,同时开始新的记录。

CustomLog "|/usr/bin/cronolog /www/logs/access%Y%m.log" combined

注:需要使用cronolog,十分好用的工具,下载地址请google之。

8.为虚拟主机建立各自的日志

首先,需要将虚拟主机的信息放入日志中。

LogFormat “%v %h %l %u %t \”%r\” %>s %b” vhost

CustomLog logs/multiple_vhost_log vhost

这将用日志的普通格式来创建一个日志文件。但会在每条记录前加上正式的虚拟主机名(就是在ServerName指令中定义的那个)。

现在将日志文件分开(每个虚拟主机一个日志文件)

split-logfile < /logs/multiple_vhost_log

注:split-logfile不是自动安装的,而是在配置过程以后,装在”support”目录下的

附表

9.记录响应请求的ip地址

当服务器有多个ip时想知道是哪个ip响应了请求。

CustomLog logs/served-by.log “%A”

10.记录访客来源

知己知彼,了解访客是从哪个网站过来的。

%{Referer}i

注:默认已经包含在logformat

11.记录访客使用的浏览器

%{User-Agent}i

注:默认已经包含在logformat

12.使用syslog记录apache日志

第一步:配置syslog

/etc/syslog.conf是syslog的配置文件。

里面的每一行都用一个或者多个空格或者TAB隔开,分成两个段

如:

mail.info /var/log/maillog

意思是把日志对象mail的info级别及以上级别的日志记录到/var/log/maillog中去

在这里,前面一段是 : 日志对象.日志级别。后面一段是:日志的记录位置,这个位置可以是文件(如/var/log/maillog),可以是某个TTY(如/dev/tty1)可以是某个登录的用户的控制台 (如用户名jean)也可以是当前所有的下在登录的用户所在的控制台(用*号表示所有用户)还可以是一台远程的主机(@remote_host_ip)

现在加入这一行

local0.info /var/log/apache.log

然后重新启动syslog。service syslog restart

第二步

在apache配置中加入

CustomLog “ logger -t apache -p local0.info” combined

补充

HTTP状态码

编码

描述

Informational 1xx

100

Continue

101

Switching protocols

Successful 2xx

200

OK

201

Created

202

Accepted

203

Nonauthoritative information

204

No content

205

Reset content

206

Partial content

Redirection 3xx

300

Multiple choices

301

Moved permanently

302

Found

303

See other

304

Not modified

305

Use proxy

306

(Unused)

307

Temporary redirect

Client error 4xx

400

Bad request

401

Unauthorized

402

Payment required

403

Forbidden

404

Not found

405

Method not allowed

406

Not acceptable

407

Proxy authentication required

408

Request timeout

409

Conflict

410

Gone

411

Length required

412

Precondition failed

413

Request entity too large

414

Request-URI too long

415

Unsupported media type

416

Requested range not satisfiable

417

Expectation failed

Server error 5xx

500

Internal server error

501

Not implemented

502

Bad gateway

503

Service unavailable

504

Gateway timeout

505

HTTP version not supported

1、除特别说明外,本博客内容皆为原创,可以自由转载传播,但请署名及注明出处,不尊重别人劳动成果的不欢迎;

2、本博客内容遵守“署名-非商业性使用-禁止演绎 2.5 中国大陆”协议;

Notes Blog Archives About