Zend_Log使用

本文详细介绍了 Zend_Log 组件的功能及使用方法,包括如何利用不同的日志后端进行消息记录,例如文件流、数据库和电子邮件等。同时展示了如何设置日志格式化和过滤规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Zend_Log是一个通用日志组件,它支持多个日志后端,格式化发送给日志的消息,过滤被纪录的消息。这些功能被划分为如下的对象:
  • Zend_Log,可以有任意多个Log对象,他们之间不会相互影响。一个Log对象至少包含一个或多个writer对象,可选的可包含一个或多个filter对象。个人理解:Zend_Log就相当于一个空的笔记本,而wirter顾名思义就是往笔记本上写字的笔,所以需要至少一个或多个;filter就相当于过滤器,毕竟不能往笔记本上乱写嘛,它的作用就是什么该写,什么不该写。
  • Zend_Log_Writer_Abstract抽象类,它其下的子实例有:
  1. Zend_Log_Writer_Stream,相当于写文件流的铅笔。
  2. Zend_Log_Writer_Mail,将日志信息以邮件的型式,记录发送。
  3. Zend_Log_Writer_Db,将日志信息以数据库的型式记录。
  • Zend_Log_Filter_Interface,也就是上面多提到的过滤器接口,它其下的实例有:
  1. Zend_Log_Filter_Message,以正则的型式阻塞信息。
  2. Zend_Log_Filter_Priority,阻塞日志等级。
  • Zend_Log_Formatter_Interface格式化接口,就是将Log信息以自定义型式输出,它其下的实例有:
  1. Zend_Log_Formatter_Simple,比较常用的类,下面我们会讲到。
  2. Zend_Log_Formatter_Xml,已XML的型式记录Log信息。

 

上面说了这么多的理论,来的实惠的了,上菜!顺便说下,在真正使用Zend_Log的时候,应该将它封装成Singleton,并通过application.ini来配置。以上纯属个人理解,有什么错误的地方还请指正:)。言归正传,下面我将分为Writer的三个实例,来分别上菜。

 

第一道菜:Zend_Log_Writer_Stream

require_once 'Zend/Log.php';<br />
require_once 'Zend/Log/Writer/Stream.php';<br />
require_once 'Zend/Log/Formatter/Simple.php';<br />
//Zend_Log实例<br />
$log = new Zend_Log();<br />
//设置EventItem<br />
$log->setEventItem('pid',getmypid());<br />
$log->setEventItem('ip',getIP());<br />
//获取文本文件路径<br />
//已日期定义文件名称<br />
$file = 路径 .'/log/log-' . date('y-m-d') . '.log';<br />
$stream = @fopen($file,'a',false);<br />
//Zend_Log_Writer_Stream实例<br />
$writer = new Zend_Log_Writer_Stream($stream);<br />
//格式化输出Log信息<br />
//%timestamp%为站位符,显示输出<br />
$format = '[%timestamp%][%priorityName%-%priority%]-[PID:%pid%][ip:%ip%]' . PHP_EOL<br />
          . '%message%' . PHP_EOL;<br />
$formatter = new Zend_Log_Formatter_Simple($format);<br />
$writer->setFormatter($formatter);<br />
//添加writer<br />
$log->addWriter($writer);<br />
//添加过滤器,相当于Zend_Log_Filter_Priority<br />
$log->addFilter(3);<br />
//写日志<br />
$log->log('Hello Dante.What/'s going on?',3);<br />
exit;<br />
/**<br />
 *  获得IP地址<br />
 *  @return ip<br />
 **/<br />
function getIP()<br />
{<br />
    $realip = NULL;<br />
    if (isset($_SERVER)) {<br />
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {<br />
            $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];<br />
        } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {<br />
            $realip = $_SERVER["HTTP_CLIENT_IP"];<br />
        } else {<br />
            $realip = $_SERVER["REMOTE_ADDR"];<br />
        }<br />
    } else {<br />
        if (getenv('HTTP_X_FORWARDED_FOR')) {<br />
            $realip = getenv( 'HTTP_X_FORWARDED_FOR');<br />
        } elseif (getenv('HTTP_CLIENT_IP')) {<br />
            $realip = getenv('HTTP_CLIENT_IP');<br />
        } else {<br />
            $realip = getenv('REMOTE_ADDR');<br />
        }<br />
    }<br />
    return $realip;<br />
}

