Zend_LogをLog::Minimalっぽく使う

以下のようにして、Zend_Logを使ってLog::Minimalっぽくログ出力できるようにした。

<?php

require_once(dirname(__FILE__) . '/Zend/Log.php');
require_once(dirname(__FILE__) . '/Zend/Log/Writer/Stream.php');

class Logger {

    static public $logger = null;
    static public $TRACE_LEVEL = 0;

    static public function factory() {

        if ( !self::$logger ) {

            $stream = 'php://stderr';
            if ( $_SERVER['LM_DEBUG'] ) {
                $stream = '/tmp/debug.log';
            }

            $logger = new Zend_Log();

            $writer = new Zend_Log_Writer_Stream($stream);

            $format = '%timestamp% [%priorityName%] %message% at %trace%' . PHP_EOL;
            $formatter = new Zend_Log_Formatter_Simple($format);
            $writer->setFormatter($formatter);

            $logger->addWriter($writer);

            if ( !$_SERVER['LM_DEBUG'] ) {

                $filter = new Zend_Log_Filter_Priority(Zend_Log::INFO);
                $logger->addFilter($filter);
            }

            self::$logger = $logger;
        }

        return self::$logger;
    }

}


function _logger($level, $args, $full = false) {

    // ログメッセージ
    $msg = $args[0];
    array_shift($args);
    $param = array();

    // 引数の調整
    if ( count($args) >= 1 ) {

        if ( is_array($args[0]) ) {
            $param = $args[0];
        }
        else {
            foreach ($args as $a) {
                $param[] = $a;
            }
        }
    }

    // ログインスタンスを生成
    $logger = Logger::factory();

    // トレース情報
    $msg_trace = '';
    $trace = debug_backtrace();
    if ( $full ) {
        $i = Logger::$TRACE_LEVEL + 1;
        $stack = array();
        while ( $t = $trace[$i] ) {
            $stack[] = sprintf("%s line %s", $t['file'], $t['line']);
            $i++;
        }
        $msg_trace = implode(' ,', $stack);
    }
    else {
        $t = $trace[Logger::$TRACE_LEVEL+1];
        $msg_trace =
            sprintf("%s line %s",
                    $t['file'],
                    $t['line']
                    );
    }
    $logger->setEventItem('trace', $msg_trace);

    // 出力
    if ( count($param) ) {
        $logger->$level(vsprintf($msg, $param));
    }
    else {
        $logger->$level($msg);
    }
}


function emergf() {
    _logger('emerg', func_get_args());
}

function alertf() {
    _logger('alert', func_get_args());
}

function critf() {
    _logger('crit', func_get_args());
}

function errf() {
    _logger('err', func_get_args());
}

function warnf() {
    _logger('warn', func_get_args());
}

function noticef() {
    _logger('notice', func_get_args());
}

function infof() {
    _logger('info', func_get_args());
}

function debugf() {
    _logger('debug', func_get_args());
}



function emergff() {
    _logger('emerg', func_get_args(), 1);
}

function alertff() {
    _logger('alert', func_get_args(), 1);
}

function critff() {
    _logger('crit', func_get_args(), 1);
}

function errff() {
    _logger('err', func_get_args(), 1);
}

function warnff() {
    _logger('warn', func_get_args(), 1);
}

function noticeff() {
    _logger('notice', func_get_args(), 1);
}

function infoff() {
    _logger('info', func_get_args(), 1);
}

function debugff() {
    _logger('debug', func_get_args(), 1);
}