我正在编写一个日志类,它有几个方法,如info
,error
或warning
,可以将日志条目插入数据库。
到目前为止,这些方法中的每一个都直接进行了db插入。在批量处理方面,这不是一个好的性能。我现在想要通过创建队列来解决这个问题,并且只在任务结束时生成并触发一个插入语句。
我现在不确定以下内容是否有意义或是好的做法。我现在这样做的方法是链接方法来启动和提交一个队列,如:
Log::queue()->info('Just somehting')->warning('Strange stuff')->submit();
或者如果我不想直接插入它:
Log::info('Just something');
类结构例如如下所示:
class Log {
protected $queue = array();
protected $isQueued = false;
public function queue() {
$this->isQueued = true;
return $this;
}
public function info() {
if($this->isQueued) {
//Add to queue
} else {
//Insert in db
}
return $this;
}
//All the other log types following...
public function submit() {
//Generate single insert statement from queue and insert it
}
}
我正在使用Laravel外观,因此静态调用。
这个设计有什么问题吗?我不确定,因为例如Log::submit()
本身就没有任何意义,但是有可能。它甚至重要吗?
答案 0 :(得分:1)
您应该做的是删除队列/提交方法,而是接收传入的日志并将它们存储在对象的数组中,然后您可以使用类似App::shutdown(function() {...})
的回调来告诉它提交-memory在应用程序完成为请求提供服务后将字符串记录到数据库中。
另外值得一提的是 - 如果您不限于使用SQL数据库,则Redis,Mongo等已有几个现有的数据库Monolog处理程序。基础Monolog实例可通过Log::getMonolog()
获得。