Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authordiosmosis <diosmosis@users.noreply.github.com>2019-02-18 17:02:29 +0300
committerGitHub <noreply@github.com>2019-02-18 17:02:29 +0300
commit8d3fe62389469347f7ebc551ee36f4527655b804 (patch)
treebeea4c5ba26e3969e47441f948c152b471bf20a9 /core
parent99d42f5b8ca81f5481635c0cbea794d4b7de783b (diff)
Enable fingers crossed handler via INI config and show backtrace in logs/archive api output (#13923)
* Add config to use FringersCrossedHandler (untested) * Get to work in different contexts. * Add changelog note. * Make sure more exceptions make it to the logs, make backtrace include previous exceptions, do not use screen writer if in cli mode, always print backtrace if in CLI mode and archivephp triggered. * Add log capturing handler. * Remove options from global.ini.php sibnce they may be temporary. * Add UI test triggering an error w/ the screen handler. * Add some more log statements, ignore logs in screen writer, replace part of message in ExceptionToTextProcessor instead of whole message. * Add missing license. * Update changelog, move new item to 3.9 * Fixing some integration tests. * Fix another unit test. * One more test fix. * Try to get rid of xss testing warning. * Try again to get rid of warning. * Try again to get rid of warning. * Try again to get rid of warning.
Diffstat (limited to 'core')
-rw-r--r--core/API/Proxy.php12
-rw-r--r--core/API/Request.php7
-rw-r--r--core/API/ResponseBuilder.php15
-rw-r--r--core/ArchiveProcessor/PluginsArchiver.php2
-rw-r--r--core/CliMulti.php5
-rw-r--r--core/Development.php9
-rw-r--r--core/ErrorHandler.php4
-rw-r--r--core/ExceptionHandler.php21
-rw-r--r--core/FrontController.php11
-rw-r--r--core/Plugin/ViewDataTable.php2
-rw-r--r--core/Plugin/Visualization.php11
-rw-r--r--core/Session.php6
-rw-r--r--core/testMinimumPhpVersion.php6
13 files changed, 80 insertions, 31 deletions
diff --git a/core/API/Proxy.php b/core/API/Proxy.php
index 34b202f94d..1f2ca5a59d 100644
--- a/core/API/Proxy.php
+++ b/core/API/Proxy.php
@@ -11,6 +11,7 @@ namespace Piwik\API;
use Exception;
use Piwik\Common;
+use Piwik\Container\StaticContainer;
use Piwik\Context;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
@@ -25,15 +26,13 @@ use ReflectionMethod;
* object, with the parameters in the right order.
*
* It will also log the performance of API calls (time spent, parameter values, etc.) if logger available
- *
- * @method static Proxy getInstance()
*/
-class Proxy extends Singleton
+class Proxy
{
// array of already registered plugins names
protected $alreadyRegistered = array();
- private $metadataArray = array();
+ protected $metadataArray = array();
private $hideIgnoredFunctions = true;
// when a parameter doesn't have a default value we use this
@@ -44,6 +43,11 @@ class Proxy extends Singleton
$this->noDefaultValue = new NoDefaultValue();
}
+ public static function getInstance()
+ {
+ return StaticContainer::get(self::class);
+ }
+
/**
* Returns array containing reflection meta data for all the loaded classes
* eg. number of parameters, method names, etc.
diff --git a/core/API/Request.php b/core/API/Request.php
index 5356a94e6e..1875e2822a 100644
--- a/core/API/Request.php
+++ b/core/API/Request.php
@@ -12,6 +12,7 @@ use Exception;
use Piwik\Access;
use Piwik\Cache;
use Piwik\Common;
+use Piwik\Container\StaticContainer;
use Piwik\Context;
use Piwik\DataTable;
use Piwik\Exception\PluginDeactivatedException;
@@ -23,6 +24,7 @@ use Piwik\Plugins\CoreHome\LoginWhitelist;
use Piwik\SettingsServer;
use Piwik\Url;
use Piwik\UrlHelper;
+use Psr\Log\LoggerInterface;
/**
* Dispatches API requests to the appropriate API method.
@@ -269,7 +271,10 @@ class Request
return $response->getResponse($returnedValue, $module, $method);
});
} catch (Exception $e) {
- Log::debug($e);
+ StaticContainer::get(LoggerInterface::class)->error('Uncaught exception in API: {exception}', [
+ 'exception' => $e,
+ 'ignoreInScreenWriter' => true,
+ ]);
$toReturn = $response->getResponseException($e);
} finally {
diff --git a/core/API/ResponseBuilder.php b/core/API/ResponseBuilder.php
index a3730d3fe0..9845dee275 100644
--- a/core/API/ResponseBuilder.php
+++ b/core/API/ResponseBuilder.php
@@ -15,6 +15,7 @@ use Piwik\DataTable\Renderer;
use Piwik\DataTable\DataTableInterface;
use Piwik\DataTable\Filter\ColumnDelete;
use Piwik\DataTable\Filter\Pattern;
+use Piwik\Plugins\Monolog\Processor\ExceptionToTextProcessor;
/**
*/
@@ -165,19 +166,7 @@ class ResponseBuilder
*/
private function formatExceptionMessage($exception)
{
- $message = "";
-
- $e = $exception;
- do {
- if ($e !== $exception) {
- $message .= ",\ncaused by: ";
- }
-
- $message .= $e->getMessage();
- if ($this->shouldPrintBacktrace) {
- $message .= "\n" . $e->getTraceAsString();
- }
- } while ($e = $e->getPrevious());
+ $message = ExceptionToTextProcessor::getWholeBacktrace($exception, $this->shouldPrintBacktrace);
return Renderer::formatValueXml($message);
}
diff --git a/core/ArchiveProcessor/PluginsArchiver.php b/core/ArchiveProcessor/PluginsArchiver.php
index 11adfe7f1d..2f7cd1ad12 100644
--- a/core/ArchiveProcessor/PluginsArchiver.php
+++ b/core/ArchiveProcessor/PluginsArchiver.php
@@ -10,13 +10,11 @@
namespace Piwik\ArchiveProcessor;
use Piwik\ArchiveProcessor;
-use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\CronArchive\Performance\Logger;
use Piwik\DataAccess\ArchiveWriter;
use Piwik\DataAccess\LogAggregator;
use Piwik\DataTable\Manager;
-use Piwik\ErrorHandler;
use Piwik\Metrics;
use Piwik\Piwik;
use Piwik\Plugin\Archiver;
diff --git a/core/CliMulti.php b/core/CliMulti.php
index d8d533ea24..b459bd69b6 100644
--- a/core/CliMulti.php
+++ b/core/CliMulti.php
@@ -447,4 +447,9 @@ class CliMulti
$minutes = floor($elapsed / 60);
return self::BASE_WAIT_TIME + $minutes * 100000; // 100 * 1000 = 100ms
}
+
+ public static function isCliMultiRequest()
+ {
+ return Common::getRequestVar('pid', false) !== false;
+ }
}
diff --git a/core/Development.php b/core/Development.php
index 3b44eba71d..4660f83d9e 100644
--- a/core/Development.php
+++ b/core/Development.php
@@ -10,6 +10,8 @@
namespace Piwik;
use Exception;
+use Piwik\Container\StaticContainer;
+use Psr\Log\LoggerInterface;
/**
* Development related checks and tools. You can enable/disable development using `./console development:enable` and
@@ -150,8 +152,11 @@ class Development
$message .= ' (This error is only shown in development mode)';
if (SettingsServer::isTrackerApiRequest()
- || Common::isPhpCliMode()) {
- Log::error($message);
+ || Common::isPhpCliMode()
+ ) {
+ StaticContainer::get(LoggerInterface::class)->error($message, [
+ 'ignoreInScreenWriter' => true,
+ ]);
} else {
throw new Exception($message);
}
diff --git a/core/ErrorHandler.php b/core/ErrorHandler.php
index e0a677cc53..b017d5e333 100644
--- a/core/ErrorHandler.php
+++ b/core/ErrorHandler.php
@@ -8,7 +8,9 @@
namespace Piwik;
+use Piwik\Container\StaticContainer;
use Piwik\Exception\ErrorException;
+use Psr\Log\LoggerInterface;
/**
* Piwik's error handler function.
@@ -160,7 +162,7 @@ class ErrorHandler
case E_USER_DEPRECATED:
default:
try {
- Log::warning(self::createLogMessage($errno, $errstr, $errfile, $errline));
+ StaticContainer::get(LoggerInterface::class)->warning(self::createLogMessage($errno, $errstr, $errfile, $errline));
} catch (\Exception $ex) {
// ignore (it's possible for this to happen if the StaticContainer hasn't been created yet)
}
diff --git a/core/ExceptionHandler.php b/core/ExceptionHandler.php
index 6c01785b95..c1f959ce6d 100644
--- a/core/ExceptionHandler.php
+++ b/core/ExceptionHandler.php
@@ -9,10 +9,13 @@
namespace Piwik;
use Exception;
+use Interop\Container\Exception\ContainerException;
use Piwik\API\Request;
use Piwik\API\ResponseBuilder;
use Piwik\Container\ContainerDoesNotExistException;
+use Piwik\Container\StaticContainer;
use Piwik\Plugins\CoreAdminHome\CustomLogo;
+use Psr\Log\LoggerInterface;
/**
* Contains Piwik's uncaught exception handler.
@@ -41,6 +44,8 @@ class ExceptionHandler
*/
public static function dieWithCliError($exception)
{
+ self::logException($exception);
+
$message = $exception->getMessage();
if (!method_exists($exception, 'isHtmlMessage') || !$exception->isHtmlMessage()) {
@@ -65,6 +70,8 @@ class ExceptionHandler
*/
public static function dieWithHtmlErrorPage($exception)
{
+ self::logException($exception);
+
Common::sendHeader('Content-Type: text/html; charset=utf-8');
try {
@@ -137,4 +144,18 @@ class ExceptionHandler
return $result;
}
+
+ private static function logException($exception)
+ {
+ try {
+ StaticContainer::get(LoggerInterface::class)->error('Uncaught exception: {exception}', [
+ 'exception' => $exception,
+ 'ignoreInScreenWriter' => true,
+ ]);
+ } catch (ContainerException $ex) {
+ // ignore (occurs if exception is thrown when resolving DI entries)
+ } catch (ContainerDoesNotExistException $ex) {
+ // ignore
+ }
+ }
}
diff --git a/core/FrontController.php b/core/FrontController.php
index 8a32c425b0..320239f45b 100644
--- a/core/FrontController.php
+++ b/core/FrontController.php
@@ -21,6 +21,7 @@ use Piwik\Http\ControllerResolver;
use Piwik\Http\Router;
use Piwik\Plugins\CoreAdminHome\CustomLogo;
use Piwik\Session\SessionAuth;
+use Psr\Log\LoggerInterface;
/**
* This singleton dispatches requests to the appropriate plugin Controller.
@@ -107,6 +108,11 @@ class FrontController extends Singleton
*/
private static function generateSafeModeOutputFromException($e)
{
+ StaticContainer::get(LoggerInterface::class)->error('Uncaught exception: {exception}', [
+ 'exception' => $e,
+ 'ignoreInScreenWriter' => true,
+ ]);
+
$error = array(
'message' => $e->getMessage(),
'file' => $e->getFile(),
@@ -256,6 +262,11 @@ class FrontController extends Singleton
$lastError['backtrace'] = ' on ' . $lastError['file'] . '(' . $lastError['line'] . ")\n"
. ErrorHandler::getFatalErrorPartialBacktrace();
+ StaticContainer::get(LoggerInterface::class)->error('Fatal error encountered: {exception}', [
+ 'exception' => $lastError,
+ 'ignoreInScreenWriter' => true,
+ ]);
+
$message = self::generateSafeModeOutputFromError($lastError);
echo $message;
}
diff --git a/core/Plugin/ViewDataTable.php b/core/Plugin/ViewDataTable.php
index 226e8f3141..513d175d1f 100644
--- a/core/Plugin/ViewDataTable.php
+++ b/core/Plugin/ViewDataTable.php
@@ -13,8 +13,6 @@ use Piwik\Common;
use Piwik\DataTable;
use Piwik\Period;
use Piwik\Piwik;
-use Piwik\Plugin\ReportsProvider;
-use Piwik\View;
use Piwik\View\ViewInterface;
use Piwik\ViewDataTable\Config as VizConfig;
use Piwik\ViewDataTable\Manager as ViewDataTableManager;
diff --git a/core/Plugin/Visualization.php b/core/Plugin/Visualization.php
index 71c9eca248..f23a183ed6 100644
--- a/core/Plugin/Visualization.php
+++ b/core/Plugin/Visualization.php
@@ -28,6 +28,7 @@ use Piwik\View;
use Piwik\ViewDataTable\Manager as ViewDataTableManager;
use Piwik\Plugin\Manager as PluginManager;
use Piwik\API\Request as ApiRequest;
+use Psr\Log\LoggerInterface;
/**
* The base class for report visualizations that output HTML and use JavaScript.
@@ -193,16 +194,16 @@ class Visualization extends ViewDataTable
} catch (NoAccessException $e) {
throw $e;
} catch (\Exception $e) {
- $logMessage = "Failed to get data from API: " . $e->getMessage();
- $message = $e->getMessage();
+ StaticContainer::get(LoggerInterface::class)->error('Failed to get data from API: {exception}', [
+ 'exception' => $e,
+ 'ignoreInScreenWriter' => true,
+ ]);
+ $message = $e->getMessage();
if (\Piwik_ShouldPrintBackTraceWithMessage()) {
- $logMessage .= "\n" . $e->getTraceAsString();
$message .= "\n" . $e->getTraceAsString();
}
- Log::error($logMessage);
-
$loadingError = array('message' => $message);
}
diff --git a/core/Session.php b/core/Session.php
index b03c8e0796..bf523d3b71 100644
--- a/core/Session.php
+++ b/core/Session.php
@@ -12,6 +12,7 @@ use Exception;
use Piwik\Container\StaticContainer;
use Piwik\Exception\MissingFilePermissionException;
use Piwik\Session\SaveHandler\DbTable;
+use Psr\Log\LoggerInterface;
use Zend_Session;
/**
@@ -132,7 +133,10 @@ class Session extends Zend_Session
parent::start();
register_shutdown_function(array('Zend_Session', 'writeClose'), true);
} catch (Exception $e) {
- Log::error('Unable to start session: ' . $e->getMessage());
+ StaticContainer::get(LoggerInterface::class)->error('Unable to start session: {exception}', [
+ 'exception' => $e,
+ 'ignoreInScreenWriter' => true,
+ ]);
if (SettingsPiwik::isPiwikInstalled()) {
$pathToSessions = '';
diff --git a/core/testMinimumPhpVersion.php b/core/testMinimumPhpVersion.php
index 82bbc4fd88..c1f8338081 100644
--- a/core/testMinimumPhpVersion.php
+++ b/core/testMinimumPhpVersion.php
@@ -84,6 +84,12 @@ if (!function_exists('Piwik_GetErrorMessagePage')) {
*/
function Piwik_ShouldPrintBackTraceWithMessage()
{
+ if (\Piwik\SettingsServer::isArchivePhpTriggered()
+ && \Piwik\Common::isPhpCliMode()
+ ) {
+ return true;
+ }
+
$bool = (defined('PIWIK_PRINT_ERROR_BACKTRACE') && PIWIK_PRINT_ERROR_BACKTRACE)
|| !empty($GLOBALS['PIWIK_TRACKER_DEBUG']);