mirror of
https://github.com/moodle/moodle.git
synced 2025-08-06 17:36:38 +02:00
Merge branch 'w11_MDL-44496_m27_eventbuffer' of https://github.com/skodak/moodle
This commit is contained in:
commit
509edd5624
3 changed files with 72 additions and 64 deletions
|
@ -27,7 +27,6 @@ defined('MOODLE_INTERNAL') || die();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper trait buffered_writer. Adds buffer support for the store.
|
* Helper trait buffered_writer. Adds buffer support for the store.
|
||||||
* \tool_log\helper\store must be included before using this trait.
|
|
||||||
*
|
*
|
||||||
* @package tool_log
|
* @package tool_log
|
||||||
* @copyright 2014 onwards Ankit Agarwal
|
* @copyright 2014 onwards Ankit Agarwal
|
||||||
|
@ -44,6 +43,13 @@ trait buffered_writer {
|
||||||
/** @var int $count Counter. */
|
/** @var int $count Counter. */
|
||||||
protected $count = 0;
|
protected $count = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should the event be ignored (== not logged)?
|
||||||
|
* @param \core\event\base $event
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
abstract protected function is_event_ignored(\core\event\base $event);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write event in the store with buffering. Method insert_events() must be
|
* Write event in the store with buffering. Method insert_events() must be
|
||||||
* defined.
|
* defined.
|
||||||
|
@ -53,7 +59,26 @@ trait buffered_writer {
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function write(\core\event\base $event) {
|
public function write(\core\event\base $event) {
|
||||||
$this->buffer[] = $event;
|
if ($this->is_event_ignored($event)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We need to capture current info at this moment,
|
||||||
|
// at the same time this lowers memory use because
|
||||||
|
// snapshots and custom objects may be garbage collected.
|
||||||
|
$entry = $event->get_data();
|
||||||
|
$entry['other'] = serialize($entry['other']);
|
||||||
|
if (CLI_SCRIPT) {
|
||||||
|
$entry['origin'] = 'cli';
|
||||||
|
$entry['ip'] = null;
|
||||||
|
} else {
|
||||||
|
$entry['origin'] = 'web';
|
||||||
|
$entry['ip'] = getremoteaddr();
|
||||||
|
}
|
||||||
|
$entry['realuserid'] = \core\session\manager::is_loggedinas() ? $_SESSION['USER']->realuser : null;
|
||||||
|
|
||||||
|
|
||||||
|
$this->buffer[] = $entry;
|
||||||
$this->count++;
|
$this->count++;
|
||||||
|
|
||||||
if (!isset($this->buffersize)) {
|
if (!isset($this->buffersize)) {
|
||||||
|
@ -75,15 +100,15 @@ trait buffered_writer {
|
||||||
$events = $this->buffer;
|
$events = $this->buffer;
|
||||||
$this->count = 0;
|
$this->count = 0;
|
||||||
$this->buffer = array();
|
$this->buffer = array();
|
||||||
$this->insert_events($events);
|
$this->insert_event_entries($events);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bulk write a given array of events to the backend. Stores must implement this.
|
* Bulk write a given array of events to the backend. Stores must implement this.
|
||||||
*
|
*
|
||||||
* @param array $events An array of events to write.
|
* @param array $evententries raw event data
|
||||||
*/
|
*/
|
||||||
abstract protected function insert_events($events);
|
abstract protected function insert_event_entries($evententries);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a config value for the store.
|
* Get a config value for the store.
|
||||||
|
|
|
@ -107,49 +107,41 @@ class store implements \tool_log\log\writer, \core\log\sql_select_reader {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should the event be ignored (== not logged)?
|
||||||
|
* @param \core\event\base $event
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
protected function is_event_ignored(\core\event\base $event) {
|
||||||
|
if (in_array($event->crud, $this->excludeactions) ||
|
||||||
|
in_array($event->edulevel, $this->excludelevels)
|
||||||
|
) {
|
||||||
|
// Ignore event if the store settings do not want to store it.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ((!CLI_SCRIPT or PHPUNIT_TEST) and !$this->logguests) {
|
||||||
|
// Always log inside CLI scripts because we do not login there.
|
||||||
|
if (!isloggedin() or isguestuser()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert events in bulk to the database.
|
* Insert events in bulk to the database.
|
||||||
*
|
*
|
||||||
* @param \core\event\base[] $events
|
* @param array $evententries raw event data
|
||||||
*/
|
*/
|
||||||
protected function insert_events($events) {
|
protected function insert_event_entries($evententries) {
|
||||||
if (!$this->init()) {
|
if (!$this->init()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!$dbtable = $this->get_config('dbtable')) {
|
if (!$dbtable = $this->get_config('dbtable')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$dataobj = array();
|
|
||||||
|
|
||||||
// Filter events.
|
|
||||||
foreach ($events as $event) {
|
|
||||||
if (in_array($event->crud, $this->excludeactions) ||
|
|
||||||
in_array($event->edulevel, $this->excludelevels)
|
|
||||||
) {
|
|
||||||
// Ignore event if the store settings do not want to store it.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ((!CLI_SCRIPT or PHPUNIT_TEST) and !$this->logguests) {
|
|
||||||
// Always log inside CLI scripts because we do not login there.
|
|
||||||
if (!isloggedin() or isguestuser()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = $event->get_data();
|
|
||||||
$data['other'] = serialize($data['other']);
|
|
||||||
if (CLI_SCRIPT) {
|
|
||||||
$data['origin'] = 'cli';
|
|
||||||
$data['ip'] = null;
|
|
||||||
} else {
|
|
||||||
$data['origin'] = 'web';
|
|
||||||
$data['ip'] = getremoteaddr();
|
|
||||||
}
|
|
||||||
$data['realuserid'] = \core\session\manager::is_loggedinas() ? $_SESSION['USER']->realuser : null;
|
|
||||||
$dataobj[] = $data;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
$this->extdb->insert_records($dbtable, $dataobj);
|
$this->extdb->insert_records($dbtable, $evententries);
|
||||||
} catch (\moodle_exception $e) {
|
} catch (\moodle_exception $e) {
|
||||||
debugging('Cannot write to external database: ' . $e->getMessage(), DEBUG_DEVELOPER);
|
debugging('Cannot write to external database: ' . $e->getMessage(), DEBUG_DEVELOPER);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,39 +40,30 @@ class store implements \tool_log\log\writer, \core\log\sql_internal_reader {
|
||||||
$this->logguests = $this->get_config('logguests', 1);
|
$this->logguests = $this->get_config('logguests', 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should the event be ignored (== not logged)?
|
||||||
|
* @param \core\event\base $event
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
protected function is_event_ignored(\core\event\base $event) {
|
||||||
|
if ((!CLI_SCRIPT or PHPUNIT_TEST) and !$this->logguests) {
|
||||||
|
// Always log inside CLI scripts because we do not login there.
|
||||||
|
if (!isloggedin() or isguestuser()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finally store the events into the database.
|
* Finally store the events into the database.
|
||||||
*
|
*
|
||||||
* @param \core\event\base[] $events
|
* @param array $evententries raw event data
|
||||||
*/
|
*/
|
||||||
protected function insert_events($events) {
|
protected function insert_event_entries($evententries) {
|
||||||
global $DB;
|
global $DB;
|
||||||
|
|
||||||
$dataobj = array();
|
$DB->insert_records('logstore_standard_log', $evententries);
|
||||||
|
|
||||||
// Filter events.
|
|
||||||
foreach ($events as $event) {
|
|
||||||
if ((!CLI_SCRIPT or PHPUNIT_TEST) and !$this->logguests) {
|
|
||||||
// Always log inside CLI scripts because we do not login there.
|
|
||||||
if (!isloggedin() or isguestuser()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = $event->get_data();
|
|
||||||
$data['other'] = serialize($data['other']);
|
|
||||||
if (CLI_SCRIPT) {
|
|
||||||
$data['origin'] = 'cli';
|
|
||||||
$data['ip'] = null;
|
|
||||||
} else {
|
|
||||||
$data['origin'] = 'web';
|
|
||||||
$data['ip'] = getremoteaddr();
|
|
||||||
}
|
|
||||||
$data['realuserid'] = \core\session\manager::is_loggedinas() ? $_SESSION['USER']->realuser : null;
|
|
||||||
$dataobj[] = $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
$DB->insert_records('logstore_standard_log', $dataobj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get_events_select($selectwhere, array $params, $sort, $limitfrom, $limitnum) {
|
public function get_events_select($selectwhere, array $params, $sort, $limitfrom, $limitnum) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue