MDL-46881 core_task: Add a logging trait
[moodle.git] / lib / classes / task / logging_trait.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * This file defines a trait to assist with logging in tasks.
19  *
20  * @package    core
21  * @copyright  2018 Andrew Nicols <andrew@nicols.co.uk>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core\task;
27 defined('MOODLE_INTERNAL') || die();
29 /**
30  * This trait includes functions to assist with logging in tasks.
31  *
32  * @package    core
33  * @copyright  2018 Andrew Nicols <andrew@nicols.co.uk>
34  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
35  */
36 trait logging_trait {
38     /**
39      * @var \progress_trace
40      */
41     protected $_trace = null;
43     /**
44      * @var \stdClass
45      */
46     protected $_tracestats = null;
48     /**
49      * Get the progress_trace.
50      *
51      * @return  \progress_trace
52      */
53     protected function get_trace() {
54         if (null === $this->_trace) {
55             $this->_trace = new \text_progress_trace();
56             $this->_tracestats = (object) [];
57         }
59         return $this->_trace;
60     }
62     /**
63      * Log a message to the progress tracer.
64      *
65      * @param   string  $message
66      * @param   int     $depth
67      */
68     protected function log($message, $depth = 1) {
69         $this->get_trace()
70             ->output($message, $depth);
71     }
73     /**
74      * Log a start message to the progress tracer.
75      *
76      * @param   string  $message
77      * @param   int     $depth
78      */
79     protected function log_start($message, $depth = 0) {
80         $this->get_trace();
82         if (defined('MDL_PERFTOLOG') && MDL_PERFTOLOG) {
83             $this->_tracestats->$depth = [
84                 'mem' => memory_get_usage(),
85                 'time' => microtime(),
86             ];
87         }
89         $this->log($message, $depth);
90     }
92     /**
93      * Log an end message to the progress tracer.
94      *
95      * @param   string  $message
96      * @param   int     $depth
97      */
98     protected function log_finish($message, $depth = 0) {
99         $this->log($message, $depth);
100         if (isset($this->_tracestats->$depth)) {
101             $startstats = $this->_tracestats->$depth;
102             $this->log(
103                     sprintf("Time taken %s, memory total: %s, Memory growth: %s, Memory peak: %s",
104                         microtime_diff($startstats['time'], microtime()),
105                         display_size(memory_get_usage()),
106                         display_size(memory_get_usage() - $startstats['mem']),
107                         display_size(memory_get_peak_usage())
108                     ),
109                     $depth + 1
110                 );
111         }
112     }