Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>tags/v17.0.0beta1
@@ -35,6 +35,7 @@ declare(strict_types=1); | |||
namespace OC; | |||
use function array_merge; | |||
use InterfaSys\LogNormalizer\Normalizer; | |||
use OC\Log\ExceptionSerializer; | |||
@@ -42,7 +43,6 @@ use OCP\Log\IFileBased; | |||
use OCP\Log\IWriter; | |||
use OCP\ILogger; | |||
use OCP\Support\CrashReport\IRegistry; | |||
use OCP\Util; | |||
/** | |||
* logging utilities | |||
@@ -216,11 +216,22 @@ class Log implements ILogger { | |||
if ($level >= $minLevel) { | |||
$this->writeLog($app, $message, $level); | |||
} | |||
if (!is_null($this->crashReporters)) { | |||
$this->crashReporters->delegateBreadcrumb($message, 'log', $context); | |||
if ($this->crashReporters !== null) { | |||
$messageContext = array_merge( | |||
$context, | |||
[ | |||
'level' => $level | |||
] | |||
); | |||
$this->crashReporters->delegateMessage($message, $messageContext); | |||
} | |||
} else { | |||
if ($this->crashReporters !== null) { | |||
$this->crashReporters->delegateBreadcrumb($message, 'log', $context); | |||
} | |||
} | |||
} | |||
private function getLogLevel($context) { |
@@ -24,6 +24,7 @@ namespace OC\Support\CrashReport; | |||
use Exception; | |||
use OCP\Support\CrashReport\ICollectBreadcrumbs; | |||
use OCP\Support\CrashReport\IMessageReporter; | |||
use OCP\Support\CrashReport\IRegistry; | |||
use OCP\Support\CrashReport\IReporter; | |||
use Throwable; | |||
@@ -38,7 +39,7 @@ class Registry implements IRegistry { | |||
* | |||
* @param IReporter $reporter | |||
*/ | |||
public function register(IReporter $reporter) { | |||
public function register(IReporter $reporter): void { | |||
$this->reporters[] = $reporter; | |||
} | |||
@@ -51,7 +52,7 @@ class Registry implements IRegistry { | |||
* | |||
* @since 15.0.0 | |||
*/ | |||
public function delegateBreadcrumb(string $message, string $category, array $context = []) { | |||
public function delegateBreadcrumb(string $message, string $category, array $context = []): void { | |||
foreach ($this->reporters as $reporter) { | |||
if ($reporter instanceof ICollectBreadcrumbs) { | |||
$reporter->collect($message, $category, $context); | |||
@@ -65,11 +66,27 @@ class Registry implements IRegistry { | |||
* @param Exception|Throwable $exception | |||
* @param array $context | |||
*/ | |||
public function delegateReport($exception, array $context = []) { | |||
public function delegateReport($exception, array $context = []): void { | |||
/** @var IReporter $reporter */ | |||
foreach ($this->reporters as $reporter) { | |||
$reporter->report($exception, $context); | |||
} | |||
} | |||
/** | |||
* Delegate a message to all reporters that implement IMessageReporter | |||
* | |||
* @param string $message | |||
* @param array $context | |||
* | |||
* @return void | |||
*/ | |||
public function delegateMessage(string $message, array $context = []): void { | |||
foreach ($this->reporters as $reporter) { | |||
if ($reporter instanceof IMessageReporter) { | |||
$reporter->reportMessage($message, $context); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,43 @@ | |||
<?php | |||
declare(strict_types=1); | |||
/** | |||
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at> | |||
* | |||
* @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at> | |||
* | |||
* @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 <http://www.gnu.org/licenses/>. | |||
*/ | |||
namespace OCP\Support\CrashReport; | |||
/** | |||
* @since 17.0.0 | |||
*/ | |||
interface IMessageReporter extends IReporter { | |||
/** | |||
* Report a (error) message | |||
* | |||
* @param string $message | |||
* @param array $context | |||
* | |||
* @since 17.0.0 | |||
*/ | |||
public function reportMessage(string $message, array $context = []): void; | |||
} |
@@ -1,5 +1,7 @@ | |||
<?php | |||
declare(strict_types=1); | |||
/** | |||
* @author Christoph Wurst <christoph@winzerhof-wurst.at> | |||
* | |||
@@ -33,10 +35,11 @@ interface IRegistry { | |||
/** | |||
* Register a reporter instance | |||
* | |||
* @since 13.0.0 | |||
* @param IReporter $reporter | |||
* | |||
* @since 13.0.0 | |||
*/ | |||
public function register(IReporter $reporter); | |||
public function register(IReporter $reporter): void; | |||
/** | |||
* Delegate breadcrumb collection to all registered reporters | |||
@@ -47,14 +50,27 @@ interface IRegistry { | |||
* | |||
* @since 15.0.0 | |||
*/ | |||
public function delegateBreadcrumb(string $message, string $category, array $context = []); | |||
public function delegateBreadcrumb(string $message, string $category, array $context = []): void; | |||
/** | |||
* Delegate crash reporting to all registered reporters | |||
* | |||
* @since 13.0.0 | |||
* @param Exception|Throwable $exception | |||
* @param array $context | |||
* | |||
* @since 13.0.0 | |||
*/ | |||
public function delegateReport($exception, array $context = []); | |||
/** | |||
* Delegate a message to all reporters that implement IMessageReporter | |||
* | |||
* @param string $message | |||
* @param array $context | |||
* | |||
* @return void | |||
* | |||
* @since 17.0.0 | |||
*/ | |||
public function delegateMessage(string $message, array $context = []): void; | |||
} |
@@ -27,6 +27,7 @@ namespace Test\Support\CrashReport; | |||
use Exception; | |||
use OC\Support\CrashReport\Registry; | |||
use OCP\Support\CrashReport\ICollectBreadcrumbs; | |||
use OCP\Support\CrashReport\IMessageReporter; | |||
use OCP\Support\CrashReport\IReporter; | |||
use Test\TestCase; | |||
@@ -81,4 +82,17 @@ class RegistryTest extends TestCase { | |||
$this->registry->delegateReport($exception); | |||
} | |||
public function testDelegateMessage() { | |||
$reporter1 = $this->createMock(IReporter::class); | |||
$reporter2 = $this->createMock(IMessageReporter::class); | |||
$message = 'hello'; | |||
$reporter2->expects($this->once()) | |||
->method('reportMessage') | |||
->with($message, []); | |||
$this->registry->register($reporter1); | |||
$this->registry->register($reporter2); | |||
$this->registry->delegateMessage($message); | |||
} | |||
} |