开发者社区 问答 正文

apache在同一个虚拟机下,如何设置不同的errorlog

现有一域名下有众多个网站,apache通过在该域名的虚拟机设置alias来映射不同的目录实现访问,例如:
"www.abc.com/a1"  指向目录  /www/a1
"www.abc.com/b2" 指向目录  /www/b2

但这样设置后,如果根据不同网站记录不同的ErrorLog呢?毕竟ErrorLog的设置只在server config和virtual host
例如:
访问"www.abc.com/a1" 出错,则把错误信息记录到  error_a1_log,
访问"www.abc.com/b2" 出错,则把错误信息记录到  error_b1_log

有一个思路是利用ErrorLog的命令管道执行自己写的命令来实现,但不知怎样做到,或有其他更好的解决方法?

ps:访问日志CustomLog我通过SetEnvIf实现了这个需求,但ErrorLog命令不支持env

展开
收起
dxkrs 2017-06-08 09:45:06 3555 分享 版权
阿里云 AI 助理回答

要实现不同子目录(或别名Alias)的错误日志分别记录到不同的文件中,由于标准的Apache配置不直接支持在<Directory>或通过Alias指令为每个子目录单独设置ErrorLog,您可以通过自定义错误页面结合脚本的方式间接实现这一需求。虽然这种方法不如直接配置ErrorLog那样直接,但可以作为一种可行的解决方案。

解决方案概述

  1. 创建自定义错误页面:首先,为每个需要单独记录错误日志的子目录创建一个自定义错误页面。这些页面除了展示错误信息外,还会包含执行记录日志操作的脚本代码(如PHP、Perl等,取决于您的服务器支持)。

  2. 使用管道处理错误:虽然原生的ErrorLog指令不支持环境变量,但您可以考虑利用Apache的ErrorDocument特性,将特定错误代码重定向到一个脚本,该脚本负责记录错误日志并显示错误页面。

  3. 编写日志记录脚本:这个脚本接收错误信息,并根据请求的URL或其它条件判断,将错误信息写入到相应的错误日志文件中。

实现步骤

步骤1: 创建自定义错误页面

  • 为每个子目录创建一个简单的HTML错误页面,例如:
    • /www/a1/error.html
    • /www/b2/error.html

在这些页面中嵌入或链接到记录日志的后端脚本(假设使用PHP)。

步骤2: 配置ErrorDocument

在Apache配置文件(如httpd.conf或对应的VirtualHost段落)中,为每个可能的错误代码指定自定义错误页面,同时调用记录日志的脚本:

# 对于a1目录下的错误
ErrorDocument 404 /a1/error.php
ErrorDocument 500 /a1/error.php

# 对于b2目录下的错误
ErrorDocument 404 /b2/error.php
ErrorDocument 500 /b2/error.php

这里,error.php是一个简化的示例,实际应替换为您实际编写的脚本路径。

步骤3: 编写日志记录脚本

以PHP为例,创建/www/a1/error.php/www/b2/error.php,内容如下:

<?php
// 获取错误信息(可通过$_SERVER['REDIRECT_STATUS']获取错误码)
$error_code = intval($_SERVER['REDIRECT_STATUS']);
$log_message = "Error Code: {$error_code} - ".$_SERVER['REQUEST_URI']."\n";

// 根据请求的URL决定日志文件
if (strpos($_SERVER['REQUEST_URI'], '/a1/') === 0) {
    $log_file = '/path/to/error_a1_log.txt';
} elseif (strpos($_SERVER['REQUEST_URI'], '/b2/') === 0) {
    $log_file = '/path/to/error_b2_log.txt';
}

// 记录日志
file_put_contents($log_file, $log_message, FILE_APPEND);

// 显示错误页面给用户
echo "An error occurred. Please try again later.";
?>

确保脚本有权限写入指定的日志文件,并且根据实际情况调整错误处理逻辑。

注意事项

  • 安全性:确保自定义脚本安全,避免注入攻击。
  • 性能:频繁的文件I/O操作可能影响性能,尤其是在高流量场景下。
  • 日志管理:定期清理和归档日志文件,避免磁盘空间耗尽。

此方法虽非直接配置ErrorLog,但在现有Apache功能限制下提供了一种灵活的解决方案来满足您的需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答