Merge branch 'w11_MDL-44496_m27_eventbuffer' of https://github.com/skodak/moodle

This commit is contained in:
Sam Hemelryk 2014-03-11 11:54:05 +13:00
commit 509edd5624
3 changed files with 72 additions and 64 deletions

View file

@ -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.

View file

@ -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);
} }

View file

@ -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) {