微信调试、API调试和AJAX的调试的工具,能将日志通过WebSocket输出到Chrome浏览器的console中。原文在: https://github.com/luofei614/SocketLog
SocketLog适合Ajax调试和API调试, 举一个常见的场景,用SocketLog来做微信调试, 我们在做微信API开发的时候,如果API有bug,微信只提示“改公众账号暂时无法提供服务,请稍候再试” ,我们根本不知道API出来什么问题。 有了SocketLog就不一样了, 我们可以知道微信给API传递了哪些参数, 程序有错误我们也能看见错误信息(下方有张图片,可能加载慢,请耐心等待一下)
npm install -g socketlog-server
, 运行命令 socketlog-server
即可启动服务。 将会在本地起一个websocket服务 ,监听端口是1229 。 如果想服务后台运行: socketlog-server > /dev/null &
我们提供公用的服务端,需要去申请client_id : http://slog.thinkphp.cn/在自己的程序中发送日志:
<?php
include './php/slog.function.php';
slog('hello world');
?>
用slog函数发送日志, 支持多种日志类型:
slog('msg','log'); //一般日志
slog('msg','error'); //错误日志
slog('msg','info'); //信息日志
slog('msg','warn'); //警告日志
slog('msg','trace');// 输入日志同时会打出调用栈
slog('msg','alert');//将日志以alert方式弹出
slog('msg','log','color:red;font-size:20px;');//自定义日志的样式,第三个参数为css样式
例如:我们如果想将程序的报错信息页输出到console,可以配置
<?php
include './php/slog.function.php';
slog(array(
'error_handler'=>true
),'config');
echo notice;//制造一个notice报错
slog('这里是输出的一般日志');
?>
还支持其他配置项
<?php
include './php/slog.function.php';
slog(array(
'enable'=>true,//是否打印日志的开关
'host'=>'localhost',//websocket服务器地址,默认localhost
'optimize'=>false,//是否显示利于优化的参数,如果运行时间,消耗内存等,默认为false
'show_included_files'=>false,//是否显示本次程序运行加载了哪些文件,默认为false
'error_handler'=>false,//是否接管程序错误,将程序错误显示在console中,默认为false
'force_client_id'=>'',//日志强制记录到配置的client_id,默认为空
'allow_client_ids'=>array()////限制允许读取日志的client_id,默认为空,表示所有人都可以获得日志。
)
,'config');
?>
[运行时间:0.081346035003662s][吞吐率:12.29req/s][内存消耗:346,910.45kb]
设置client_id后能实现以下功能:
设置allow_client_ids示例代码:
slog(array(
'allow_client_ids'=>array('luofei_zfH5NbLn','easy_DJq0z80H')
),'set_config')
示例代码:
<?php
include './php/slog.function.php';
slog(array(
'force_client_id'=>'luofei_zfH5NbLn'
),'config');
slog('test'); `
使用composer安装命令 composer require luofei614\socketlog
直接调用静态方法
<?php
require './vendor/autoload.php';
use think\org\Slog
//配置socketlog
Slog::config(array(
'enable'=>true,//是否打印日志的开关
'host'=>'localhost',//websocket服务器地址,默认localhost
'optimize'=>false,//是否显示利于优化的参数,如果运行时间,消耗内存等,默认为false
'show_included_files'=>false,//是否显示本次程序运行加载了哪些文件,默认为false
'error_handler'=>false,//是否接管程序错误,将程序错误显示在console中,默认为false
'force_client_id'=>'',//日志强制记录到配置的client_id,默认为空
'allow_client_ids'=>array()////限制允许读取日志的client_id,默认为空,表示所有人都可以获得日志。
));
Slog::log('log'); //一般日志
Slog::error('msg'); //错误日志
Slog::info('msg'); //信息日志
Slog::warn('msg'); //警告日志
Slog::trace('msg');// 输入日志同时会打出调用栈
Slog::alert('msg');//将日志以alert方式弹出
Slog::log('msg','color:red;font-size:20px;');//自定义日志的样式,第三个参数为css样式
ThinkPHP5后, 在框架层集成了SocketLog ,只需要设置配置即可用
用slog函数打印sql语句是,第二个参数传递为mysql或mysqli的对象即可。 示例代码:
$link=mysql_connect( 'localhost:3306' , 'root' , '123456' , true ) ;
mysql_select_db('kuaijianli',$link);
$sql="SELECT * FROM `user`";
slog($sql,$link); 后面会以OneThink为实例再对数据库调试进行演示。
通过上面的方法,socketlog还能自动为你检测没有where语句的sql操作,然后自动提示你。
网站调用了API ,如何将API程序的调试信息也打印到浏览器的console中? 前面我们讲了一个配置 force_client_id, 能将日志强制记录到指定的浏览器。 用这种方式也可以将API的调试信息打印到console中,但是force_client_id 只能指定一个client_id, 如果我们的开发环境是多人共用,这种方式就不方便了。 其实只要将浏览器传递给网站的User-Agent 再传递给API, API程序中不用配置force_client_id, 也能识别当前访问程序的浏览器, 将日志打印到当前访问程序的浏览器, 我们需要将SDK代码稍微做一下修改。 调用API的SDK,一般是用curl写的,增加下面代码可以将浏览器的User-Agent传递到API 。
$headers=array();
if(isset($_SERVER['HTTP_USER_AGENT']))
{
$headers[]='User-Agent: '.$_SERVER['HTTP_USER_AGENT'];
}
if(isset($_SERVER['HTTP_SOCKETLOG']))
{
$headers[]='Socketlog: '.$_SERVER['HTTP_SOCKETLOG'];
}
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
##区分正式和开发环境
进入chrome浏览器的“工具”–>“扩展程序” , 点击SocketLog的“选项”进行设置。
有了SocketLog,我们能很方便的分析开源程序,下面以OneThink为例, 大家可以在 http://www.topthink.com/topic/2228.html 下载最新的OneThink程序。 安装好OneThink后,按下面步骤增加SocketLog程序。
编辑入口文件index.php, 再代码的最前面加载slog.function.php ,并设置SocketLog
<?php
include './slog.function.php';
slog(array(
'error_handler'=>true,
'optimize'=>true,
'show_included_files'=>true
),'config');
编辑ThinkPHP/Library/Think/Db/Driver.class.php 文件,在这个类中的execute 方法为一个执行sql语句的方法,增加代码:
slog($this->queryStr,$this->_linkID);
类中的query方法也是一个执行sql语句的地方, 同样需要增加上面的代码
通过console的日志,访问每一页我们都知道程序干了什么,是一件很爽的事情。
这个是我根据自己的学习(小白),通过一些简单的配置之后发现可以用,就贴上来了。
将slog.php复制到ThinkPHP/Library/SocketLog目录下(需新建),修改namespace和类名:
<?php
namespace SocketLog;
class SocketLog 然后将slog.function.php修改为一个函数放到Application/Common/function.php下,修改如下:
/**
* SocketLog函数
*/
function slog($log,$type='log',$css='')
{
$socket = new SocketLog\SocketLog;
if(is_string($type))
{
$type=preg_replace_callback('/_([a-zA-Z])/',create_function('$matches', 'return strtoupper($matches[1]);'),$type);
if(method_exists($socket,$type) || in_array($type,$socket::$log_types))
{
//return call_user_func(array($socket,$type),$log,$css);
return $socket::$type($log,$css);
}
}
if(is_object($type) && 'mysqli'==get_class($type))
{
return $socket->mysqlilog($log,$type);
}
if(is_resource($type) && ('mysql link'==get_resource_type($type) || 'mysql link persistent'==get_resource_type($type)))
{
return $socket->mysqllog($log,$type);
}
if(is_object($type) && 'PDO'==get_class($type))
{
return $socket->pdolog($log,$type);
}
throw new Exception($type.' is not SocketLog method');
}
注意:我之前就是因为
//return call_user_func(array($socket,$type),$log,$css);
return $socket::$type($log,$css); call\_user_func函数一直不成功,直接调用就好了。 然后就可以在你想slog的地方slog了!
http://edu.yuantuan.com/course/198
感谢猿团的张盛翔(诺墨)提供教程。
三生社群CTO,ThinkPHP核心开发者之一,待过新浪云计算