use Friendica\Core\Logger;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Util\Introspection;
-use Friendica\Util\Logger\Monolog\FriendicaDevelopHandler;
-use Friendica\Util\Logger\Monolog\FriendicaIntrospectionProcessor;
+use Friendica\Util\Logger\Monolog\DevelopHandler;
+use Friendica\Util\Logger\Monolog\IntrospectionProcessor;
use Friendica\Util\Logger\ProfilerLogger;
use Friendica\Util\Logger\StreamLogger;
use Friendica\Util\Logger\SyslogLogger;
$logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
$logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
- $logger->pushProcessor(new FriendicaIntrospectionProcessor($introspection, LogLevel::DEBUG));
+ $logger->pushProcessor(new IntrospectionProcessor($introspection, LogLevel::DEBUG));
$stream = $config->get('system', 'logfile');
$logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
$logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
- $logger->pushProcessor(new FriendicaIntrospectionProcessor($introspection, LogLevel::DEBUG));
+ $logger->pushProcessor(new IntrospectionProcessor($introspection, LogLevel::DEBUG));
- $logger->pushHandler(new FriendicaDevelopHandler($developerIp));
+ $logger->pushHandler(new DevelopHandler($developerIp));
static::addStreamHandler($logger, $stream, LogLevel::DEBUG);
break;
+++ /dev/null
-<?php
-
-namespace Friendica\Util\Logger;
-
-use Friendica\Util\Introspection;
-use Friendica\Util\Strings;
-use Psr\Log\LoggerInterface;
-use Psr\Log\LogLevel;
-
-/**
- * This class contains all necessary dependencies and calls for Friendica
- * Every new Logger should extend this class and define, how addEntry() works
- *
- * Additional information for each Logger, who extends this class:
- * - Introspection
- * - UID for each call
- * - Channel of the current call (i.e. index, worker, daemon, ...)
- */
-abstract class AbstractFriendicaLogger implements LoggerInterface
-{
- /**
- * The output channel of this logger
- * @var string
- */
- protected $channel;
-
- /**
- * The Introspection for the current call
- * @var Introspection
- */
- protected $introspection;
-
- /**
- * The UID of the current call
- * @var string
- */
- protected $logUid;
-
- /**
- * Adds a new entry to the log
- *
- * @param int $level
- * @param string $message
- * @param array $context
- *
- * @return void
- */
- abstract protected function addEntry($level, $message, $context = []);
-
- /**
- * @param string $channel The output channel
- * @param Introspection $introspection The introspection of the current call
- *
- * @throws \Exception
- */
- public function __construct($channel, Introspection $introspection)
- {
- $this->channel = $channel;
- $this->introspection = $introspection;
- $this->logUid = Strings::getRandomHex(6);
- }
-
- /**
- * Simple interpolation of PSR-3 compliant replacements ( variables between '{' and '}' )
- * @see https://www.php-fig.org/psr/psr-3/#12-message
- *
- * @param string $message
- * @param array $context
- *
- * @return string the interpolated message
- */
- protected function psrInterpolate($message, array $context = array())
- {
- $replace = [];
- foreach ($context as $key => $value) {
- // check that the value can be casted to string
- if (!is_array($value) && (!is_object($value) || method_exists($value, '__toString'))) {
- $replace['{' . $key . '}'] = $value;
- } elseif (is_array($value)) {
- $replace['{' . $key . '}'] = @json_encode($value);
- }
- }
-
- return strtr($message, $replace);
- }
-
- /**
- * {@inheritdoc}
- */
- public function emergency($message, array $context = array())
- {
- $this->addEntry(LogLevel::EMERGENCY, (string) $message, $context);
- }
-
- /**
- * {@inheritdoc}
- */
- public function alert($message, array $context = array())
- {
- $this->addEntry(LogLevel::ALERT, (string) $message, $context);
- }
-
- /**
- * {@inheritdoc}
- */
- public function critical($message, array $context = array())
- {
- $this->addEntry(LogLevel::CRITICAL, (string) $message, $context);
- }
-
- /**
- * {@inheritdoc}
- */
- public function error($message, array $context = array())
- {
- $this->addEntry(LogLevel::ERROR, (string) $message, $context);
- }
-
- /**
- * {@inheritdoc}
- */
- public function warning($message, array $context = array())
- {
- $this->addEntry(LogLevel::WARNING, (string) $message, $context);
- }
-
- /**
- * {@inheritdoc}
- */
- public function notice($message, array $context = array())
- {
- $this->addEntry(LogLevel::NOTICE, (string) $message, $context);
- }
-
- /**
- * {@inheritdoc}
- */
- public function info($message, array $context = array())
- {
- $this->addEntry(LogLevel::INFO, (string) $message, $context);
- }
-
- /**
- * {@inheritdoc}
- */
- public function debug($message, array $context = array())
- {
- $this->addEntry(LogLevel::DEBUG, (string) $message, $context);
- }
-
- /**
- * {@inheritdoc}
- */
- public function log($level, $message, array $context = array())
- {
- $this->addEntry($level, (string) $message, $context);
- }
-}
--- /dev/null
+<?php
+
+namespace Friendica\Util\Logger;
+
+use Friendica\Util\Introspection;
+use Friendica\Util\Strings;
+use Psr\Log\LoggerInterface;
+use Psr\Log\LogLevel;
+
+/**
+ * This class contains all necessary dependencies and calls for Friendica
+ * Every new Logger should extend this class and define, how addEntry() works
+ *
+ * Additional information for each Logger, who extends this class:
+ * - Introspection
+ * - UID for each call
+ * - Channel of the current call (i.e. index, worker, daemon, ...)
+ */
+abstract class AbstractLogger implements LoggerInterface
+{
+ /**
+ * The output channel of this logger
+ * @var string
+ */
+ protected $channel;
+
+ /**
+ * The Introspection for the current call
+ * @var Introspection
+ */
+ protected $introspection;
+
+ /**
+ * The UID of the current call
+ * @var string
+ */
+ protected $logUid;
+
+ /**
+ * Adds a new entry to the log
+ *
+ * @param int $level
+ * @param string $message
+ * @param array $context
+ *
+ * @return void
+ */
+ abstract protected function addEntry($level, $message, $context = []);
+
+ /**
+ * @param string $channel The output channel
+ * @param Introspection $introspection The introspection of the current call
+ *
+ * @throws \Exception
+ */
+ public function __construct($channel, Introspection $introspection)
+ {
+ $this->channel = $channel;
+ $this->introspection = $introspection;
+ $this->logUid = Strings::getRandomHex(6);
+ }
+
+ /**
+ * Simple interpolation of PSR-3 compliant replacements ( variables between '{' and '}' )
+ * @see https://www.php-fig.org/psr/psr-3/#12-message
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return string the interpolated message
+ */
+ protected function psrInterpolate($message, array $context = array())
+ {
+ $replace = [];
+ foreach ($context as $key => $value) {
+ // check that the value can be casted to string
+ if (!is_array($value) && (!is_object($value) || method_exists($value, '__toString'))) {
+ $replace['{' . $key . '}'] = $value;
+ } elseif (is_array($value)) {
+ $replace['{' . $key . '}'] = @json_encode($value);
+ }
+ }
+
+ return strtr($message, $replace);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function emergency($message, array $context = array())
+ {
+ $this->addEntry(LogLevel::EMERGENCY, (string) $message, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function alert($message, array $context = array())
+ {
+ $this->addEntry(LogLevel::ALERT, (string) $message, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function critical($message, array $context = array())
+ {
+ $this->addEntry(LogLevel::CRITICAL, (string) $message, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function error($message, array $context = array())
+ {
+ $this->addEntry(LogLevel::ERROR, (string) $message, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function warning($message, array $context = array())
+ {
+ $this->addEntry(LogLevel::WARNING, (string) $message, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function notice($message, array $context = array())
+ {
+ $this->addEntry(LogLevel::NOTICE, (string) $message, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function info($message, array $context = array())
+ {
+ $this->addEntry(LogLevel::INFO, (string) $message, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function debug($message, array $context = array())
+ {
+ $this->addEntry(LogLevel::DEBUG, (string) $message, $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function log($level, $message, array $context = array())
+ {
+ $this->addEntry($level, (string) $message, $context);
+ }
+}
--- /dev/null
+<?php
+
+namespace Friendica\Util\Logger\Monolog;
+
+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;
+
+ /**
+ * @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($developerIp, $level = Logger::DEBUG, $bubble = true)
+ {
+ parent::__construct($level, $bubble);
+
+ $this->developerIp = $developerIp;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function handle(array $record)
+ {
+ 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) && $_SERVER['REMOTE_ADDR'] != $this->developerIp)
+ {
+ return false;
+ }
+
+ return false === $this->bubble;
+ }
+}
+++ /dev/null
-<?php
-
-namespace Friendica\Util\Logger\Monolog;
-
-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 FriendicaDevelopHandler extends Handler\AbstractHandler
-{
- /**
- * @var string The IP of the developer who wants to debug
- */
- private $developerIp;
-
- /**
- * @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($developerIp, $level = Logger::DEBUG, $bubble = true)
- {
- parent::__construct($level, $bubble);
-
- $this->developerIp = $developerIp;
- }
-
- /**
- * {@inheritdoc}
- */
- public function handle(array $record)
- {
- 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) && $_SERVER['REMOTE_ADDR'] != $this->developerIp)
- {
- return false;
- }
-
- return false === $this->bubble;
- }
-}
+++ /dev/null
-<?php
-
-namespace Friendica\Util\Logger\Monolog;
-
-use Friendica\Util\Introspection;
-use Monolog\Logger;
-use Monolog\Processor\ProcessorInterface;
-
-/**
- * Injects line/file//function where the log message came from
- */
-class FriendicaIntrospectionProcessor 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(array('Monolog\\'));
- $this->introspection = $introspection;
- }
-
- public function __invoke(array $record)
- {
- // 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;
- }
-}
--- /dev/null
+<?php
+
+namespace Friendica\Util\Logger\Monolog;
+
+use Friendica\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(array('Monolog\\'));
+ $this->introspection = $introspection;
+ }
+
+ public function __invoke(array $record)
+ {
+ // 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;
+ }
+}
- A log message
- A context of the log message (f.e which user)
-If possible, a Logger should extend [`AbstractFriendicaLogger`](AbstractFriendicaLogger.php), because it contains additional, Friendica specific business logic for each logging call.
-
-Using AbstractFriendicaLogger makes the logger capable of adding profiling data for each log call.
+If possible, a Logger should extend [`AbstractLogger`](AbstractLogger.php), because it contains additional, Friendica specific business logic for each logging call.
/**
* A Logger instance for logging into a stream (file, stdout, stderr)
*/
-class StreamLogger extends AbstractFriendicaLogger
+class StreamLogger extends AbstractLogger
{
/**
* The minimum loglevel at which this logger will be triggered
* A Logger instance for syslogging (fast, but simple)
* @see http://php.net/manual/en/function.syslog.php
*/
-class SyslogLogger extends AbstractFriendicaLogger
+class SyslogLogger extends AbstractLogger
{
const IDENT = 'Friendica';
$this->assertLoglineNums(5, $text);
}
-
- /**
- * Test if a file cannot get opened
- * @expectedException \UnexpectedValueException
- */
- public function testNoFile()
- {
- $logfile = vfsStream::newFile('friendica.log')
- ->at($this->root)
- ->chmod(0);
-
- $logger = new StreamLogger('test', $logfile->url(), $this->introspection);
-
- $logger->emergency('not working');
- }
-
/**
* Test when a file isn't set
* @expectedException \LogicException
}
/**
- * Test when a file doesn't exist
+ * Test when a file cannot be opened
* @expectedException \UnexpectedValueException
* @expectedExceptionMessageRegExp /The stream or file .* could not be opened: .* /
*/
public function testWrongUrl()
{
- $logger = new StreamLogger('test', 'wrongfile', $this->introspection);
+ $logfile = vfsStream::newFile('friendica.log')
+ ->at($this->root)->chmod(0);
+
+ $logger = new StreamLogger('test', $logfile->url(), $this->introspection);
$logger->emergency('not working');
}
*/
public function testWrongDir()
{
- $logger = new StreamLogger('test', 'a/wrong/directory/file.txt', $this->introspection);
+ $logger = new StreamLogger('test', '/a/wrong/directory/file.txt', $this->introspection);
$logger->emergency('not working');
}