diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index c17097f5bf..0891d0c0b8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -74,6 +74,7 @@ Yii Framework 2 Change Log - Enh #2942: Added truncate and truncateWord methods (Alex-Code, samdark) - Enh #3008: Added `Html::errorSummary()` (qiangxue) - Enh #3088: The debug and gii modules will manage their own URL rules now (hiltonjanfield, qiangxue) +- Enh #3101: Improved handling of log target failures. It will now skip target and log reason instead of going into infinite cycle (samdark) - Enh #3103: debugger panel is now not displayed when printing a page (githubjeka) - Enh #3108: Added `yii\debug\Module::enableDebugLogs` to disable logging debug logs by default (qiangxue) - Enh #3132: `yii\rbac\PhpManager` now supports more compact data file format (qiangxue) diff --git a/framework/log/Dispatcher.php b/framework/log/Dispatcher.php index eda796db6e..00a260b631 100644 --- a/framework/log/Dispatcher.php +++ b/framework/log/Dispatcher.php @@ -175,10 +175,26 @@ class Dispatcher extends Component */ public function dispatch($messages, $final) { + $targetErrors = []; foreach ($this->targets as $target) { if ($target->enabled) { - $target->collect($messages, $final); + try { + $target->collect($messages, $final); + } catch (\Exception $e) { + $target->enabled = false; + $targetErrors[] = [ + 'Unable to send log via '. get_class($target) .': ' . $e->getMessage(), + Logger::LEVEL_WARNING, + __METHOD__, + microtime(true), + [], + ]; + } } } + + if (!empty($targetErrors)) { + $this->dispatch($targetErrors, true); + } } }