2018-10-29 20:10:35 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* @file src/Core/Logger.php
|
|
|
|
*/
|
|
|
|
namespace Friendica\Core;
|
|
|
|
|
2018-12-30 20:42:56 +00:00
|
|
|
use Friendica\App;
|
2018-10-30 14:02:52 +00:00
|
|
|
use Friendica\BaseObject;
|
2018-12-30 20:42:56 +00:00
|
|
|
use Monolog;
|
2018-10-29 21:27:28 +00:00
|
|
|
use Friendica\Util\DateTimeFormat;
|
2018-10-29 20:10:35 +00:00
|
|
|
|
2018-10-30 11:59:45 +00:00
|
|
|
/**
|
|
|
|
* @brief Logger functions
|
|
|
|
*/
|
|
|
|
class Logger extends BaseObject
|
2018-10-29 20:10:35 +00:00
|
|
|
{
|
2018-12-30 20:42:56 +00:00
|
|
|
/**
|
|
|
|
* Creates a basic Monolog instance for logging.
|
|
|
|
*
|
|
|
|
* @param string $application the current application name (index, daemon, ...)
|
|
|
|
*
|
|
|
|
* @return Monolog\Logger The Logger instance
|
|
|
|
*/
|
|
|
|
public static function create($application)
|
|
|
|
{
|
|
|
|
$logger = new Monolog\Logger($application);
|
|
|
|
|
|
|
|
$logger->pushProcessor(new Monolog\Processor\IntrospectionProcessor());
|
|
|
|
$logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
|
|
|
|
$logger->pushProcessor(new Monolog\Processor\WebProcessor());
|
|
|
|
$logger->pushProcessor(new App\FriendicaLoggerProcessor());
|
|
|
|
|
|
|
|
return $logger;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the default Logging handler for this instance.
|
|
|
|
* Can be combined with other handlers too if necessary.
|
|
|
|
*
|
|
|
|
* @param Monolog\Logger $logger The Logger instance of this Application
|
|
|
|
* @param App $app The Friendica Application
|
|
|
|
*/
|
|
|
|
public static function loadDefaultHandler($logger, $app)
|
|
|
|
{
|
|
|
|
foreach ($logger->getProcessors() as $processor) {
|
|
|
|
if ($processor instanceof App\FriendicaLoggerProcessor) {
|
|
|
|
$processor->setProcessId($app->process_id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$debugging = Config::get('system', 'debugging');
|
|
|
|
$logfile = Config::get('system', 'logfile');
|
|
|
|
$loglevel = intval(Config::get('system', 'loglevel'));
|
|
|
|
|
|
|
|
if (!$debugging || !$logfile) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$fileHandler = new Monolog\Handler\StreamHandler($logfile . ".1", $loglevel);
|
|
|
|
$logger->pushHandler($fileHandler);
|
|
|
|
}
|
|
|
|
|
2018-10-30 11:59:45 +00:00
|
|
|
// Log levels:
|
2018-12-30 20:42:56 +00:00
|
|
|
//EMERGENCY
|
|
|
|
//ALERT
|
|
|
|
//CRITICAL
|
|
|
|
const WARNING = 0; //ERROR
|
|
|
|
const INFO = 1; //WARNING
|
|
|
|
const TRACE = 2; //NOTICE(default)
|
|
|
|
const DEBUG = 3; //INFO
|
|
|
|
const DATA = 4; //INFO
|
|
|
|
const ALL = 5; //DEBUG
|
2018-10-30 11:59:45 +00:00
|
|
|
|
2018-10-30 15:40:11 +00:00
|
|
|
public static $levels = [
|
|
|
|
self::WARNING => 'Warning',
|
|
|
|
self::INFO => 'Info',
|
|
|
|
self::TRACE => 'Trace',
|
|
|
|
self::DEBUG => 'Debug',
|
|
|
|
self::DATA => 'Data',
|
|
|
|
self::ALL => 'All',
|
|
|
|
];
|
2018-10-30 11:59:45 +00:00
|
|
|
|
2018-10-29 20:10:35 +00:00
|
|
|
/**
|
|
|
|
* @brief Logs the given message at the given log level
|
|
|
|
*
|
|
|
|
* @param string $msg
|
|
|
|
* @param int $level
|
2018-12-30 20:42:56 +00:00
|
|
|
*
|
|
|
|
* @deprecated since 2019.03 - use App->getLogger() instead
|
2018-10-29 20:10:35 +00:00
|
|
|
*/
|
2018-10-30 13:56:41 +00:00
|
|
|
public static function log($msg, $level = self::INFO)
|
2018-10-29 20:10:35 +00:00
|
|
|
{
|
2018-10-30 11:59:45 +00:00
|
|
|
$a = self::getApp();
|
2018-10-29 20:10:35 +00:00
|
|
|
|
|
|
|
$debugging = Config::get('system', 'debugging');
|
|
|
|
$logfile = Config::get('system', 'logfile');
|
|
|
|
$loglevel = intval(Config::get('system', 'loglevel'));
|
|
|
|
|
|
|
|
if (
|
|
|
|
!$debugging
|
|
|
|
|| !$logfile
|
|
|
|
|| $level > $loglevel
|
|
|
|
) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-10-30 11:59:45 +00:00
|
|
|
$processId = session_id();
|
2018-10-29 20:10:35 +00:00
|
|
|
|
2018-10-30 11:59:45 +00:00
|
|
|
if ($processId == '')
|
|
|
|
{
|
|
|
|
$processId = $a->process_id;
|
2018-10-29 20:10:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
$callers = debug_backtrace();
|
|
|
|
|
|
|
|
if (count($callers) > 1) {
|
|
|
|
$function = $callers[1]['function'];
|
|
|
|
} else {
|
|
|
|
$function = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
$logline = sprintf("%s@%s\t[%s]:%s:%s:%s\t%s\n",
|
|
|
|
DateTimeFormat::utcNow(DateTimeFormat::ATOM),
|
2018-10-30 11:59:45 +00:00
|
|
|
$processId,
|
2018-10-30 15:40:11 +00:00
|
|
|
self::$levels[$level],
|
2018-10-29 20:10:35 +00:00
|
|
|
basename($callers[0]['file']),
|
|
|
|
$callers[0]['line'],
|
|
|
|
$function,
|
|
|
|
$msg
|
|
|
|
);
|
|
|
|
|
|
|
|
$stamp1 = microtime(true);
|
|
|
|
@file_put_contents($logfile, $logline, FILE_APPEND);
|
|
|
|
$a->saveTimestamp($stamp1, "file");
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief An alternative logger for development.
|
2018-10-29 21:20:46 +00:00
|
|
|
* Works largely as log() but allows developers
|
2018-10-29 20:10:35 +00:00
|
|
|
* to isolate particular elements they are targetting
|
|
|
|
* personally without background noise
|
|
|
|
*
|
|
|
|
* @param string $msg
|
2018-12-30 20:42:56 +00:00
|
|
|
*
|
|
|
|
* * @deprecated since 2019.03 - never used
|
2018-10-29 20:10:35 +00:00
|
|
|
*/
|
2018-10-30 15:40:11 +00:00
|
|
|
public static function devLog($msg)
|
2018-10-29 20:10:35 +00:00
|
|
|
{
|
2018-10-30 11:59:45 +00:00
|
|
|
$a = self::getApp();
|
2018-10-29 20:10:35 +00:00
|
|
|
|
|
|
|
$logfile = Config::get('system', 'dlogfile');
|
2018-10-30 11:59:45 +00:00
|
|
|
|
2018-10-29 20:10:35 +00:00
|
|
|
if (!$logfile) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$dlogip = Config::get('system', 'dlogip');
|
2018-10-30 11:59:45 +00:00
|
|
|
|
|
|
|
if (!is_null($dlogip) && $_SERVER['REMOTE_ADDR'] != $dlogip)
|
|
|
|
{
|
2018-10-29 20:10:35 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-10-30 11:59:45 +00:00
|
|
|
$processId = session_id();
|
2018-10-29 20:10:35 +00:00
|
|
|
|
2018-10-30 11:59:45 +00:00
|
|
|
if ($processId == '')
|
|
|
|
{
|
|
|
|
$processId = $a->process_id;
|
2018-10-29 20:10:35 +00:00
|
|
|
}
|
|
|
|
|
2018-11-10 13:17:33 +00:00
|
|
|
if (!is_string($msg)) {
|
|
|
|
$msg = var_export($msg, true);
|
|
|
|
}
|
|
|
|
|
2018-10-29 20:10:35 +00:00
|
|
|
$callers = debug_backtrace();
|
|
|
|
$logline = sprintf("%s@\t%s:\t%s:\t%s\t%s\t%s\n",
|
|
|
|
DateTimeFormat::utcNow(),
|
2018-10-30 11:59:45 +00:00
|
|
|
$processId,
|
2018-10-29 20:10:35 +00:00
|
|
|
basename($callers[0]['file']),
|
|
|
|
$callers[0]['line'],
|
|
|
|
$callers[1]['function'],
|
|
|
|
$msg
|
|
|
|
);
|
|
|
|
|
|
|
|
$stamp1 = microtime(true);
|
|
|
|
@file_put_contents($logfile, $logline, FILE_APPEND);
|
|
|
|
$a->saveTimestamp($stamp1, "file");
|
|
|
|
}
|
2018-10-30 11:59:45 +00:00
|
|
|
}
|