Zend_Log

       Zend_Log 是一個通用日誌組件,它支持多個日誌後端,格式化發送給日誌的消息,過濾被紀錄的消息。Zend_Log,能夠有任意多個Log對象,他們之間不會相互影響。一個Log對象至少包含一個或多個writer對象,可選的可包含一個或多個filter對象。這些功能被劃分爲以下的對象: php

Zend_Log_Writer_Abstract抽象類,它其下的子實例有: html

        Zend_Log_Writer_Stream,至關於寫文件流的鉛筆。 sql

        Zend_Log_Writer_Mail,將日誌信息以郵件的型式,記錄發送。 數據庫

        Zend_Log_Writer_Db,將日誌信息以數據庫的型式記錄。 後端

 Zend_Log_Filter_Interface,也就是上面多提到的過濾器接口,它其下的實例有:  app

         Zend_Log_Filter_Message,以正則的型式阻塞信息。 函數

         Zend_Log_Filter_Priority,阻塞日誌等級。   ui

Zend_Log_Formatter_Interface格式化接口,就是將Log信息以自定義型式輸出,它其下的實例有: 
spa

         Zend_Log_Formatter_Simple,比較經常使用的類,下面咱們會講到。 日誌

         Zend_Log_Formatter_Xml,已XML的型式記錄Log信息。

上面說了這麼多的理論,來的實惠的了,上菜!順便說下,在真正使用Zend_Log的時候,應該將它封裝成Singleton,並經過application.ini來配置。以上純屬我的理解,有什麼錯誤的地方還請指正:)。言歸正傳,下面我將分爲Writer的三個實例,來分別上菜。

        第一道菜:Zend_Log_Writer_Stream

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

-- 表的結構 `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可根據本身的須要來定義,以上代碼僅供參考。

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爲表名 $writeDb = new Zend_Log_Writer_Db($dbAdapter,'log',$columns); //添加wirter $log->addWriter($writerDb); $log->log('Hello Dante.What\'s going on?',3); exit; 
        第三道菜:Zend_Log_Writer_Email

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('somebody@example.com', 'Some Sender');
//郵寄到 
$mail->addTo('somebody_else@example.com', '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);
相關文章
相關標籤/搜索