上面的代码有两点我需要说下:

  1. $log->setEventItem(key,value);本人第一次看见的时候很困惑,官方说的也很泛泛,日志事件。其实就是以键值对儿的型式保存信息,并通过formatter以%key%站位符显示输出。其中上面的getmypid()是PHP函数,获得当前PHP进程号;getIP()是自定义函数,获得IP地址。
  2. $log->addFilter(int),添加过滤器,相当于Zend_Log_Filter_Priority。意思就是堵塞日志等级3以外的信息。日志等级一共有8种,也可自定义8种以外等级,具体可去官网http://framework.zend.com/manual/zh/zend.log.html查阅。

 

第二道菜:Zend_Log_Writer_Db

数据库表以MYSQL为例:

--<br />
-- 表的结构 `logs`<br />
--<br />
DROP TABLE IF EXISTS `logs`;<br />
CREATE TABLE IF NOT EXISTS `logs` (<br />
  `logID` bigint(20) NOT NULL auto_increment,<br />
  `logPid` int(10) NOT NULL,<br />
  `logType` tinyint(3) NOT NULL,<br />
  `logName` varchar(20) collate utf8_unicode_ci NOT NULL,<br />
  `logIp` varchar(30) collate utf8_unicode_ci default '127.0.0.1',<br />
  `logTime` timestamp NULL default NULL,<br />
  `logMsg` text collate utf8_unicode_ci,<br />
  PRIMARY KEY  (`logID`)<br />
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;

表的column可根据自己的需要来定义,以上代码仅供参考。

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

第三道菜:Zend_Log_Writer_Email

require_once 'Zend/Log.php';<br />
require_once 'Zend/Log/Writer/Mail.php';<br />
require_once 'Zend/Mail.php';<br />
//Zend_Mail实例<br />
$mail = new Zend_Mail();<br />
//发件人<br />
$mail->setFrom('somebody@example.com', 'Some Sender');<br />
//邮寄到<br />
$mail->addTo('somebody_else@example.com', 'Some Recipient');<br />
//主题<br />
$mail->setSubject('TestSubject');<br />
$log = new Zend_Log();<br />
$writer = new Zend_Log_Writer_Mail($mail);<br />
$log->addWriter($writer);<br />
$log->log('Hello Dante.What/'s going on?',3);

内容概要:本文档详细介绍了基于Google Earth Engine (GEE) 构建的阿比让绿地分析仪表盘的设计与实现。首先,定义了研究区域的几何图形并将其可视化。接着,通过云掩膜函数和裁剪操作预处理Sentinel-2遥感影像,筛选出高质量的数据用于后续分析。然后,计算中值图像并提取NDVI(归一化差异植被指数),进而识别绿地及其面积。此外,还实现了多个高级分析功能,如多年变化趋势分析、人口-绿地交叉分析、城市热岛效应分析、生物多样性评估、交通可达性分析、城市扩张分析以及自动生成优化建议等。最后,提供了数据导出、移动端适配和报告生成功能,确保系统的实用性和便捷性。 适合人群:具备一定地理信息系统(GIS)和遥感基础知识的专业人士,如城市规划师、环境科学家、生态学家等。 使用场景及目标:①评估城市绿地分布及其变化趋势;②分析绿地与人口的关系,为城市规划提供依据;③研究城市热岛效应及生物多样性,支持环境保护决策;④评估交通可达性,优化城市交通网络;⑤监测城市扩张情况,辅助土地利用管理。 其他说明:该系统不仅提供了丰富的可视化工具,还集成了多种空间分析方法,能够帮助用户深入理解城市绿地的空间特征及其对环境和社会的影响。同时,系统支持移动端适配,方便随时随地进行分析。用户可以根据实际需求选择不同的分析模块,生成定制化的报告,为城市管理提供科学依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值