介绍
Apache Web 服务器可以配置为向服务器管理员提供有关其功能和需要解决的问题的重要信息。
主要的反馈途径是通过使用日志文件。Apache 具有非常灵活的日志记录机制,可以根据指示将消息输出到不同的位置。
在本指南中,我们将学习如何利用 Apache 的日志记录功能来设置结构化、易于解析的日志。我们将使用 Ubuntu 12.04 VPS 上的默认 Apache2 安装。其他发行版应该以类似的方式操作。
Apache 日志级别
Apache 将所有信息消息分为不同的类别,具体取决于它认为信息的重要性。
例如,对于最重要的消息,被视为紧急情况,Apache 将日志级别标记为 “emerg”。另一方面,“info” 标签只显示偶尔查看的有用信息。
以下是 Apache 认可的日志级别,从最重要到最不重要:
- emerg:系统处于不可用状态的紧急情况。
- alert:需要立即采取行动的严重情况。
- crit:需要解决的重要问题。
- error:发生错误。某些操作失败了。
- warn:发生了一些不寻常的事情,但不值得担心。
- notice:发生了一些正常的事情,但值得注意。
- info:可能有用的信息消息。
- debug:可以用于准确定位问题发生位置的调试信息。
- trace[1-8]:各种详细程度的跟踪信息,产生大量信息。
指定日志级别时,您选择要记录在该类别中标记的消息,而不是选择要记录的最不重要级别。
这意味着选择的级别以上的所有级别也会被记录。例如,如果选择 “warn” 日志级别,则标记为 warn、error、crit、alert 和 emerg 的消息都将被记录。
我们使用 “LogLevel” 指令指定所需的日志级别。我们可以在默认配置文件中看到默认日志级别:
sudo nano /etc/apache2/apache2.conf
. . . LogLevel warn . . .
如您所见,默认情况下,我们已将 Apache 配置为记录优先级为 “warn” 及以上的消息。我们将在下一节中了解 Apache 记录其消息的位置。
Apache 日志保存在哪里?
Apache 可以通过服务器范围的日志记录规范告知其日志的位置。您还可以为每个单独的虚拟主机单独配置日志记录。
服务器范围的日志记录
要找出服务器默认记录信息的位置,我们可以打开默认配置文件。在 Ubuntu 上,这是 “/etc/apache2/apache2.conf”:
sudo nano /etc/apache2/apache2.conf
如果我们搜索文件,可以找到类似以下的行:
ErrorLog ${APACHE_LOG_DIR}/error.log
此指令指定 Apache 将保存其错误消息的文件。如您所见,它利用名为 “APACHE_LOG_DIR” 的环境变量来获取目录路径的前缀。
我们可以通过检查另一个文件 “envvars” 来了解 “APACHE_LOG_DIR” 的设置:
sudo nano /etc/apache2/envvars
. . . export APACHE_LOG_DIR=/var/log/apache2$SUFFIX . . .
在这一行中,我们可以看到 “APACHE_LOG_DIR” 变量设置为目录 “/var/log/apache2”。这意味着当与 “apache2.conf” 文件中的指令结合使用时,Apache 将记录到名为 “/var/log/apache2/error.log” 的文件:
sudo ls /var/log/apache2
access.log error.log other_vhosts_access.log
我们可以看到 “error.log” 文件以及其他一些日志文件。
虚拟主机日志记录
上一节末尾的 “access.log” 文件未在 “apache2.conf” 文件中配置。相反,软件包维护者决定将指定其使用的指令放在虚拟主机定义中。
检查默认虚拟主机定义以查看访问日志声明:
sudo nano /etc/apache2/sites-available/default
如果我们浏览文件,将看到关于日志记录的三个单独值:
. . . ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined . . .
ErrorLog 定义与默认配置文件中的定义相匹配。在两个位置都有这行并非必需,但如果您在一个地方更改了位置,那么在另一个地方也更改位置不会有害。
定义自定义日志
在上一节中,描述 “access.log” 文件的行使用了与前面日志行不同的指令。它使用 “CustomLog” 来指定 access.log 的位置:
CustomLog ${APACHE_LOG_DIR}/access.log combined
此指令采用以下语法:
CustomLog <span class="highlight">log_location</span> <span class="highlight">log_format</span>
此示例中的日志格式为 “combined”。这不是内部 Apache 规范。相反,这是在默认配置文件中定义的自定义格式的标签。
如果我们再次打开默认配置文件,可以看到定义 “combined” 日志格式的行:
sudo nano /etc/apache2/apache2.conf
. . . LogFormat "%h %l %u %t \"%r\" %>s %O \"{Referer}i\" \"%{User-Agent}i\"" combined . . .
“LogFormat” 命令定义了一个称为 “combined” 格式的自定义格式,可以在虚拟主机定义中使用 “CustomLog” 指令调用。
此日志格式指定了一种称为 “combined” 的格式。通过 此处 了解更多关于可用格式字符串变量的信息。
正如您所见,还创建了几种其他常见格式,可在虚拟主机定义中像之前看到的 CustomLog 声明一样使用。您还可以创建自己的自定义日志格式。
旋转 Apache 日志文件
由于 Apache 在处理来自客户端的请求过程中能够记录大量信息,因此有必要设置日志旋转系统。
日志旋转可以简单地将日志文件替换为太大时,也可以是一个存档和存储旧副本以供以后参考的系统。这取决于您的配置。
下面,我们将讨论一些实现此目的的不同方法。
手动旋转日志
在 Apache 运行时不可能移动日志文件,因此必须重新启动服务器以交换旧日志和新日志。
这可以通过手动移动文件,然后软重启 Apache 以便它可以开始使用新日志记录新连接来实现。
Apache 文档中使用的示例在此。您可能需要在这些命令前加上 “sudo” 以获得适当的权限:
mv access_log access_log.old mv error_log error_log.old apachectl graceful sleep 600 [日志文件的后处理]
这将移动文件,重新加载服务器,并等待 600 秒。这将允许 Apache 继续使用旧日志文件来完成旧请求的记录。在此期间,新请求将记录到新的、刷新的文件中。
虽然了解如何手动执行此操作很重要,但对于较大的服务器环境来说,这是不可持续的。
使用 Logrotate 管理日志旋转
默认情况下,Ubuntu 使用 logrotate 设置自己的日志旋转计划。
此程序可以接受参数,并在满足某些条件时旋转日志。我们可以通过查看 “/etc/logrotate.d/apache2” 文件来了解是什么事件导致 logrotate 交换 Apache 日志:
sudo nano /etc/logrotate.d/apache2
在这里,您可以看到 logrotate 给出的一些参数。首先,注意第一行是:
/var/log/apache2/*.log {
这意味着 logrotate 只会在 “/var/log/apache2” 中操作这些日志。如果您在 Apache 配置中选择了不同的目录用于日志记录,请记住这一点。
我们可以看到日志每周旋转一次,并且默认情况下保存一年的日志。我们还可以看到在旋转后重新加载 Apache 的部分:
postrotate /etc/init.d/apache2 reload > /dev/null endscript
这些行确保每次旋转完成后都会自动重新加载 Apache。此文件中的参数可以随意更改,但配置超出了本文的范围。
使用管道记录
使用管道而不是文件是允许单独的记录程序处理输出的一种简单方法。这也解决了日志旋转问题,因为后端记录程序可以处理日志旋转,而不是由 Apache 本身处理。
如果我们希望访问日志由接受标准输入的记录程序处理,我们可以将行更改为:
CustomLog "| <span class="highlight">logging_program</span> <span class="highlight">logging_program_parameters</span>" combined
Apache 在启动时启动记录程序,并在记录过程因任何原因失败时重新启动它。
虽然可以配置多个程序来旋转日志,但 Apache 默认包含一个名为 “rotatelogs” 的程序。您可以按以下方式配置它:
CustomLog "| <span class="highlight">/path/to/rotatelog</span> <span class="highlight">/path/of/log/to/rotate</span> <span class="highlight">number_of_seconds_between_rotations</span>" <span class="highlight">log_level</span>
其他日志实用程序也可以实现类似的配置。
结论
重要的是,您记录了正确管理服务器所需的所有内容,并且您有一个良好的日志旋转机制,以防止文件变得过大。
您现在应该了解如何为 Apache 创建和配置日志记录。您记录的信息可用于解决问题并预测需要采取行动的时机。