zend framework 2 学习笔记:定义自己的日志,记录到数据库中

需求:定制自己的日志系统,本例假定指定存储到Mysql数据库当中。

通常的web我们可以 echo,或者IDE的debuger调试程序,但是有些特殊情况,例如php与android、unity3d等前端通讯时,传统方式并不方便,所以,需要把日志输出到其他地方便于查看。
* zf2中可以通过指定不同的 Zend/Log/Writer 来使用不同的日志记录方式。

下面开始动手了
为了便于在系统中重复使用,我将Logger放到 App 的 Service 中,以后只要在需要的时候,从 Service 中取出就可以用,如果完全没使用,也不会对速度有影响。

在文件 module/Application/Module.php 中:
头部引用包:

use ZendLogLogger;
use ZendLogWriterDb as WriterDb;

在 Module 类中,加入自定义 Service:

public function getServiceConfig(){
        return array(
            'factories'=>array(
                'WLogger' => function($sm){
                    $dbAdapter = $sm->get ( 'ZendDbAdapterAdapter' ); //需要指定你自己的数据库适配器
                    //对接数据表字段
                    $mapping = array(
                        'timestamp' => 'time',
                        'priority'  => 'type',
                        'message'   => 'message'
                    );
                    $writer = new WriterDb($dbAdapter, 'log_table', $mapping); // log_table 是你自己的日志数据表
                    //$writer = new ZendLogWriterDb($dbAdapter, 'log_table', $mapping); //这样会报错
                    $logger = new Logger();
                    $logger->addWriter($writer);
                    return $logger;
                }
            )
        );
    }

添加日志表到你的数据库中:

--
-- 表的结构 `log_table`
--

CREATE TABLE IF NOT EXISTS `log_table` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `type` varchar(255) DEFAULT NULL,
  `message` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='日志库' AUTO_INCREMENT=1 ;

如何使用?:

$logger = $this->getServiceLocator()->get('WLogger');
$logger->info('记录一条日志');