Zend_Log使用

Zend_Log 是一個通用日誌組件,它支持多個日誌後端,格式化發送給日誌的消息,過濾被紀錄的消息。這些功能被劃分爲如下的對象:

Zend_Log,可以有任意多個Log對象,他們之間不會相互影響。一個Log對象至少包含一個或多個writer對象,可選的可包含一個或多個filter對象。個人理解:Zend_Log就相當於一個空的筆記本,而wirter顧名思義就是往筆記本上寫字的筆,所以需要至少一個或多個;filter就相當於過濾器,畢竟不能往筆記本上亂寫嘛,它的作用就是什麼該寫,什麼不該寫。
Zend_Log_Writer_Abstract抽象類,它其下的子實例有:
Zend_Log_Writer_Stream,相當於寫文件流的鉛筆。
Zend_Log_Writer_Mail,將日誌信息以郵件的型式,記錄發送。
Zend_Log_Writer_Db,將日誌信息以數據庫的型式記錄。
Zend_Log_Filter_Interface,也就是上面多提到的過濾器接口,它其下的實例有:
Zend_Log_Filter_Message,以正則的型式阻塞信息。
Zend_Log_Filter_Priority,阻塞日誌等級。
Zend_Log_Formatter_Interface格式化接口,就是將Log信息以自定義型式輸出,它其下的實例有:
Zend_Log_Formatter_Simple,比較常用的類,下面我們會講到。
Zend_Log_Formatter_Xml,已XML的型式記錄Log信息。
上面說了這麼多的理論,來的實惠的了,上菜!順便說下,在真正使用Zend_Log的時候,應該將它封裝成Singleton,並通過application.ini來配置。以上純屬個人理解,有什麼錯誤的地方還請指正:)。言歸正傳,下面我將分爲Writer的三個實例,來分別上菜。

第一道菜:Zend_Log_Writer_Stream

view plaincopy to clipboardprint?
require_once 'Zend/Log.php';  
require_once 'Zend/Log/Writer/Stream.php';  
require_once 'Zend/Log/Formatter/Simple.php';  
//Zend_Log實例  
$log = new Zend_Log();  
//設置EventItem  
$log->setEventItem('pid',getmypid());  
$log->setEventItem('ip',getIP());  
//獲取文本文件路徑  
//已日期定義文件名稱  
$file = 路徑 .'/log/log-' . date('y-m-d') . '.log';  
$stream = @fopen($file,'a',false);  
//Zend_Log_Writer_Stream實例  
$writer = new Zend_Log_Writer_Stream($stream);  
//格式化輸出Log信息  
//%timestamp%爲站位符,顯示輸出  
$format = '[%timestamp%][%priorityName%-%priority%]-[PID:%pid%][ip:%ip%]' . PHP_EOL  
          . '%message%' . PHP_EOL;  
$formatter = new Zend_Log_Formatter_Simple($format);  
$writer->setFormatter($formatter);  
//添加writer  
$log->addWriter($writer);  
//添加過濾器,相當於Zend_Log_Filter_Priority  
$log->addFilter(3);  
//寫日誌  
$log->log('Hello Dante.What/'s going on?',3);  
exit;  
/** 
 *  獲得IP地址 
 *  @return ip 
 **/ 
function getIP()  
{  
    $realip = NULL;  
    if (isset($_SERVER)) {  
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {  
            $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];  
        } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {  
            $realip = $_SERVER["HTTP_CLIENT_IP"];  
        } else {  
            $realip = $_SERVER["REMOTE_ADDR"];  
        }  
    } else {  
        if (getenv('HTTP_X_FORWARDED_FOR')) {  
            $realip = getenv( 'HTTP_X_FORWARDED_FOR');  
        } elseif (getenv('HTTP_CLIENT_IP')) {  
            $realip = getenv('HTTP_CLIENT_IP');  
        } else {  
            $realip = getenv('REMOTE_ADDR');  
        }  
    }  
    return $realip;  

require_once 'Zend/Log.php';
require_once 'Zend/Log/Writer/Stream.php';
require_once 'Zend/Log/Formatter/Simple.php';
//Zend_Log實例
$log = new Zend_Log();
//設置EventItem
$log->setEventItem('pid',getmypid());
$log->setEventItem('ip',getIP());
//獲取文本文件路徑
//已日期定義文件名稱
$file = 路徑 .'/log/log-' . date('y-m-d') . '.log';
$stream = @fopen($file,'a',false);
//Zend_Log_Writer_Stream實例
$writer = new Zend_Log_Writer_Stream($stream);
//格式化輸出Log信息
//%timestamp%爲站位符,顯示輸出
$format = '[%timestamp%][%priorityName%-%priority%]-[PID:%pid%][ip:%ip%]' . PHP_EOL
          . '%message%' . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);
