Am vrut să înlocuiesc serviciul logger.filelog de la jurnal de fișiere modul pentru a folosi propriul meu parser.
A apărut o eroare prin drush cim
și drush cr
când noul modul personalizat care suprascrie serviciul este activat.
Site-ul web a întâmpinat o eroare neașteptată. Vă rugăm să încercați din nou mai târziu.
Symfony\Component\DependencyInjection\Exception\LogicException: Serviciul „logger.filelog” pentru consumator „logger.factory” nu implementează Psr\Log\LoggerInterface. în Drupal\Core\DependencyInjection\Compiler\TaggedHandlersPass->processServiceCollectorPass() (linia 182 din /app/docroot/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php).
Structura modulelor mele personalizate arată astfel
modul_personalizat
- src
- Logger
- TestFilelog.php
CustomModuleServiceProvider.php
custom_module.info.yml
modul_personalizat.modul
În prezent, clasa de furnizor de servicii a fost implementată ServiceModifierInterface
și a modificat serviciul original logger.filelog setându-i clasa la Drupal\modul_personalizat\Logger\TestFilelog
.
/**
* Clasă pentru a suprascrie modulul contrib serviciul logger.filelog.
*/
clasa CustomModuleServiceProvider implementează ServiceModifierInterface {
/**
* {@inheritdoc}
*/
funcția publică alter(ContainerBuilder $container) {
if ($container->has('logger.filelog')) {
$definition = $container->getDefinition('logger.filelog');
$definition->setClass('Drupal\custom_module\Logger\TestFilelog');
}
}
}
TestFilelog.php
spațiu de nume Drupal\modul_personalizat\Logger;
utilizați Drupal\filelog\Logger\FileLog;
/**
* Logger bazat pe fișiere.
*/
clasa TestFileLog extinde FileLog {
/**
* Redă un mesaj într-un șir.
*
* @param mixed $level
* Nivelul de severitate al mesajului de jurnal.
* @param șir $mesaj
* Conținutul mesajului de jurnal.
* @param array $context
* Contextul mesajului de jurnal.
*
* @return șir
* Mesajul formatat.
*/
funcția protejată randare($nivel, $mesaj, matrice $context = []): șir {
$plainString = parent::render($nivel, $mesaj, $context);
$canal_personalizat = [
„filter_custom_channel”
];
dacă (în_array($context['canal'], $canal_personalizat)) {
$plainString = $this->parseStrMasking($plainString);
}
returnează $plainString;
}
/**
* Mascați detaliile personale de la șiruri la jurnal.
*
* @param șir $pureString
* Șirul care trebuie analizat.
*
* @return șir
* Șirul care a fost mascat.
*/
funcția protejată parseStrMasking(șir $pureString) {
// Implicit pentru a returna finalString.
$finalString = $pureString;
// Analiza personalizată merge aici.
returnează $finalString;
}
}
Vad asta Drupal\filelog\Logger\FileLog;
are utilizați RfcLoggerTrait;
care implementează Psr\Log\LoggerInterface
, ce imi lipseste aici??