APACHE日志文件

要有效地管理Web服务器,就有必要反馈服务器的活动、性能以及出现的问题。Apache HTTP服务器提供了非常全面而灵活的日志记录功能。本文将阐述如何配置文件以及如何理解日志内容。
任何人只要对 Apache 存放日志文件的目录具有写权限,也就当然地可以获得启动 Apache 的用户 ( 通常是 root) 的权限, 绝对不要 随意给予任何人存放日志文件目录的写权限。细节请参见 安全方面的提示
另外,日志文件可能会包含未加转换的来自用户的信息,用户就有机会恶意插入控制符,所以处理原始日志时应该当心这个问题。
[@more@]
错误日志 (Error Log)
相关模块
相关指令
错误日志是最重要的日志文件,其文件名和位置取决于 ErrorLog 指令。 Apache httpd 将在这个文件中存放诊断信息和处理请求中出现的错误,由于这里经常包含了出错细节以及如何解决,如果服务器启动或运行中有问题,首先就应该查看这个错误日志。
错误日志通常被写入一个文件 (unix 系统上一般是 error_log , Windows 和 OS/2 上一般是 error.log ) 。在 unix 系统中,错误日志还可能被重定向到 syslog 或 通过管道操作传递给一个程序
错误日志的格式相对灵活,并可以附加文字描述。某些信息会出现在绝大多数记录中,一个典型的例子是:
[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test
其中,第一项是错误发生的日期和时间;第二项是错误的严重性, LogLevel 指令使只有高于指定严重性级别的错误才会被记录;第三项是导致错误的 IP 地址;此后是信息本身,在此例中,服务器拒绝了这个客户的访问。服务器在记录被访问文件时,用的是文件系统路径,而不是 Web 路径。
错误日志中会包含类似上述例子的多种类型的信息。此外, CGI 脚本中任何输出到 stderr 的信息会作为调试信息原封不动地记录到错误日志中。
用户可以增加或删除错误日志的项。但是对某些特殊请求,在 访问日志(access log) 中也会有相应的记录,比如上述例子在访问日志中也会有相应的记录,其状态码是 403 ,因为访问日志也可以定制,所以可以从访问日志中得到错误事件的更多信息。
在测试中,对任何问题持续监视错误日志是非常有用的。在 unix 系统中,可以这样做:
tail -f error_log
访问日志 (Access Log)
相关模块
相关指令
访问日志中会记录服务器所处理的所有请求,其文件名和位置取决于 CustomLog 指令, LogFormat 指令可以简化日志的内容。这里阐述如何配置服务器的访问日志。
实施日志管理,首先当然必须产生访问日志,然后才能分析日志从而得到有用的统计信息。日志分析不是 Web 服务器的职责,已超出本文的范畴,更多资料和有关分析工具的信息,可以查看 Open DirectoryYahoo
不同版本的 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
如果有较简单的离线处理日志的方案,就不应该使用条件日志和管道日志,即使它们非常强大。
如果服务器配有若干 虚拟主机 ,那么还有几个控制日志文件的功能。首先,可以把日志指令放在 段之外,让它们与主服务器使用同一个访问日志和错误日志来记录所有的请求和错误,但是这样就不能方便的获得每个虚拟主机的信息了。
如果把 CustomLogErrorLog 指令放在 段内,所有对这个虚拟主机的请求和错误信息会被记录在其私有的日志文件中,那些没有在 段内使用日志指令的虚拟主机将仍然和主服务器使用同一个日志。这种方法对虚拟主机较少的服务器很有用,但虚拟主机非常多时,就会带来管理上的困难,还经常会产生 文件描述符短缺 的问题。
对于访问日志,有一个很好的折衷方案,在同一个访问日志文件中记录对所有主机的访问,而每条记录都注明虚拟主机的信息,日后再把记录拆开存入不同的文件。例如:
LogFormat "%v %l %u %t "%r" %>s %b" comonvhost CustomLog logs/access_log comonvhost
%v 用来附加虚拟主机的信息。有个 split-logfile 程序可以根据不同的虚拟主机信息对日志进行拆分,并将结果存入不同的文件。
相关模块
相关指令
· mod_cgi
· PidFile
记录接收和发送的实际字节数
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 指令。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/1701142/viewspace-975102/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/1701142/viewspace-975102/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值