$writer->setFormatter($formatter);
//添加writer
$log->addWriter($writer);
//添加過濾器,相當於Zend_Log_Filter_Priority
$log->addFilter(3);
//寫日誌
$log->log('Hello Dante.What/'s going on?',3);
exit;
/**
 *  獲得IP地址
 *  @return ip
 **/
function getIP()
{
    $realip = NULL;
    if (isset($_SERVER)) {
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $realip = $_SERVER["HTTP_CLIENT_IP"];
        } else {
            $realip = $_SERVER["REMOTE_ADDR"];
        }
    } else {
        if (getenv('HTTP_X_FORWARDED_FOR')) {
            $realip = getenv( 'HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_CLIENT_IP')) {
            $realip = getenv('HTTP_CLIENT_IP');
        } else {
            $realip = getenv('REMOTE_ADDR');
        }
    }
    return $realip;
}

上面的代碼有兩點我需要說下:

$log->setEventItem(key,value);本人第一次看見的時候很困惑,官方說的也很泛泛,日誌事件。其實就是以鍵值對兒的型式保存信息,並通過formatter以%key%站位符顯示輸出。其中上面的getmypid()是PHP函數,獲得當前PHP進程號;getIP()是自定義函數,獲得IP地址。
$log->addFilter(int),添加過濾器,相當於Zend_Log_Filter_Priority。意思就是堵塞日誌等級3以外的信息。日誌等級一共有8種,也可自定義8種以外等級,具體可去官網http://framework.zend.com/manual/zh/zend.log.html查閱。
第二道菜:Zend_Log_Writer_Db

數據庫表以MYSQL爲例:

