配置Apache错误和访问日志
Apache是一个开源的跨平台HTTP服务器。
它有很多强大的功能,可以通过各种各样的模块进行扩展。
在管理apacheweb服务器时,最常见的任务之一就是检查日志文件。
了解如何配置和读取日志在解决服务器或者应用程序问题时非常有用,因为它们提供了详细的调试信息。
Apache在两种类型的日志中写入事件记录:访问日志和错误日志。
访问日志包括有关客户端请求的信息,以及有关服务器和应用程序问题的错误日志信息。
本文描述如何配置和读取Apache访问和错误日志。
配置访问日志
apachewebserver在访问日志中为所有已处理的请求生成一个新事件。
每个事件记录都包含一个时间戳,并包含有关客户端和所请求资源的各种信息。
访问日志显示访问者的位置、他们访问的页面、他们在页面上花费的时间等等。
CustomLog指令定义日志文件的位置和日志消息的格式。
CustomLog指令的最基本语法如下:
CustomLog log_file format [condition];
日志文件可以是相对于ServerRoot的,也可以是指向日志文件的完整路径。
日志消息也可以使用管道符号|通过管道传输到另一个程序。
第二个参数format指定日志消息的格式。
它可以是显式格式定义,也可以是LogFormat指令定义的昵称。
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined CustomLog logs/access.log combined
CustomLog logs/access.log "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\""
为了避免同一代码重复多次,最好定义LogFormat指令并将其用作CustomLog指令中的昵称。
有关所有格式字符串和修饰符的完整列表,请查看"mod_log_config"模块文档。
第三个参数[condition]是可选的,只允许您在满足特定条件时写入日志消息。
通常,这是使用环境变量完成的。
条件可以用否定!符号。
例如,如果要排除对要写入日志文件CSS文件的请求,可以使用以下命令:
SetEnvIf Request_URI \.css$css-file CustomLog logs/access.log custom env=!css-file
要更改日志格式,可以定义新的LogFormat指令或者重写默认格式。
通常最好定义一个新的格式。
虽然访问日志提供了非常有用的信息,但它占用磁盘空间并可能影响服务器性能。
如果您的服务器资源不足,并且您的繁忙,您可能需要禁用访问日志。
为此,只需在主服务器配置和虚拟服务器部分注释掉或者删除CustomLog指令。
如果只想关闭一个虚拟主机的访问日志,请将CustomLog指令的第一个参数设置为/dev/null:
CustomLog /dev/null combined
配置错误日志
Apache在错误日志文件中写入有关应用程序和一般服务器错误的消息。
如果您在web应用程序中遇到错误,则首先从错误日志开始解决问题。
ErrorLog指令定义错误日志的名称位置。
其形式如下:
ErrorLog log_file
如果日志文件的路径不是绝对的,则将其设置为相对于ServerRoot。
也可以使用管道符号|将错误消息通过管道传输到另一个程序。
LogLevel参数设置日志记录的级别。
以下是按严重程度列出的级别(从低到高):
trace1-trace8-跟踪消息。
debug调试-调试消息。
info信息-信息性消息。
notice通知-通知。
warn警告-警告。
error错误-处理请求时出错。
crit 关键问题。需要立即采取行动。
alert 警报-警报。必须立即采取行动。
emerg 紧急情况。系统处于不可用状态。
每个日志级别包括更高级别。
例如,如果您将日志级别设置为warn,Apache还会写入错误、crit、alert和emerg消息。
未指定LogLevel参数时,默认为warn。
建议将等级设置为至少暴击。
ErrorLogFormat指令指定错误日志的格式。
在大多数Linux发行版中,Apache服务器使用默认格式,这对于大多数情况来说已经足够了。
虚拟主机和全局日志记录
日志记录行为和文件位置可以全局设置,也可以按虚拟主机设置。
然后在主服务器上下文中设置CustomLog或者ErrorLog指令,服务器将所有日志消息写入相同的访问和错误日志文件。
否则,如果指令放在<;VirtualHost>块中,则只会将该虚拟主机的日志消息写入指定的文件。
<;VirtualHost>块中设置的log指令将覆盖服务器上下文中设置的指令。
没有CustomLog或者ErrorLog指令的虚拟主机将把它们的日志消息写入全局服务器日志。
为了提高可读性,建议为每个虚拟主机设置单独的访问和错误日志文件。
下面是一个例子:
ServerName example.com ServerAlias www.example.com ServerAdmin [email protected] DocumentRoot /var/www/example.com/public LogLevel warn ErrorLog /var/www/example.com/logs/error.log CustomLog /var/www/example.com/logs/access.log combined
无论何时修改配置文件,都必须重新启动Apache服务才能使更改生效。
日志文件的位置
默认情况下,在基于Debian的发行版(如Ubuntu)上,访问和错误日志位于/var/log/apache2目录中。
在CentOS上,日志文件放在/var/log/httpd目录中。
查看Apache日志文件
可以使用cat、less、grep、cut、awk等标准命令打开和解析日志文件。
以下是使用Debian'combine日志格式的访问日志文件中的一个示例记录:
192.168.33.1 - - [08/Jan/2017:21:39:03 +0000] "GET/HTTP/1.1" 200 6169 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
我们来分解一下记录的每个字段的含义:
%h-192.168.33.1-发出请求的客户端的主机名或者IP地址。
%l---远程日志名。
未设置用户名时,此字段显示-。%u---如果请求经过身份验证,则显示远程用户名。
%t-[08/Jan/2017:21:39:03+0000]-本地服务器时间。
"%r"-"GET/HTTP/1.1"-请求的第一行。
请求类型、路径和协议。%>;s-200-最终服务器响应代码。
如果不使用>;符号且请求已在内部重定向,则会显示原始请求的状态。%O-396-服务器响应的大小(以字节为单位)。
"%{Referer}i"-"-"—引用的URL。
"%{User Agent}i"-Mozilla/5.0。
客户端的用户代理(web浏览器)。
使用tail命令实时观察日志文件:
tail -f access.log