一、修改yii框架的配置文件(main.php)

        'log' => array(
'class' => 'CLogRouter',
'routes' => array(
array(
'class' => 'AppCDbLogRoute',
'connectionID' => 'db',
'levels' => 'info, warning, error, profile, debug',
'logTableName' => 'common_app_logs',
),
),
),

二、建立保存yii日志的数据表

CREATE TABLE IF NOT EXISTS `common_app_logs` (
`id` int(11) unsigned NOT NULL COMMENT '自增长id',
`level` varchar(128) DEFAULT NULL COMMENT '错误级别',
`type` varchar(10) NOT NULL COMMENT '后台类型(op,sup)',
`category` varchar(128) NOT NULL COMMENT '所属分类',
`action` varchar(128) NOT NULL COMMENT '所属action',
`urlparam` text NOT NULL COMMENT '当前url',
`ip` varchar(20) DEFAULT '' COMMENT '来访者ip',
`postparam` text NOT NULL COMMENT 'post参数',
`logtime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '日志记录时间',
`message` text NOT NULL COMMENT '日志记录信息'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='应用层日志记录表' AUTO_INCREMENT=1 ;

数据库表有我自己自定义的字段,原本的字段可以参考YII源码中的CDbLogRoute.php文件(/framework/logging下)

三、复制CLogRoute文件,改名为AppCDbLogRoute放到到组件(conponents)中,继承CLogRoute这个类

修改文件中createLogTable方法,这个方法是如果没有这个表就建立,数据表如果已经建立,这个可以忽略。

原方法:

    protected function createLogTable($db,$tableName)
{
$db->createCommand()->createTable($tableName, array(
'id'=>'pk',
'level'=>'varchar(128)',
'category'=>'varchar(128)',
'logtime'=>'integer',
'message'=>'text',
));
}

修改成:

    protected function createLogTable($db,$tableName)
{
$db->createCommand()->createTable($tableName, array(
'id'=>'pk',
'level'=>'varchar(128)',
'type'=>'varchar(10)',
'category'=>'varchar(128)',
'action'=>'varchar(128)',
'urlparam'=>'text',
'postparam'=>'text',
'logtime'=>'integer',
'message'=>'text',
));
}

修改方法processLogs

原方法:

protected function processLogs($logs)
{
$command=$this->getDbConnection()->createCommand();
foreach($logs as $log)
{
$command->insert($this->logTableName,array(
'level'=>$log[1],
'category'=>$log[2],
'logtime'=>(int)$log[3],
'message'=>$log[0],
));
}
}

新方法:

    protected function processLogs($logs) {
$command = $this->getDbConnection()->createCommand();
foreach ($logs as $log) {
$action = explode('?', Yii::app()->request->url);
$command->insert($this->logTableName, array(
'level' => $log[1],
'type' => 'op',
'category' => $log[2],
'logtime' => (int) $log[3],
'message' => $log[0],
'action' => $action[0],
'urlparam' => Yii::app()->request->getHostInfo().Yii::app()->request->url,
'ip' => getIp(),
'postparam' => http_build_query($_POST),
));
}
}

四、写日志

在代码的任何位置加入

Yii::log('log test','info','mail');

这样就能写入到数据库中。

五、附录

这里有自定义的获取ip的方法

function getIp()
{
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
$ip = getenv("HTTP_CLIENT_IP");
} elseif (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
$ip = getenv("REMOTE_ADDR");
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = "0";
}
//有时候代理会显示出来多个IP这里只取第一个做判断
$pos = strpos($ip, ',');
if ($pos !== false) {
$ip = substr($ip, 0, $pos);
}
return $ip;
}

yii日志保存机制的更多相关文章

  1. (转)Yii的组件机制之一:组件基础类CComponent分析

    Yii的组件机制 组件机制,是Yii整个体系的思想精髓,在使用Yii之前,最应该先了解其组件机制,如果不了解这个机制,那么阅读Yii源代码会非常吃力.组件机制给Yii框架赋予了无穷的灵活性和可扩展性, ...

  2. Java 日志缓存机制的实现--转载

    概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印 ...

  3. 桦仔 笔记7-徐 SQLSERVER日志记录机制

    1 --SQLSERVER日志记录机制 2 --日志记录事务发生的时间,但是不保证记录下发起这个事务的用户名,更不记录发起者的程序名称!!! 3 USE AdventureWorks 4 CREATE ...

  4. iPhone开发技巧之日志保存教程

    http://mobile.51cto.com/iphone-283337.htm Objective-C开发程序的时候,有专门的日志操作类NSLog,它将指定的输出到标准的错误输出上(stderr) ...

  5. discuz清空session,导致session保存机制失败,session无法更新与解决

    <?php function userErrorHandler() { $e = func_get_args(); echo '<pre style="color:red;&qu ...

  6. cdnbest的站点日志保存时间怎么设置

    站点的保存时间是以节点全局里的保存时间为准 站点的日志保存大小还不能设置

  7. Android app日志保存功能

    每一个App应用应该都需要有日志保存的功能,日志保存可以记录App运行中所遇到的问题,查Bug也比较方便 等等: Android日志保存功能,保存某几天的最新日志文件到某个目录,直接看是如何代码实现的 ...

  8. 韦大仙--简单的monkey测试命令行操作及生成log日志保存

    作中,在将apk交给软件测试人员去测试之前,不免要自己先自测,monkey自测是一个不错的选择! 步骤很简单: 1.测试用的手机与电脑连接好USB ,并且安装好驱动(我一般都是通过豌豆荚自动安装的)! ...

  9. Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console、file等。Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别。

    Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console.file等.Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别. ...

随机推荐

  1. 对html2canvas的研究

    介绍 该脚本允许您直接在用户浏览器上截取网页或部分网页的“屏幕截图”.屏幕截图基于DOM,因此它可能不是真实表示的100%准确,因为它没有制作实际的屏幕截图,而是根据页面上可用的信息构建屏幕截图. 这 ...

  2. ASP教程:gb2312和utf-8乱码问题解决

    文章为转载:https://www.xp.cn/b.php/31663.html 尊重作者版权 今天做网站的时候,客户要一个博客,于是就利用了本博客所用的程序pjblog.经常做网站的人都知道,在同一 ...

  3. [CF11D]A Simple Task 题解

    题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...

  4. Atom 输入时按 Tab 快捷键提示怎么取消?

    按 Esc 按 Ctrl + . 在 mac 中使用 Cmd + .

  5. 从Java中的length和length()开始

    1.在没有IDE自动补齐的情况下,怎样得到数组的长度?怎样得到字符串的长度? int[] arr = new int[3]; System.out.println(arr.length);//leng ...

  6. 为什么电脑连接不上FTP

    我们对服务器的FTP状况有实时监控,一般问题都不在服务器端. 而且我们客服一般会第一时间测试下您空间FTP是否真的不能连接 99%绝大部分FTP连接不上的问题,都是客户那边的软件端或网络问题. 问题分 ...

  7. Oracle JET Model 数据获取与使用

    Oracle JET 应用程序数据可以来自生成 JSON 数据的任何 Web 数据源,例如 REST 服务,服务器发送事件(SSE)或 WebSocket .此外,Oracle JET 还提供了基于 ...

  8. linux(centOS7)的基本操作(二) 目录和文件管理

    1.显示当前工作目录的绝对路径 pwd 2.显示当前工作目录下的子目录和文件 ls [-l] [-h] [-a] 如果只调用ls,子目录和文件会简单的罗列出来,-l表示将其以详细列表的形式展示,-h表 ...

  9. Linux监控命令之==>free

    一.命令说明 free 命令显示系统内存的使用情况:包括物理内存.交换内存(swap)和内核缓冲区内存 二.参数说明 -b -k -m -g:分别以字节.KB.MB.GB为单位显示内存使用情况 -l: ...

  10. python使用相对路径创建文件夹

    两个py文件,一个是al文件夹下的test1.py,一个是和al文件夹同层的test2.py test1.py代码如下: import os def test(): path = './source_ ...