Move Monolog to Addons
This commit is contained in:
parent
8c084fedad
commit
497fc4e432
|
@ -26,6 +26,7 @@ if (php_sapi_name() !== 'cli') {
|
||||||
}
|
}
|
||||||
|
|
||||||
use Dice\Dice;
|
use Dice\Dice;
|
||||||
|
use Friendica\DI;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
|
||||||
require dirname(__DIR__) . '/vendor/autoload.php';
|
require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
|
@ -33,6 +34,8 @@ require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
|
$dice = (new Dice())->addRules(include __DIR__ . '/../static/dependencies.config.php');
|
||||||
$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['console']]);
|
$dice = $dice->addRule(LoggerInterface::class,['constructParams' => ['console']]);
|
||||||
|
|
||||||
|
/// @fixme Necessary until Hooks inside the Logger can get loaded without the DI-class
|
||||||
|
DI::init($dice);
|
||||||
\Friendica\Core\Logger\Handler\ErrorHandler::register($dice->create(\Psr\Log\LoggerInterface::class));
|
\Friendica\Core\Logger\Handler\ErrorHandler::register($dice->create(\Psr\Log\LoggerInterface::class));
|
||||||
|
|
||||||
(new Friendica\Core\Console($dice, $argv))->execute();
|
(new Friendica\Core\Console($dice, $argv))->execute();
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
"michelf/php-markdown": "^1.7",
|
"michelf/php-markdown": "^1.7",
|
||||||
"minishlink/web-push": "^6.0",
|
"minishlink/web-push": "^6.0",
|
||||||
"mobiledetect/mobiledetectlib": "^2.8",
|
"mobiledetect/mobiledetectlib": "^2.8",
|
||||||
"monolog/monolog": "^1.25",
|
|
||||||
"nikic/fast-route": "^1.3",
|
"nikic/fast-route": "^1.3",
|
||||||
"paragonie/hidden-string": "^1.0",
|
"paragonie/hidden-string": "^1.0",
|
||||||
"patrickschur/language-detection": "^5.0.0",
|
"patrickschur/language-detection": "^5.0.0",
|
||||||
|
@ -50,6 +49,7 @@
|
||||||
"pragmarx/google2fa": "^5.0",
|
"pragmarx/google2fa": "^5.0",
|
||||||
"pragmarx/recovery": "^0.2",
|
"pragmarx/recovery": "^0.2",
|
||||||
"psr/container": "^1.0",
|
"psr/container": "^1.0",
|
||||||
|
"psr/log": "^1.1",
|
||||||
"seld/cli-prompt": "^1.0",
|
"seld/cli-prompt": "^1.0",
|
||||||
"smarty/smarty": "^4",
|
"smarty/smarty": "^4",
|
||||||
"ua-parser/uap-php": "^3.9",
|
"ua-parser/uap-php": "^3.9",
|
||||||
|
|
84
composer.lock
generated
84
composer.lock
generated
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "f5922f03b367e68a5930df6ed80c5c2f",
|
"content-hash": "c851fbba46ed090d0fbaf68e9b3b94df",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "asika/simple-console",
|
"name": "asika/simple-console",
|
||||||
|
@ -1543,88 +1543,6 @@
|
||||||
],
|
],
|
||||||
"time": "2022-02-17T19:24:25+00:00"
|
"time": "2022-02-17T19:24:25+00:00"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "monolog/monolog",
|
|
||||||
"version": "1.27.1",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/Seldaek/monolog.git",
|
|
||||||
"reference": "904713c5929655dc9b97288b69cfeedad610c9a1"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1",
|
|
||||||
"reference": "904713c5929655dc9b97288b69cfeedad610c9a1",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=5.3.0",
|
|
||||||
"psr/log": "~1.0"
|
|
||||||
},
|
|
||||||
"provide": {
|
|
||||||
"psr/log-implementation": "1.0.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"aws/aws-sdk-php": "^2.4.9 || ^3.0",
|
|
||||||
"doctrine/couchdb": "~1.0@dev",
|
|
||||||
"graylog2/gelf-php": "~1.0",
|
|
||||||
"php-amqplib/php-amqplib": "~2.4",
|
|
||||||
"php-console/php-console": "^3.1.3",
|
|
||||||
"phpstan/phpstan": "^0.12.59",
|
|
||||||
"phpunit/phpunit": "~4.5",
|
|
||||||
"ruflin/elastica": ">=0.90 <3.0",
|
|
||||||
"sentry/sentry": "^0.13",
|
|
||||||
"swiftmailer/swiftmailer": "^5.3|^6.0"
|
|
||||||
},
|
|
||||||
"suggest": {
|
|
||||||
"aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
|
|
||||||
"doctrine/couchdb": "Allow sending log messages to a CouchDB server",
|
|
||||||
"ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
|
|
||||||
"ext-mongo": "Allow sending log messages to a MongoDB server",
|
|
||||||
"graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
|
|
||||||
"mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
|
|
||||||
"php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
|
|
||||||
"php-console/php-console": "Allow sending log messages to Google Chrome",
|
|
||||||
"rollbar/rollbar": "Allow sending log messages to Rollbar",
|
|
||||||
"ruflin/elastica": "Allow sending log messages to an Elastic Search server",
|
|
||||||
"sentry/sentry": "Allow sending log messages to a Sentry server"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Monolog\\": "src/Monolog"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Jordi Boggiano",
|
|
||||||
"email": "j.boggiano@seld.be",
|
|
||||||
"homepage": "http://seld.be"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Sends your logs to files, sockets, inboxes, databases and various web services",
|
|
||||||
"homepage": "http://github.com/Seldaek/monolog",
|
|
||||||
"keywords": [
|
|
||||||
"log",
|
|
||||||
"logging",
|
|
||||||
"psr-3"
|
|
||||||
],
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://github.com/Seldaek",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2022-06-09T08:53:42+00:00"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "nikic/fast-route",
|
"name": "nikic/fast-route",
|
||||||
"version": "v1.3.0",
|
"version": "v1.3.0",
|
||||||
|
|
|
@ -919,6 +919,10 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep-
|
||||||
Hook::callAll('block', $hook_data);
|
Hook::callAll('block', $hook_data);
|
||||||
Hook::callAll('unblock', $hook_data);
|
Hook::callAll('unblock', $hook_data);
|
||||||
|
|
||||||
|
### src/Core/Logger/Factory.php
|
||||||
|
|
||||||
|
Hook::callAll('logger_instance', $data);
|
||||||
|
|
||||||
### src/Core/StorageManager
|
### src/Core/StorageManager
|
||||||
|
|
||||||
Hook::callAll('storage_instance', $data);
|
Hook::callAll('storage_instance', $data);
|
||||||
|
|
|
@ -405,6 +405,10 @@ Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Ap
|
||||||
Hook::callAll('block', $hook_data);
|
Hook::callAll('block', $hook_data);
|
||||||
Hook::callAll('unblock', $hook_data);
|
Hook::callAll('unblock', $hook_data);
|
||||||
|
|
||||||
|
### src/Core/Logger/Factory.php
|
||||||
|
|
||||||
|
Hook::callAll('logger_instance', $data);
|
||||||
|
|
||||||
### src/Core/StorageManager
|
### src/Core/StorageManager
|
||||||
|
|
||||||
Hook::callAll('storage_instance', $data);
|
Hook::callAll('storage_instance', $data);
|
||||||
|
|
|
@ -22,19 +22,16 @@
|
||||||
namespace Friendica\Core\Logger\Factory;
|
namespace Friendica\Core\Logger\Factory;
|
||||||
|
|
||||||
use Friendica\Core\Config\Capability\IManageConfigValues;
|
use Friendica\Core\Config\Capability\IManageConfigValues;
|
||||||
use Friendica\Core\Logger\Exception\LoggerException;
|
|
||||||
use Friendica\Core;
|
use Friendica\Core;
|
||||||
use Friendica\Core\Logger\Exception\LogLevelException;
|
use Friendica\Core\Logger\Exception\LogLevelException;
|
||||||
use Friendica\Database\Database;
|
use Friendica\Database\Database;
|
||||||
|
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||||
use Friendica\Util\FileSystem;
|
use Friendica\Util\FileSystem;
|
||||||
use Friendica\Core\Logger\Util\Introspection;
|
use Friendica\Core\Logger\Util\Introspection;
|
||||||
use Friendica\Core\Logger\Type\Monolog\DevelopHandler;
|
|
||||||
use Friendica\Core\Logger\Type\Monolog\IntrospectionProcessor;
|
|
||||||
use Friendica\Core\Logger\Type\ProfilerLogger;
|
use Friendica\Core\Logger\Type\ProfilerLogger;
|
||||||
use Friendica\Core\Logger\Type\StreamLogger;
|
use Friendica\Core\Logger\Type\StreamLogger;
|
||||||
use Friendica\Core\Logger\Type\SyslogLogger;
|
use Friendica\Core\Logger\Type\SyslogLogger;
|
||||||
use Friendica\Util\Profiler;
|
use Friendica\Util\Profiler;
|
||||||
use Monolog;
|
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
use Psr\Log\LogLevel;
|
use Psr\Log\LogLevel;
|
||||||
use Psr\Log\NullLogger;
|
use Psr\Log\NullLogger;
|
||||||
|
@ -60,9 +57,15 @@ class Logger
|
||||||
/** @var string The log-channel (app, worker, ...) */
|
/** @var string The log-channel (app, worker, ...) */
|
||||||
private $channel;
|
private $channel;
|
||||||
|
|
||||||
public function __construct(string $channel)
|
public function __construct(string $channel, bool $includeAddon = true)
|
||||||
{
|
{
|
||||||
$this->channel = $channel;
|
$this->channel = $channel;
|
||||||
|
|
||||||
|
/// @fixme clean solution = Making Addon & Hook dynamic and load them inside the constructor, so there's no custom load logic necessary anymore
|
||||||
|
if ($includeAddon) {
|
||||||
|
Core\Addon::loadAddons();
|
||||||
|
Core\Hook::loadHooks();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -88,35 +91,9 @@ class Logger
|
||||||
$minLevel = $minLevel ?? $config->get('system', 'loglevel');
|
$minLevel = $minLevel ?? $config->get('system', 'loglevel');
|
||||||
$loglevel = self::mapLegacyConfigDebugLevel((string)$minLevel);
|
$loglevel = self::mapLegacyConfigDebugLevel((string)$minLevel);
|
||||||
|
|
||||||
switch ($config->get('system', 'logger_config', 'stream')) {
|
$name = $config->get('system', 'logger_config', 'stream');
|
||||||
case 'monolog':
|
|
||||||
$loggerTimeZone = new \DateTimeZone('UTC');
|
|
||||||
Monolog\Logger::setTimezone($loggerTimeZone);
|
|
||||||
|
|
||||||
$logger = new Monolog\Logger($this->channel);
|
|
||||||
$logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
|
|
||||||
$logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
|
|
||||||
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
|
|
||||||
$logger->pushProcessor(new IntrospectionProcessor($introspection, LogLevel::DEBUG));
|
|
||||||
|
|
||||||
$stream = $config->get('system', 'logfile');
|
|
||||||
|
|
||||||
// just add a stream in case it's either writable or not file
|
|
||||||
if (!is_file($stream) || is_writable($stream)) {
|
|
||||||
try {
|
|
||||||
static::addStreamHandler($logger, $stream, $loglevel);
|
|
||||||
} catch (\Throwable $e) {
|
|
||||||
// No Logger ..
|
|
||||||
try {
|
|
||||||
$logger = new SyslogLogger($this->channel, $introspection, $loglevel);
|
|
||||||
} catch (\Throwable $e) {
|
|
||||||
// No logger ...
|
|
||||||
$logger = new NullLogger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
switch ($name) {
|
||||||
case 'syslog':
|
case 'syslog':
|
||||||
try {
|
try {
|
||||||
$logger = new SyslogLogger($this->channel, $introspection, $loglevel, $config->get('system', 'syslog_flags', SyslogLogger::DEFAULT_FLAGS), $config->get('system', 'syslog_facility', SyslogLogger::DEFAULT_FACILITY));
|
$logger = new SyslogLogger($this->channel, $introspection, $loglevel, $config->get('system', 'syslog_flags', SyslogLogger::DEFAULT_FLAGS), $config->get('system', 'syslog_facility', SyslogLogger::DEFAULT_FACILITY));
|
||||||
|
@ -132,29 +109,48 @@ class Logger
|
||||||
|
|
||||||
case 'stream':
|
case 'stream':
|
||||||
default:
|
default:
|
||||||
$stream = $config->get('system', 'logfile');
|
$data = [
|
||||||
// just add a stream in case it's either writable or not file
|
'name' => $name,
|
||||||
if (!is_file($stream) || is_writable($stream)) {
|
'channel' => $this->channel,
|
||||||
try {
|
'introspection' => $introspection,
|
||||||
$logger = new StreamLogger($this->channel, $stream, $introspection, $fileSystem, $loglevel);
|
'loglevel' => $loglevel,
|
||||||
} catch (LogLevelException $exception) {
|
'logger' => null,
|
||||||
// If there's a wrong config value for loglevel, try again with standard
|
];
|
||||||
$logger = $this->create($database, $config, $profiler, $fileSystem, LogLevel::NOTICE);
|
try {
|
||||||
$logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]);
|
Core\Hook::callAll('logger_instance', $data);
|
||||||
} catch (\Throwable $t) {
|
} catch (InternalServerErrorException $exception) {
|
||||||
// No logger ...
|
$data['logger'] = null;
|
||||||
$logger = new NullLogger();
|
}
|
||||||
}
|
|
||||||
} else {
|
if (($data['logger'] ?? null) instanceof LoggerInterface) {
|
||||||
try {
|
$logger = $data['logger'];
|
||||||
$logger = new SyslogLogger($this->channel, $introspection, $loglevel);
|
}
|
||||||
} catch (LogLevelException $exception) {
|
|
||||||
// If there's a wrong config value for loglevel, try again with standard
|
if (empty($logger)) {
|
||||||
$logger = $this->create($database, $config, $profiler, $fileSystem, LogLevel::NOTICE);
|
$stream = $config->get('system', 'logfile');
|
||||||
$logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]);
|
// just add a stream in case it's either writable or not file
|
||||||
} catch (\Throwable $e) {
|
if (!is_file($stream) || is_writable($stream)) {
|
||||||
// No logger ...
|
try {
|
||||||
$logger = new NullLogger();
|
$logger = new StreamLogger($this->channel, $stream, $introspection, $fileSystem, $loglevel);
|
||||||
|
} catch (LogLevelException $exception) {
|
||||||
|
// If there's a wrong config value for loglevel, try again with standard
|
||||||
|
$logger = $this->create($database, $config, $profiler, $fileSystem, LogLevel::NOTICE);
|
||||||
|
$logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]);
|
||||||
|
} catch (\Throwable $t) {
|
||||||
|
// No logger ...
|
||||||
|
$logger = new NullLogger();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
$logger = new SyslogLogger($this->channel, $introspection, $loglevel);
|
||||||
|
} catch (LogLevelException $exception) {
|
||||||
|
// If there's a wrong config value for loglevel, try again with standard
|
||||||
|
$logger = $this->create($database, $config, $profiler, $fileSystem, LogLevel::NOTICE);
|
||||||
|
$logger->warning('Invalid loglevel set in config.', ['loglevel' => $loglevel]);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
// No logger ...
|
||||||
|
$logger = new NullLogger();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -197,27 +193,11 @@ class Logger
|
||||||
return new NullLogger();
|
return new NullLogger();
|
||||||
}
|
}
|
||||||
|
|
||||||
$loggerTimeZone = new \DateTimeZone('UTC');
|
|
||||||
Monolog\Logger::setTimezone($loggerTimeZone);
|
|
||||||
|
|
||||||
$introspection = new Introspection(self::$ignoreClassList);
|
$introspection = new Introspection(self::$ignoreClassList);
|
||||||
|
|
||||||
switch ($config->get('system', 'logger_config', 'stream')) {
|
$name = $config->get('system', 'logger_config', 'stream');
|
||||||
|
|
||||||
case 'monolog':
|
switch ($name) {
|
||||||
$loggerTimeZone = new \DateTimeZone('UTC');
|
|
||||||
Monolog\Logger::setTimezone($loggerTimeZone);
|
|
||||||
|
|
||||||
$logger = new Monolog\Logger(self::DEV_CHANNEL);
|
|
||||||
$logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
|
|
||||||
$logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
|
|
||||||
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
|
|
||||||
$logger->pushProcessor(new IntrospectionProcessor($introspection, LogLevel::DEBUG));
|
|
||||||
|
|
||||||
$logger->pushHandler(new DevelopHandler($developerIp));
|
|
||||||
|
|
||||||
static::addStreamHandler($logger, $stream, LogLevel::DEBUG);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'syslog':
|
case 'syslog':
|
||||||
$logger = new SyslogLogger(self::DEV_CHANNEL, $introspection, LogLevel::DEBUG);
|
$logger = new SyslogLogger(self::DEV_CHANNEL, $introspection, LogLevel::DEBUG);
|
||||||
|
@ -225,6 +205,23 @@ class Logger
|
||||||
|
|
||||||
case 'stream':
|
case 'stream':
|
||||||
default:
|
default:
|
||||||
|
$data = [
|
||||||
|
'name' => $name,
|
||||||
|
'channel' => self::DEV_CHANNEL,
|
||||||
|
'introspection' => $introspection,
|
||||||
|
'loglevel' => LogLevel::DEBUG,
|
||||||
|
'logger' => null,
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
Core\Hook::callAll('logger_instance', $data);
|
||||||
|
} catch (InternalServerErrorException $exception) {
|
||||||
|
$data['logger'] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($data['logger'] ?? null) instanceof LoggerInterface) {
|
||||||
|
return $data['logger'];
|
||||||
|
}
|
||||||
|
|
||||||
$logger = new StreamLogger(self::DEV_CHANNEL, $stream, $introspection, $fileSystem, LogLevel::DEBUG);
|
$logger = new StreamLogger(self::DEV_CHANNEL, $stream, $introspection, $fileSystem, LogLevel::DEBUG);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -273,38 +270,4 @@ class Logger
|
||||||
return $level;
|
return $level;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Adding a handler to a given logger instance
|
|
||||||
*
|
|
||||||
* @param LoggerInterface $logger The logger instance
|
|
||||||
* @param mixed $stream The stream which handles the logger output
|
|
||||||
* @param string $level The level, for which this handler at least should handle logging
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*
|
|
||||||
* @throws LoggerException
|
|
||||||
*/
|
|
||||||
public static function addStreamHandler(LoggerInterface $logger, $stream, string $level = LogLevel::NOTICE)
|
|
||||||
{
|
|
||||||
if ($logger instanceof Monolog\Logger) {
|
|
||||||
$loglevel = Monolog\Logger::toMonologLevel($level);
|
|
||||||
|
|
||||||
// fallback to notice if an invalid loglevel is set
|
|
||||||
if (!is_int($loglevel)) {
|
|
||||||
$loglevel = LogLevel::NOTICE;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
$fileHandler = new Monolog\Handler\StreamHandler($stream, $loglevel);
|
|
||||||
|
|
||||||
$formatter = new Monolog\Formatter\LineFormatter("%datetime% %channel% [%level_name%]: %message% %context% %extra%\n");
|
|
||||||
$fileHandler->setFormatter($formatter);
|
|
||||||
|
|
||||||
$logger->pushHandler($fileHandler);
|
|
||||||
} catch (\Exception $exception) {
|
|
||||||
throw new LoggerException('Cannot create Monolog Logger.', $exception);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @copyright Copyright (C) 2010-2022, the Friendica project
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Friendica\Core\Logger\Type\Monolog;
|
|
||||||
|
|
||||||
use Friendica\App\Request;
|
|
||||||
use Monolog\Handler;
|
|
||||||
use Monolog\Logger;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple handler for Friendica developers to use for deeper logging
|
|
||||||
*
|
|
||||||
* If you want to debug only interactions from your IP or the IP of a remote server for federation debug,
|
|
||||||
* you'll use Logger::develop() for the duration of your work, and you clean it up when you're done before submitting your PR.
|
|
||||||
*/
|
|
||||||
class DevelopHandler extends Handler\AbstractHandler
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var string The IP of the developer who wants to debug
|
|
||||||
*/
|
|
||||||
private $developerIp;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string The IP of the current request
|
|
||||||
*/
|
|
||||||
private $remoteAddress;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Request $request The current http request
|
|
||||||
* @param string $developerIp The IP of the developer who wants to debug
|
|
||||||
* @param int $level The minimum logging level at which this handler will be triggered
|
|
||||||
* @param bool $bubble Whether the messages that are handled can bubble up the stack or not
|
|
||||||
*/
|
|
||||||
public function __construct(Request $request, $developerIp, int $level = Logger::DEBUG, bool $bubble = true)
|
|
||||||
{
|
|
||||||
parent::__construct($level, $bubble);
|
|
||||||
|
|
||||||
$this->developerIp = $developerIp;
|
|
||||||
$this->remoteAddress = $request->getRemoteAddress();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function handle(array $record): bool
|
|
||||||
{
|
|
||||||
if (!$this->isHandling($record)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Just in case the remote IP is the same as the developer IP log the output
|
|
||||||
if (!is_null($this->developerIp) && $this->remoteAddress != $this->developerIp) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false === $this->bubble;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @copyright Copyright (C) 2010-2022, the Friendica project
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Friendica\Core\Logger\Type\Monolog;
|
|
||||||
|
|
||||||
use Friendica\Core\Logger\Util\Introspection;
|
|
||||||
use Monolog\Logger;
|
|
||||||
use Monolog\Processor\ProcessorInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Injects line/file//function where the log message came from
|
|
||||||
*/
|
|
||||||
class IntrospectionProcessor implements ProcessorInterface
|
|
||||||
{
|
|
||||||
private $level;
|
|
||||||
|
|
||||||
private $introspection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Introspection $introspection Holds the Introspection of the current call
|
|
||||||
* @param string|int $level The minimum logging level at which this Processor will be triggered
|
|
||||||
*/
|
|
||||||
public function __construct(Introspection $introspection, $level = Logger::DEBUG)
|
|
||||||
{
|
|
||||||
$this->level = Logger::toMonologLevel($level);
|
|
||||||
$introspection->addClasses(['Monolog\\']);
|
|
||||||
$this->introspection = $introspection;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __invoke(array $record): array
|
|
||||||
{
|
|
||||||
// return if the level is not high enough
|
|
||||||
if ($record['level'] < $this->level) {
|
|
||||||
return $record;
|
|
||||||
}
|
|
||||||
// we should have the call source now
|
|
||||||
$record['extra'] = array_merge(
|
|
||||||
$record['extra'],
|
|
||||||
$this->introspection->getRecord()
|
|
||||||
);
|
|
||||||
|
|
||||||
return $record;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,6 @@ This namespace contains the different implementations of a Logger.
|
||||||
### Configuration guideline
|
### Configuration guideline
|
||||||
|
|
||||||
The following settings are possible for `logger_config`:
|
The following settings are possible for `logger_config`:
|
||||||
- `monolog`: A Logging framework with lots of additions (see [Monolog](https://github.com/Seldaek/monolog/)). There are just Friendica additions inside the Monolog directory
|
|
||||||
- [`stream`](StreamLogger.php): A small logger for files or streams
|
- [`stream`](StreamLogger.php): A small logger for files or streams
|
||||||
- [`syslog`](SyslogLogger.php): Prints the logging output into the syslog
|
- [`syslog`](SyslogLogger.php): Prints the logging output into the syslog
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ use PDO;
|
||||||
use PDOException;
|
use PDOException;
|
||||||
use PDOStatement;
|
use PDOStatement;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Psr\Log\NullLogger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is for the low level database stuff that does driver specific things.
|
* This class is for the low level database stuff that does driver specific things.
|
||||||
|
@ -80,15 +81,17 @@ class Database
|
||||||
/** @var ViewDefinition */
|
/** @var ViewDefinition */
|
||||||
protected $viewDefinition;
|
protected $viewDefinition;
|
||||||
|
|
||||||
public function __construct(Cache $configCache, Profiler $profiler, DbaDefinition $dbaDefinition, ViewDefinition $viewDefinition, LoggerInterface $logger)
|
public function __construct(Cache $configCache, Profiler $profiler, DbaDefinition $dbaDefinition, ViewDefinition $viewDefinition)
|
||||||
{
|
{
|
||||||
// We are storing these values for being able to perform a reconnect
|
// We are storing these values for being able to perform a reconnect
|
||||||
$this->configCache = $configCache;
|
$this->configCache = $configCache;
|
||||||
$this->profiler = $profiler;
|
$this->profiler = $profiler;
|
||||||
$this->logger = $logger;
|
|
||||||
$this->dbaDefinition = $dbaDefinition;
|
$this->dbaDefinition = $dbaDefinition;
|
||||||
$this->viewDefinition = $viewDefinition;
|
$this->viewDefinition = $viewDefinition;
|
||||||
|
|
||||||
|
// Temporary NullLogger until we can fetch the logger class from the config
|
||||||
|
$this->logger = new NullLogger();
|
||||||
|
|
||||||
$this->connect();
|
$this->connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,6 @@ class DatabaseCacheTest extends CacheTest
|
||||||
|
|
||||||
protected function getInstance()
|
protected function getInstance()
|
||||||
{
|
{
|
||||||
$logger = new NullLogger();
|
|
||||||
$profiler = Mockery::mock(Profiler::class);
|
$profiler = Mockery::mock(Profiler::class);
|
||||||
$profiler->shouldReceive('startRecording');
|
$profiler->shouldReceive('startRecording');
|
||||||
$profiler->shouldReceive('stopRecording');
|
$profiler->shouldReceive('stopRecording');
|
||||||
|
@ -62,7 +61,7 @@ class DatabaseCacheTest extends CacheTest
|
||||||
$dbaDefinition = (new DbaDefinition($configCache->get('system', 'basepath')))->load();
|
$dbaDefinition = (new DbaDefinition($configCache->get('system', 'basepath')))->load();
|
||||||
$viewDefinition = (new ViewDefinition($configCache->get('system', 'basepath')))->load();
|
$viewDefinition = (new ViewDefinition($configCache->get('system', 'basepath')))->load();
|
||||||
|
|
||||||
$dba = new StaticDatabase($configCache, $profiler, $dbaDefinition, $viewDefinition, $logger);
|
$dba = new StaticDatabase($configCache, $profiler, $dbaDefinition, $viewDefinition);
|
||||||
|
|
||||||
$this->cache = new Cache\Type\DatabaseCache('database', $dba);
|
$this->cache = new Cache\Type\DatabaseCache('database', $dba);
|
||||||
return $this->cache;
|
return $this->cache;
|
||||||
|
|
|
@ -47,7 +47,6 @@ class DatabaseStorageTest extends StorageTest
|
||||||
|
|
||||||
protected function getInstance()
|
protected function getInstance()
|
||||||
{
|
{
|
||||||
$logger = new NullLogger();
|
|
||||||
$profiler = \Mockery::mock(Profiler::class);
|
$profiler = \Mockery::mock(Profiler::class);
|
||||||
$profiler->shouldReceive('startRecording');
|
$profiler->shouldReceive('startRecording');
|
||||||
$profiler->shouldReceive('stopRecording');
|
$profiler->shouldReceive('stopRecording');
|
||||||
|
@ -61,7 +60,7 @@ class DatabaseStorageTest extends StorageTest
|
||||||
$dbaDefinition = (new DbaDefinition($configCache->get('system', 'basepath')))->load();
|
$dbaDefinition = (new DbaDefinition($configCache->get('system', 'basepath')))->load();
|
||||||
$viewDefinition = (new ViewDefinition($configCache->get('system', 'basepath')))->load();
|
$viewDefinition = (new ViewDefinition($configCache->get('system', 'basepath')))->load();
|
||||||
|
|
||||||
$dba = new StaticDatabase($configCache, $profiler, $dbaDefinition, $viewDefinition, $logger);
|
$dba = new StaticDatabase($configCache, $profiler, $dbaDefinition, $viewDefinition);
|
||||||
|
|
||||||
return new Database($dba);
|
return new Database($dba);
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ class StorageManagerTest extends DatabaseTest
|
||||||
$dbaDefinition = (new DbaDefinition($configCache->get('system', 'basepath')))->load();
|
$dbaDefinition = (new DbaDefinition($configCache->get('system', 'basepath')))->load();
|
||||||
$viewDefinition = (new ViewDefinition($configCache->get('system', 'basepath')))->load();
|
$viewDefinition = (new ViewDefinition($configCache->get('system', 'basepath')))->load();
|
||||||
|
|
||||||
$this->dba = new StaticDatabase($configCache, $profiler, $dbaDefinition, $viewDefinition, $this->logger);
|
$this->dba = new StaticDatabase($configCache, $profiler, $dbaDefinition, $viewDefinition);
|
||||||
|
|
||||||
$configModel = new Repository\Config($this->dba, new Mode(Mode::DBCONFIGAVAILABLE));
|
$configModel = new Repository\Config($this->dba, new Mode(Mode::DBCONFIGAVAILABLE));
|
||||||
$this->config = new PreloadConfig($configCache, $configModel);
|
$this->config = new PreloadConfig($configCache, $configModel);
|
||||||
|
|
Loading…
Reference in a new issue