diff --git a/_config/logging.yml b/_config/logging.yml new file mode 100644 index 00000000..097fc839 --- /dev/null +++ b/_config/logging.yml @@ -0,0 +1,8 @@ +--- +Name: graphql-logging +after: '#logging' +--- + +SilverStripe\Core\Injector\Injector: + # This will occasionally be overridden with SilverStripe\GraphQL\Schema\Logger to provide a nicer output on schema build task + Psr\Log\LoggerInterface.graphql-build: '%$Psr\Log\LoggerInterface.errorhandler' diff --git a/src/Dev/Build.php b/src/Dev/Build.php index 75a69daa..79f36fae 100644 --- a/src/Dev/Build.php +++ b/src/Dev/Build.php @@ -3,9 +3,11 @@ namespace SilverStripe\GraphQL\Dev; +use Psr\Log\LoggerInterface; use SilverStripe\Control\Controller; use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; +use SilverStripe\Core\Injector\Injector; use SilverStripe\Dev\DebugView; use SilverStripe\GraphQL\Schema\DataObject\FieldAccessor; use SilverStripe\GraphQL\Schema\Exception\EmptySchemaException; @@ -42,15 +44,8 @@ public function build(HTTPRequest $request) echo "
"; } $clear = true; - $verbosity = strtoupper($request->getVar('verbosity') ?? 'INFO'); - $constantRef = sprintf('%s::%s', Logger::class, $verbosity); - Schema::invariant( - defined($constantRef), - 'Illegal verbosity: %s', - $verbosity - ); - $level = constant($constantRef); - $this->buildSchema($request->getVar('schema'), $clear, $level); + + $this->buildSchema($request->getVar('schema'), $clear); if ($isBrowser) { echo "
"; @@ -65,10 +60,10 @@ public function build(HTTPRequest $request) * @throws SchemaNotFoundException * @throws SchemaBuilderException */ - public function buildSchema($key = null, $clear = true, int $level = Logger::INFO): void + public function buildSchema($key = null, $clear = true): void { - $logger = Logger::singleton(); - $logger->setVerbosity($level); + /** @var LoggerInterface $logger */ + $logger = Injector::inst()->get(LoggerInterface::class . '.graphql-build'); $keys = $key ? [$key] : array_keys(Schema::config()->get('schemas')); $keys = array_filter($keys, function ($key) { return $key !== Schema::ALL; diff --git a/src/Dev/DevelopmentAdmin.php b/src/Dev/DevelopmentAdmin.php index 39d9e796..a3e40a8c 100644 --- a/src/Dev/DevelopmentAdmin.php +++ b/src/Dev/DevelopmentAdmin.php @@ -11,6 +11,9 @@ use SilverStripe\Security\Permission; use SilverStripe\Security\Security; use Exception; +use Psr\Log\LoggerInterface; +use SilverStripe\Core\Injector\Injector; +use SilverStripe\GraphQL\Schema\Logger; class DevelopmentAdmin extends Controller { @@ -42,6 +45,11 @@ protected function init() Security::permissionFailure($this); return; } + + // Define custom logger + $logger = Logger::singleton(); + $logger->setVerbosity(Logger::INFO); + Injector::inst()->registerService($logger, LoggerInterface::class . '.graphql-build'); } public function index(HTTPRequest $request) diff --git a/src/Extensions/DevBuildExtension.php b/src/Extensions/DevBuildExtension.php index f05bd4fd..0dfc8760 100644 --- a/src/Extensions/DevBuildExtension.php +++ b/src/Extensions/DevBuildExtension.php @@ -3,8 +3,11 @@ namespace SilverStripe\GraphQL\Extensions; +use Psr\Log\LoggerInterface; use SilverStripe\Core\Config\Configurable; +use SilverStripe\Core\Injector\Injector; use SilverStripe\GraphQL\Dev\Build; +use SilverStripe\GraphQL\Schema\Logger; use SilverStripe\ORM\DataExtension; class DevBuildExtension extends DataExtension @@ -31,8 +34,21 @@ public function onAfterBuild() return; } if (!self::$done) { - Build::singleton()->buildSchema(); - self::$done = true; + // Get the current graphQL logger + $defaultLogger = Injector::inst()->get(LoggerInterface::class . '.graphql-build'); + + try { + // Define custom logger + $logger = Logger::singleton(); + $logger->setVerbosity(Logger::INFO); + Injector::inst()->registerService($logger, LoggerInterface::class . '.graphql-build'); + + Build::singleton()->buildSchema(); + self::$done = true; + } finally { + // Restore default logger back to its starting state + Injector::inst()->registerService($defaultLogger, LoggerInterface::class . '.graphql-build'); + } } } } diff --git a/src/Schema/BulkLoader/BulkLoaderSet.php b/src/Schema/BulkLoader/BulkLoaderSet.php index 057b0df3..19e7e5d7 100644 --- a/src/Schema/BulkLoader/BulkLoaderSet.php +++ b/src/Schema/BulkLoader/BulkLoaderSet.php @@ -3,9 +3,11 @@ namespace SilverStripe\GraphQL\Schema\BulkLoader; use InvalidArgumentException; +use Psr\Log\LoggerInterface; use SilverStripe\Core\ClassInfo; use ReflectionException; use SilverStripe\Core\Injector\Injectable; +use SilverStripe\Core\Injector\Injector; use SilverStripe\GraphQL\Schema\Exception\SchemaBuilderException; use SilverStripe\GraphQL\Schema\Interfaces\ConfigurationApplier; use SilverStripe\GraphQL\Schema\Logger; @@ -80,7 +82,7 @@ public function addLoader(AbstractBulkLoader $loader): self */ public function process(): Collection { - $logger = Logger::singleton(); + $logger = Injector::inst()->get(LoggerInterface::class . '.graphql-build'); $collection = $this->initialCollection; $logger->debug(sprintf( 'Bulk loader initial collection size: %s', diff --git a/src/Schema/Schema.php b/src/Schema/Schema.php index c3de5911..403d4d7d 100644 --- a/src/Schema/Schema.php +++ b/src/Schema/Schema.php @@ -36,6 +36,7 @@ use SilverStripe\GraphQL\Schema\Type\UnionType; use SilverStripe\ORM\ArrayLib; use Exception; +use SilverStripe\Core\Injector\Injector; use TypeError; /** @@ -148,7 +149,7 @@ public function __construct(string $schemaKey, SchemaConfig $schemaConfig = null $this->schemaConfig = $schemaConfig ?: SchemaConfig::create(); $this->state = Configuration::create(); - $this->logger = Logger::singleton(); + $this->logger = Injector::inst()->get(LoggerInterface::class . '.graphql-build'); } /** diff --git a/src/Schema/Storage/CodeGenerationStore.php b/src/Schema/Storage/CodeGenerationStore.php index ae091861..b50101d0 100644 --- a/src/Schema/Storage/CodeGenerationStore.php +++ b/src/Schema/Storage/CodeGenerationStore.php @@ -5,6 +5,7 @@ use Exception; use GraphQL\Type\Schema as GraphQLSchema; use GraphQL\Type\SchemaConfig as GraphQLSchemaConfig; +use Psr\Log\LoggerInterface; use Psr\SimpleCache\CacheInterface; use SilverStripe\Core\Config\Configurable; use SilverStripe\Core\Injector\Injectable; @@ -123,7 +124,7 @@ public function __construct(string $name, CacheInterface $cache) */ public function persistSchema(StorableSchema $schema): void { - $logger = Logger::singleton(); + $logger = Injector::inst()->get(LoggerInterface::class . '.graphql-build'); if (!$schema->exists()) { throw new EmptySchemaException(sprintf( 'Schema %s is empty',