如何在UbuntuVPS上的Apache中配置日志记录和日志轮换

来自菜鸟教程
跳转至:导航、​搜索


状态: 已弃用

本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:

原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.

请参阅:
本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。


介绍

Apache Web 服务器可以配置为向服务器管理员提供有关其运行方式以及需要解决哪些问题(如果有)的重要信息。

向管理员提供反馈的主要途径是使用日志文件。 Apache 有一个非常可配置的日志记录机制,可以用来根据指令将消息输出到不同的地方。

在本指南中,我们将了解如何利用 Apache 的日志记录功能来设置结构化、易于解析的日志。 我们将在 Ubuntu 12.04 VPS 上使用默认的 Apache2 安装。 其他发行版应该以类似的方式运行。

Apache 日志级别

Apache 根据对信息的重视程度将所有信息性消息分类。

例如,对于最重要的消息,考虑到紧急情况,Apache 将日志级别指定为“emerg”。 另一方面,“信息”标签只显示有用的信息,偶尔可以查看。

以下是 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 配置为记录优先级为“警告”及以上的消息。 我们将在下一节中了解 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 log_location log_format

此示例中的日志格式为“组合”。 这不是内部 Apache 规范。 相反,这是在默认配置文件中定义的自定义格式的标签。

如果我们再次打开默认配置文件,我们可以看到定义“组合”日志格式的行:

sudo nano /etc/apache2/apache2.conf
. . .
LogFormat "%h %l %u %t \"%r\" %>s %O \"{Referer}i\" \"%{User-Agent}i\"" combined
. . .

正如我们在虚拟主机定义中看到的那样,“LogFormat”命令定义了可以使用“CustomLog”指令调用的日志的自定义格式。

此日志格式指定一种称为“组合”格式的格式。 前往此处了解有关 可用格式字符串变量 的更多信息。

如您所见,已经创建了其他几种常见格式以在您的虚拟主机定义中使用。 您可以像之前看到的 CustomLog 声明一样使用它们。 您还可以创建自己的自定义日志格式。

轮换 Apache 日志文件

由于 Apache 在处理客户端请求的过程中能够记录大量信息,因此需要建立一个日志轮换系统。

日志轮换可以像在日志太大时将其切换一样简单,也可以是一个归档和存储旧副本以供日后参考的系统。 这取决于您的配置。

下面,我们将讨论实现这一目标的一些不同方法。

手动轮换日志

在 Apache 运行时无法移动日志文件,因此必须重新启动服务器才能将旧日志换成新日志。

这可以通过移动文件手动完成,然后软重启 Apache 以便它可以开始使用新日志进行新连接。

Apache 文档中使用的示例在这里。 您可能需要在这些命令之前加上“sudo”以获得适当的权限:

mv access_log access_log.old
mv error_log error_log.old
apachectl graceful
sleep 600
[post-processing of log files]

这将移动文件,重新加载服务器,然后等待 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 "| logging_program logging_program_parameters" combined

Apache 在开始时启动日志程序,如果日志过程因任何原因失败,则重新启动它。

尽管可以配置多个程序来轮换日志,但 Apache 默认包含一个称为“rotatelogs”的程序。 您可以按如下方式配置它:

CustomLog "| /path/to/rotatelog /path/of/log/to/rotate number_of_seconds_between_rotations" log_level

使用其他日志记录实用程序可以实现类似的配置。

结论

重要的是要记录正确管理服务器所需的所有内容,并且要有良好的日志轮换机制以防止文件变得过大。

您现在应该了解如何为 Apache 创建和配置日志记录。 您记录的信息可用于解决问题并预测何时需要采取行动。

贾斯汀·艾林伍德