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',