Zend_Logでsyslogを使う  2009年5月8日

Zend FrameworkのZend_Logのwriterでいくつかほしいものがあり作って実装してみました。

今回はSyslogへ出力するwriterを作成してみます。

Zend Frameworkでログ出力を作成するにはwriterと必要に応じてformatterを用意してあげればOKです。

実際の実装はBsheの以下のクラスを参考にしてください。(ダウンロードはこちら

  • ●Bshe_Log_Writer_Syslog
  • ●Bshe_Log_Formatter_Syslog

writerの作成

以下のようなクラスを用意しました。

class Bshe_Log_Writer_Syslog extends Zend_Log_Writer_Abstract
{
    /**
     * ログ接続処理用設定値
     *
     * @var unknown_type
     */
    protected $arrayOptions = array();
   
    /**
     * syslog facility
     *
     * @var unknown_type
     */
    protected $facility = null;
   
    /**
     * syslog option
     *
     * @var unknown_type
     */
    protected $option = 0;
   
    /**
     * syslog ident
     *
     * @var unknown_type
     */
    protected $ident = ‘Bshe_Log_Writer_Syslog’;

    /**
     * Class Constructor
     *
     * openlogの引数や、facilityの設定などを行う。
     *
     * @param string $ident syslog関数のident(未設定時は’Bshe_Log_Writer_Stream’)
     * @param int $option syslog関数のoption
     * @param int $facility sylog関数のfacility(未設定時はLOG_USER)
     */
    public function __construct($ident = ‘Bshe_Log_Writer_Syslog’, $option = 0, $facility = null)
    {
        // syslog初期化
        define_syslog_variables();
        // $facilityNULL時に初期値を設定
        if( $facility === null) {
            $this->facility = LOG_USER;
        } else {
            $this->facility = $facility;
        }
       
        $this->option = $option;
        $this->ident = $ident;
       

        // openlog
        if (!openlog($ident, $option, $facility)) {
            // ログエラー
            throw new Zend_Log_Exception("syslogを開けません");
        }

        // syslogへ_writeする専用のformatterを用意
        $this->_formatter = new Bshe_Log_Formatter_Syslog();
    }

    /**
     * Write a message to the log.
     *
     * @param  array  $event  event data
     * @return void
     */
    protected function _write($event)
    {
        define_syslog_variables();
        $line = $this->_formatter->format($event);

        if (!openlog($this->ident, $this->option, $this->facility)) {
            // ログエラー
            throw new Zend_Log_Exception("syslogを開けません");
        }
       
        if (false === syslog($event['priority'] , $line)) {
            throw new Zend_Log_Exception("syslogへ書き込みできません: ");
        }
       
        closelog();
    }
}

コンストラクタでSyslogでログ出力するための各種情報をセットし、_writeメソッドでopenlogしてログを出力します。

Formatterクラスの作成

デフォルトのテキストログなどのフォーマッタでは、ログの本文に時間などが含まれてしまうため、Syslog用に本文のみのフォーマッタを用意しました。

class Bshe_Log_Formatter_Syslog extends Zend_Log_Formatter_Simple
{
    const DEFAULT_FORMAT = ‘%message%’;
}

単純ですが、これで、基本のフォーマットがメッセージのみになります。

 

これを以下のように、利用するとSyslogへログ出力が行われます。

$logger = new Bshe_Log();

$writer = new Bshe_Log_Writer_Syslog( ‘BsheTest’);

$logger->addWriter($writer);

後はこのログクラスを利用して、ログ出力をするだけです。

ログクラスをスタティックで利用する場合は、Bshe_Logを参考にしてください。

 

 

このエントリをはてなブックマークに登録 このエントリをBuzzurlにブックマーク Yahoo!ブックマークに登録 このエントリをlivedoorクリップに登録 Deliciousにブックマーク

コメントを投稿