Message logging with observer-based log writing.
This class does not support extensions, only additional writers.
Class declared in SYSPATH/classes/Log.php on line 3.
integer 0
integer 1
integer 2
integer 3
integer 4
integer 5
integer 6
integer 7
boolean
$write_on_addimmediately write when logs are added
bool FALSE
Log
$_instanceSingleton instance container
object Log()
object Log(2) {
protected _messages => array(0)
protected _writers => array(1) (
"0000000000f1d038000000000f3ebddf" => array(2) (
"object" => object Log_File(2) {
protected _directory => string(33) "/srv/guides/3.4/application/logs/"
protected _log_levels => array(8) (
0 => string(9) "EMERGENCY"
1 => string(5) "ALERT"
2 => string(8) "CRITICAL"
3 => string(5) "ERROR"
4 => string(7) "WARNING"
5 => string(6) "NOTICE"
6 => string(4) "INFO"
7 => string(5) "DEBUG"
)
}
"levels" => array(0)
)
)
}
array
$_messageslist of added messages
array(0)
array
$_writerslist of log writers
array(0)
Adds a message to the log. Replacement values must be passed in to be replaced using strtr.
$log->add(Log::ERROR, 'Could not locate user: :user', [
':user' => $username,
]);
string
$level
required - Level of message string
$message
required - Message body array
$values
= NULL - Values to replace in the message array
$additional
= NULL - Additional custom parameters to supply to the log writer Log
public function add($level, $message, array $values = null, array $additional = null)
{
if ($values) {
// Insert the values into the message
$message = strtr($message, $values);
}
// Grab a copy of the trace
if (isset($additional['exception'])) {
$trace = $additional['exception']->getTrace();
} else {
// Older php version don't have 'DEBUG_BACKTRACE_IGNORE_ARGS', so manually remove the args from the backtrace
if (!defined('DEBUG_BACKTRACE_IGNORE_ARGS')) {
$trace = array_map(function ($item) {
unset($item['args']);
return $item;
}, array_slice(debug_backtrace(false), 1));
} else {
$trace = array_slice(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), 1);
}
}
if ($additional == null) {
$additional = [];
}
// Create a new message
$this->_messages[] = [
'time' => time(),
'level' => $level,
'body' => $message,
'trace' => $trace,
'file' => isset($trace[0]['file']) ? $trace[0]['file'] : null,
'line' => isset($trace[0]['line']) ? $trace[0]['line'] : null,
'class' => isset($trace[0]['class']) ? $trace[0]['class'] : null,
'function' => isset($trace[0]['function']) ? $trace[0]['function'] : null,
'additional' => $additional,
];
if (Log::$write_on_add) {
// Write logs as they are added
$this->write();
}
return $this;
}
Attaches a log writer, and optionally limits the levels of messages that will be written by the writer.
$log->attach($writer);
Log_Writer
$writer
required - Instance mixed
$levels
= array(0) - Array of messages levels to write OR max level to write integer
$min_level
= integer 0 - Min level to write IF $levels is not an array Log
public function attach(Log_Writer $writer, $levels = [], $min_level = 0)
{
if (!is_array($levels)) {
$levels = range($min_level, $levels);
}
$this->_writers["{$writer}"] = [
'object' => $writer,
'levels' => $levels
];
return $this;
}
Detaches a log writer. The same writer object must be used.
$log->detach($writer);
Log_Writer
$writer
required - Instance Log
public function detach(Log_Writer $writer)
{
// Remove the writer
unset($this->_writers["{$writer}"]);
return $this;
}
Get the singleton instance of this class and enable writing at shutdown.
$log = Log::instance();
Log
public static function instance()
{
if (Log::$_instance === null) {
// Create a new instance
Log::$_instance = new Log;
// Write the logs at shutdown
register_shutdown_function([Log::$_instance, 'write']);
}
return Log::$_instance;
}
Write and clear all of the messages.
$log->write();
void
public function write()
{
if (empty($this->_messages)) {
// There is nothing to write, move along
return;
}
// Import all messages locally
$messages = $this->_messages;
// Reset the messages array
$this->_messages = [];
foreach ($this->_writers as $writer) {
if (empty($writer['levels'])) {
// Write all of the messages
$writer['object']->write($messages);
} else {
// Filtered messages
$filtered = [];
foreach ($messages as $message) {
if (in_array($message['level'], $writer['levels'])) {
// Writer accepts this kind of message
$filtered[] = $message;
}
}
// Write the filtered messages
$writer['object']->write($filtered);
}
}
}