share facebook facebook2 twitter menu hatena pocket slack

2016.04.26 TUE

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

小谷松 丈樹

WRITTEN BY小谷松 丈樹

概要

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

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のログ吐き出しファイルを動的に変更

小谷松 丈樹

小谷松 丈樹

アイレット第一事業部のWebアプリ開発者。PHP、JavaScriptの案件がメイン。モノづくりは常に楽しみながらがモットー。面白いものを生み出して、管理までできるようになるのが目標。