view plaincopy to clipboardprint?
--  
-- 表的結構 `logs`  
--  
DROP TABLE IF EXISTS `logs`;  
CREATE TABLE IF NOT EXISTS `logs` (  
  `logID` bigint(20) NOT NULL auto_increment,  
  `logPid` int(10) NOT NULL,  
  `logType` tinyint(3) NOT NULL,  
  `logName` varchar(20) collate utf8_unicode_ci NOT NULL,  
  `logIp` varchar(30) collate utf8_unicode_ci default '127.0.0.1',  
  `logTime` timestamp NULL default NULL,  
  `logMsg` text collate utf8_unicode_ci,  
  PRIMARY KEY  (`logID`)  
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ; 
--
-- 表的結構 `logs`
--
DROP TABLE IF EXISTS `logs`;
CREATE TABLE IF NOT EXISTS `logs` (
  `logID` bigint(20) NOT NULL auto_increment,
  `logPid` int(10) NOT NULL,
  `logType` tinyint(3) NOT NULL,
  `logName` varchar(20) collate utf8_unicode_ci NOT NULL,
  `logIp` varchar(30) collate utf8_unicode_ci default '127.0.0.1',
  `logTime` timestamp NULL default NULL,
  `logMsg` text collate utf8_unicode_ci,
  PRIMARY KEY  (`logID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;

表的column可根據自己的需要來定義,以上代碼僅供參考。

view plaincopy to clipboardprint?
require_once 'Zend/Db.php';  
require_once 'Zend/Log.php';  
require_once 'Zend/Log/Writer/Db.php';  
//Zend_Log實例  
$log = new Zend_Log();  
//設置EventItem  
$log->setEventItem('pid',getmypid());  
$log->setEventItem('ip',getIP());  
//通過Zend_Db工廠創建DB  
$dbAdapter = Zend_Db::factory('PDO_MYSQL',array(  
                    'host' => 'localhost' 
                    ,'dbname' => 'Lap' 
                    ,'username' => 'root' 
                    ,'password' => '1986630187' 
                    ,'charset' => 'UTF8' 
                    ));  
//數據庫字段配置  
$columns = array(  
    'logPid' => 'pid' 
    ,'logType' => 'priority' 
    ,'logName' => 'priorityName' 
    ,'logIp' => 'ip' 
    ,'logTime' => 'timestamp' 
    ,'logMsg' => 'message' 
);  
//Zend_Log_Writer_Db實例,logs爲表名  
$writerDb = new Zend_Log_Writer_Db($dbAdapter,'logs',$columns);  
//添加wirter  
$log->addWriter($writerDb);  
$log->log('Hello Dante.What/'s going on?',3);  
exit;  
/** 
 *  獲得IP地址 
 *  @return ip 
 **/ 
function getIP()  
{  
    $realip = NULL;  
    if (isset($_SERVER)) {  
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {  
            $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];  
        } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {  
            $realip = $_SERVER["HTTP_CLIENT_IP"];  
        } else {  
            $realip = $_SERVER["REMOTE_ADDR"];  
        }  
    } else {  
        if (getenv('HTTP_X_FORWARDED_FOR')) {  
            $realip = getenv( 'HTTP_X_FORWARDED_FOR');  
        } elseif (getenv('HTTP_CLIENT_IP')) {  
            $realip = getenv('HTTP_CLIENT_IP');  
        } else {  
            $realip = getenv('REMOTE_ADDR');  
        }  
    }  
    return $realip;  

require_once 'Zend/Db.php';
require_once 'Zend/Log.php';
require_once 'Zend/Log/Writer/Db.php';
//Zend_Log實例
$log = new Zend_Log();
//設置EventItem
$log->setEventItem('pid',getmypid());
$log->setEventItem('ip',getIP());
//通過Zend_Db工廠創建DB
$dbAdapter = Zend_Db::factory('PDO_MYSQL',array(
                    'host' => 'localhost'
                    ,'dbname' => 'Lap'
                    ,'username' => 'root'
                    ,'password' => '1986630187'
                    ,'charset' => 'UTF8'
                    ));
//數據庫字段配置
$columns = array(
    'logPid' => 'pid'
    ,'logType' => 'priority'
    ,'logName' => 'priorityName'
    ,'logIp' => 'ip'
    ,'logTime' => 'timestamp'
    ,'logMsg' => 'message'
);
//Zend_Log_Writer_Db實例,logs爲表名
$writerDb = new Zend_Log_Writer_Db($dbAdapter,'logs',$columns);
//添加wirter
$log->addWriter($writerDb);
$log->log('Hello Dante.What/'s going on?',3);
exit;
/**
 *  獲得IP地址
 *  @return ip
 **/
function getIP()
{
    $realip = NULL;
    if (isset($_SERVER)) {
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $realip = $_SERVER["HTTP_CLIENT_IP"];
        } else {
            $realip = $_SERVER["REMOTE_ADDR"];
        }
    } else {
        if (getenv('HTTP_X_FORWARDED_FOR')) {
            $realip = getenv( 'HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_CLIENT_IP')) {
            $realip = getenv('HTTP_CLIENT_IP');
        } else {
            $realip = getenv('REMOTE_ADDR');
        }
    }
    return $realip;
}
 

第三道菜:Zend_Log_Writer_Email

view plaincopy to clipboardprint?
require_once 'Zend/Log.php';  
require_once 'Zend/Log/Writer/Mail.php';  
require_once 'Zend/Mail.php';  
//Zend_Mail實例  
$mail = new Zend_Mail();  
//發件人  
$mail->setFrom('[email protected]', 'Some Sender');  
//郵寄到  
$mail->addTo('[email protected]', 'Some Recipient');  
//主題  
$mail->setSubject('TestSubject');  
$log = new Zend_Log();  
$writer = new Zend_Log_Writer_Mail($mail);  
$log->addWriter($writer);  
$log->log('Hello Dante.What/'s going on?',3); 
require_once 'Zend/Log.php';
require_once 'Zend/Log/Writer/Mail.php';
require_once 'Zend/Mail.php';
//Zend_Mail實例
$mail = new Zend_Mail();
//發件人
$mail->setFrom('[email protected]', 'Some Sender');
//郵寄到
$mail->addTo('[email protected]', 'Some Recipient');
//主題
$mail->setSubject('TestSubject');
$log = new Zend_Log();
$writer = new Zend_Log_Writer_Mail($mail);
$log->addWriter($writer);
$log->log('Hello Dante.What/'s going on?',3);

三道菜終於上齊了,希望味道還可以。剛纔有個小插曲,我寫一半的時候爲了看效果發表了一下,突然發現剛纔寫的東西全沒了,也沒有發表成功,崩潰了都。不過還好還是硬着頭皮重寫了一遍。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/dante_k7/archive/2009/08/06/4418681.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章