public static function log(array $message, bool $fire = true) : bool
{
// Adds default values if missing
if (!isset($message['file'])) {
$message['file'] = null;
}
if (!isset($message['line'])) {
$message['line'] = null;
}
if (!isset($message['trace'])) {
$message['trace'] = [];
}
if (!isset($message['previous'])) {
$message['previous'] = [];
}
// We don't want HTML tags and entities in the log
if (ini_get('html_errors')) {
$message['text'] = html_entity_decode(strip_tags($message['text']));
}
// Request type
if (!empty($_SERVER['argv'])) {
// CLI
$request = implode(' ', $_SERVER['argv']);
} else {
// Apache
$request = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
$request .= $_SERVER['REQUEST_URI'];
}
// Base text
$text = sprintf('%s [Request: %s]', $message['text'], $request);
if (isset($message['file'], $message['line'])) {
$text .= sprintf(' [%s: %s]', $message['file'], $message['line']);
}
$log = sprintf("%s: %s\n", strtoupper($message['type']), $text);
// Trace
$log .= self::getTraceLog($message['trace']);
// Previous exceptions
$previousTrace = $message['trace'];
foreach ($message['previous'] as $previous) {
// Throw away trace parts that have already been processed
$trace = array_reverse(array_diff_key(array_reverse($previous->getTrace()), array_reverse($previousTrace)));
$previousTrace = $previous->getTrace();
$log .= sprintf("Previous: %s [%s] [%s: %s]\n", $previous->getMessage(), $previous->getCode(), $previous->getFile(), $previous->getLine());
$log .= self::getTraceLog($trace);
}
// FirePHP log for debugging
if (self::$debug && $fire) {
self::firephp($message);
}
// Logging
return error_log(trim($log));
}