本文分享一下在Yii框架和laravel框架下查看当前页面执行的mongodb语句的日志记录方法,主要是通过配置相关文件来达到调试sql的目的,具体方法如下:
在yii框架中,在config/public.php文件中,引入mongo:
代码如下:
'mongodb' => array(
'class' => 'SammayeClient',
'uri' => 'mongodb://192.168.8.88:27017',
'options' => [],
'driverOptions' => [],
'enableProfiling' => true,
'db' => [
'huazai' => [
'writeConcern' => new \MongoDB\Driver\WriteConcern(1),
'readPreference' => new \MongoDB\Driver\ReadPreference(\MongoDB\Driver\ReadPreference::RP_PRIMARY),
'active' => true
]
],
),
一定要设置 enableProfiling 为 true。
接着在日志里面开启mongodb的日志:
代码如下:
'log' => array(
'class' => 'CLogRouter',
'routes' => array(
array(
'class'=>'CFileLogRoute',//用于处理日志的类
'levels'=>'trace, info, profile, error, warning',//标识那些级别的日志可被记录
'filter'=>'CLogFilter', //日志过滤类
),
array(
'class' => 'CWebLogRoute',
'levels' => 'error, warning',
'categories' => 'system.db.*,yii\mongodb\*',
'filter' => 'CLogFilter',
'showInFireBug' => true, //将在firebug中显示日志
),
),
),
接着我们执行mongodb查询:
执行查询可以看到使用的mongodb是那个集合,以及查询的条件绑定的值,方便直观的查找问题。
本例中使用OmsAttachMg集合来查询,条件入图中所示:
以上介绍的是yii里面的mongodb查询打印查询条件日志。
下面来介绍laravel里面mongodb查询打印查询条件日志:
在App\Providers目录下面,找到AppServiceProvider.php文件
在boot()方法里面添加如下代码:
ini_set('memory_limit', '512M');
$local = config('app.locale');
app('translator')->setLocale($local);
Carbon::setLocale($local);
Carbon::serializeUsing(function (Carbon $timestamp) {
return $timestamp->format('Y-m-d H:i:s');
});
DB::listen(function($query) {
foreach ($query->bindings as $i => $binding) {
if ($binding instanceof \DateTime) {
$query->bindings[$i] = $binding->format('Y-m-d H:i:s');
} else {
if (is_string($binding)) {
$query->bindings[$i] = "'$binding'";
}
}
}
$tmp = str_replace(array('%', '?'), array('%%', '%s'), $query->sql);
$tmp = vsprintf($tmp, $query->bindings);
$tmp = str_replace("\\","",$tmp);
Log::info($tmp."\n\n\t");
});
接着我们来看一下查询:
或者我们直接打印:
代码如下:
DB::connection('mongodb')->enableQueryLog();
$file = DB::connection('mongodb')->collection('file')
->where(function($query) use ($data) {
if(!empty($data['filekey'])) {
$query->where('filekey', '=', trim($data['filekey']));
}
})
->first();
echo "<pre>";
print_r(DB::connection('mongodb')->getQueryLog());
这样可以看到如下mongodb如下的执行日志:
这个就告诉我们使用mongo哪个集合什么条件以及绑定的值,方便排查问题。