引言
Laravel 提供给了比较强大的ORM数据库操作方式,如果在数据库端考虑到性能问题, 难以打开MySQL的慢日志,或者出于审计考虑,要在系统内全程跟踪所有的SQL操作, 应该如何实现呢?不会要改写框架底层代码?
本文就来为大家提供解决的思路。
学习时间
因为考虑到是全局记录SQL语句,那么肯定不可能在所有的数据库模型操作上都手动加上日志, 那样的效率实在是令人胆寒。
所以方法只能是在独立于系统之外的地方寻求突破口。事件是个不错的想法。
因为laravel框架提供了事件监听方式,可以在系统启动过程中注册一个事件触发器收集过程数据,记录该流程内的SQL操作,应该就大差不差了。
比如注册 illuminate.query 事件。理想的情况下,代码应该是类似下面这样的:
Event::listen('illuminate.query', function($sql)
{
Log::error($sql);
});
开启一个事件监听,如果query发生,则将传入的SQL语句参数写入日志内。
上面的只能算是伪代码,真正实施起来,要考虑的过程因素有很多。比如首先要查看 database 配置文件内,日志功能是否打开。 也就是 log 配置项是否设置为 true。
我们使用全局的 Config 类获取配置信息:
Config::get('database.log', false)
如果没有开启数据库日志,则手动处理,将上述 illuminate