4

PHP が現在の仮想ホストの Apache VirtualHost 構成ブロックを読み取り/解析して、特に ErrorLog と CustomLog の設定を取得することは可能ですか?

明確にするために、簡単に取得できる PHP エラー ログ パスは必要ありません。

phpinfoまたは_SERVER/getenv()または PHP Apache 関数 ( apache_module()apache_note()apache_getenv())の方法が見つかりませんでした

コードベースは複数のサーバー上の複数の仮想ホストに使用されるため、PHP (.htaccess SetEnvまたは一部の ini/csv/whatever ファイルなど) でApache アクセスおよびエラー ログのパスをハード コードすることはできません。が設定されています<VirtualHost>- 運用部門の誰かが VirtualHost を更新する可能性がありますが、開発者はコードまたはコードが同じパスを見つけるために使用しているものを更新することはできません。CustomLog の行の下または上に同じ値を持つ SetEnv を持つことはできません。これは、一方が他方なしで更新される可能性があるためです (人的エラーなど)。

私の最善の希望はありapache_getenv()ましたが、試してみましたが、apache_getenv('CustomLog')何も返されません。

system()/exec()それらを見つけるためにcli関数を実行する一連の呼び出しを実行しても問題ありませんが、理想的ではありません。

正規表現を含む別の仮想ホストがある可能性があるためServerName、呼び出されている現在の仮想ホストと一致しないServerAlias可能性があるため、Apache conf へのパスが見つかったら、ファイルを手動で grep することは理想的/信頼性がありません。

Apache 2.2.16 (Unix) PHP 5.3.3 CentOS リリース 5.5 (最終版)

明らかな何かを見逃していると教えてください;)

4

2 に答える 2

1

ちょっとハックですが、置くことができます

ErrorLog /path/to/logfile
SetEnv ErrorLog /path/to/logfile

httpd.conf で、apache_getenv() 関数を使用できるようにします。getenv() は構成ディレクティブを取得せず、実際の環境変数のみを取得します。だから..ログパスを環境変数に入れます。

于 2011-07-05T18:27:23.770 に答える
0

明らかな何かを見逃したと言ってください;)

いいえ、していません。Apacheは、この文字列を取得できる場所には保存しません。から、mod_log_config.cfmt (構造体に格納されている引数に注意してくださいconfig_log_state):

static const char *add_custom_log(cmd_parms *cmd, void *dummy, const char *fn,
                                  const char *fmt, const char *envclause)
{
    const char *err_string = NULL;
    multi_log_state *mls = ap_get_module_config(cmd->server->module_config,
                                                &log_config_module);
    config_log_state *cls;

    cls = (config_log_state *) apr_array_push(mls->config_logs);
    cls->condition_var = NULL;
    if (envclause != NULL) {
        if (strncasecmp(envclause, "env=", 4) != 0) {
            return "error in condition clause";
        }
        if ((envclause[4] == '\0')
            || ((envclause[4] == '!') && (envclause[5] == '\0'))) {
            return "missing environment variable name";
        }
        cls->condition_var = apr_pstrdup(cmd->pool, &envclause[4]);
    }

    cls->fname = fn;
    cls->format_string = fmt;
    if (fmt == NULL) {
        cls->format = NULL;
    }
    else {
        cls->format = parse_log_string(cmd->pool, fmt, &err_string);
    }
    cls->log_writer = NULL;

    return err_string;
}

次のいずれかを行う必要があります(以前にできないと述べたかどうかに関係なく)。

  • SetEnvとCustomLogを同一に保つように開発者を説得します
  • confファイルを自分で解析し、指を交差させたままにします
  • 変更するmod_log_config.c(悪い考えです!)
  • 全部忘れて!;)
于 2011-07-05T18:56:35.260 に答える