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_addlink to thisimmediately write when logs are added
bool FALSE
Log
$_instancelink to thisSingleton instance container
object Log()
object Log(2) {
protected _messages => array(0)
protected _writers => array(1) (
"0000000019ec0d70000000005413c4e9" => 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
$_messageslink to thislist of added messages
array(0)
array
$_writerslink to thislist 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
);
}
}
}