概要

同サーバ内にバーチャルホスト切って同じプログラム置いたら、
ログの吐き出し場所がかぶって面倒なことになったので、
被らないようにうまくプログラムできないか調査しました。

log4phpの設定ファイル

log4phpの設定ファイルは下記のようなファイルになっています。

log4php.rootLogger=DEBUG

log4php.logger.user=DEBUG,user_file
log4php.appender.user_file = LoggerAppenderDailyFile
log4php.appender.user_file.layout = LoggerLayoutPattern
log4php.appender.user_file.layout.ConversionPattern="(%X{REMOTE_ADDR}) %d [%p] %c: %m%n"
log4php.appender.user_file.datePattern = Ymd
log4php.appender.user_file.file = /project/webapps/sys/var/applog/user_%s.log

log4php.properties というファイル名から、ただのテキストファイルであると分かります。
プログラムでどうのこうのができないんですね。
なので一工夫が必要でした。

やったこと

LoggerReflectionUtils.php の、

LoggerReflectionUtils::setProperty()

が、
上記のテキストファイルを読み込んで、= で分割して設定をセットする関数でした。

public function setProperty($name, $value) {
        if($value === null) {
            return;
        }
        if($name=='file'){
            $value = str_replace('project','project_test', $value);
        }
        $method = "set" . ucfirst($name);

        if(!method_exists($this->obj, $method)) {
            throw new Exception("Error setting log4php property $name to $value: no method $method in class ".get_class($this->obj)."!");
        } else {
            return call_user_func(array($this->obj, $method), $value);
        }
    }

$nameが file の時、設定値を書き換える処理を加えることで、
ログファイルの吐き出し場所を動的に切り替える事ができます。
バーチャルホストで切ってあるディレクトリを動的に入力すると、
同じプログラムでログ吐き出し場所がごっちゃになる事がなくなります。

元記事はこちら

log4phpのログ吐き出しファイルを動的に変更