diff --git a/admin/tool/log/classes/helper/buffered_writer.php b/admin/tool/log/classes/helper/buffered_writer.php index d341452bbb4..9ffac2b9b33 100644 --- a/admin/tool/log/classes/helper/buffered_writer.php +++ b/admin/tool/log/classes/helper/buffered_writer.php @@ -44,6 +44,13 @@ trait buffered_writer { /** @var int $count Counter. */ 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 * defined. @@ -53,7 +60,26 @@ trait buffered_writer { * @return void */ 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++; if (!isset($this->buffersize)) { @@ -75,15 +101,15 @@ trait buffered_writer { $events = $this->buffer; $this->count = 0; $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. * - * @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. diff --git a/admin/tool/log/store/database/classes/log/store.php b/admin/tool/log/store/database/classes/log/store.php index aad8c9295e7..9ab22f7b831 100644 --- a/admin/tool/log/store/database/classes/log/store.php +++ b/admin/tool/log/store/database/classes/log/store.php @@ -107,49 +107,41 @@ class store implements \tool_log\log\writer, \core\log\sql_select_reader { 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. * - * @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()) { return; } if (!$dbtable = $this->get_config('dbtable')) { 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 { - $this->extdb->insert_records($dbtable, $dataobj); + $this->extdb->insert_records($dbtable, $evententries); } catch (\moodle_exception $e) { debugging('Cannot write to external database: ' . $e->getMessage(), DEBUG_DEVELOPER); } diff --git a/admin/tool/log/store/standard/classes/log/store.php b/admin/tool/log/store/standard/classes/log/store.php index c2dd866b2aa..5f8e433b4ef 100644 --- a/admin/tool/log/store/standard/classes/log/store.php +++ b/admin/tool/log/store/standard/classes/log/store.php @@ -40,39 +40,30 @@ class store implements \tool_log\log\writer, \core\log\sql_internal_reader { $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. * - * @param \core\event\base[] $events + * @param array $evententries raw event data */ - protected function insert_events($events) { + protected function insert_event_entries($evententries) { global $DB; - $dataobj = array(); - - // 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); + $DB->insert_records('logstore_standard_log', $evententries); } public function get_events_select($selectwhere, array $params, $sort, $limitfrom, $limitnum) {