Skip to content

Commit

Permalink
Implement exception logging #220.
Browse files Browse the repository at this point in the history
Implemented client and server errors logging
  • Loading branch information
Maksym Novik committed Feb 7, 2019
1 parent 583ff11 commit 9027c50
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 2 deletions.
58 changes: 57 additions & 1 deletion app/etc/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,6 @@
<preference for="Magento\Framework\MessageQueue\Bulk\ExchangeFactoryInterface" type="Magento\Framework\MessageQueue\Bulk\ExchangeFactory" />
<preference for="Magento\Framework\MessageQueue\QueueFactoryInterface" type="Magento\Framework\MessageQueue\QueueFactory" />
<preference for="Magento\Framework\Search\Request\IndexScopeResolverInterface" type="Magento\Framework\Indexer\ScopeResolver\IndexScopeResolver"/>
<preference for="\Magento\Framework\GraphQl\Query\ErrorHandlerInterface" type="\Magento\Framework\GraphQl\Query\ErrorHandler"/>
<type name="Magento\Framework\Model\ResourceModel\Db\TransactionManager" shared="false" />
<type name="Magento\Framework\Acl\Data\Cache">
<arguments>
Expand Down Expand Up @@ -1757,4 +1756,61 @@
</argument>
</arguments>
</type>
<preference for="\Magento\Framework\GraphQl\Query\ErrorHandlerInterface" type="\Magento\Framework\GraphQl\Query\ErrorHandler"/>
<type name="\Magento\Framework\GraphQl\Query\ErrorHandler">
<arguments>
<argument name="clientLogger" xsi:type="object">GraphQLClientLogger</argument>
<argument name="serverLogger" xsi:type="object">GraphQLServerLogger</argument>
<argument name="generalLogger" xsi:type="object">GraphQLGeneralLogger</argument>
<argument name="clientErrorCategories" xsi:type="array">
<item name="graphql" xsi:type="const">\GraphQL\Error\Error::CATEGORY_GRAPHQL</item>
<item name="alreadyExists" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAlreadyExistsException::EXCEPTION_CATEGORY</item>
<item name="authentication" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAuthenticationException::EXCEPTION_CATEGORY</item>
<item name="authorization" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAuthorizationException::EXCEPTION_CATEGORY</item>
<item name="input" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlInputException::EXCEPTION_CATEGORY</item>
<item name="noSuchEntity" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException::EXCEPTION_CATEGORY</item>
<item name="request" xsi:type="string">request</item>
<item name="user" xsi:type="string">user</item>
</argument>
<argument name="serverErrorCategories" xsi:type="array">
<item name="internal" xsi:type="const">\GraphQL\Error\Error::CATEGORY_INTERNAL</item>
</argument>
</arguments>
</type>
<virtualType name="GraphQLClientLogger" type="Magento\Framework\Logger\Monolog">
<arguments>
<argument name="handlers" xsi:type="array">
<item name="error" xsi:type="object">GraphQLClientErrorHandler</item>
</argument>
</arguments>
</virtualType>
<virtualType name="GraphQLClientErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
<arguments>
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::CLIENT_LOG_FILE</argument>
</arguments>
</virtualType>
<virtualType name="GraphQLServerLogger" type="Magento\Framework\Logger\Monolog">
<arguments>
<argument name="handlers" xsi:type="array">
<item name="error" xsi:type="object">GraphQLServerErrorHandler</item>
</argument>
</arguments>
</virtualType>
<virtualType name="GraphQLServerErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
<arguments>
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::SERVER_LOG_FILE</argument>
</arguments>
</virtualType>
<virtualType name="GraphQLGeneralLogger" type="Magento\Framework\Logger\Monolog">
<arguments>
<argument name="handlers" xsi:type="array">
<item name="error" xsi:type="object">GraphQLGeneralErrorHandler</item>
</argument>
</arguments>
</virtualType>
<virtualType name="GraphQLGeneralErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
<arguments>
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::GENERAL_LOG_FILE</argument>
</arguments>
</virtualType>
</config>
75 changes: 74 additions & 1 deletion lib/internal/Magento/Framework/GraphQl/Query/ErrorHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,56 @@
*/
class ErrorHandler implements ErrorHandlerInterface
{
/**
* @var \Magento\Framework\Logger\Monolog
*/
private $clientLogger;

/**
* @var \Magento\Framework\Logger\Monolog
*/
private $serverLogger;

/**
* @var array
*/
private $clientErrorCategories;

/**
* @var array
*/
private $serverErrorCategories;

/**
* @var \Magento\Framework\Logger\Monolog
*/
private $generalLogger;

/**
* ErrorHandler constructor.
*
* @param \Magento\Framework\Logger\Monolog $clientLogger
* @param \Magento\Framework\Logger\Monolog $serverLogger
* @param \Magento\Framework\Logger\Monolog $generalLogger
* @param array $clientErrorCategories
* @param array $serverErrorCategories
*
* @SuppressWarnings(PHPMD.LongVariable)
*/
public function __construct(
\Magento\Framework\Logger\Monolog $clientLogger,
\Magento\Framework\Logger\Monolog $serverLogger,
\Magento\Framework\Logger\Monolog $generalLogger,
array $clientErrorCategories = [],
array $serverErrorCategories = []
) {
$this->clientLogger = $clientLogger;
$this->serverLogger = $serverLogger;
$this->generalLogger = $generalLogger;
$this->clientErrorCategories = $clientErrorCategories;
$this->serverErrorCategories = $serverErrorCategories;
}

/**
* Handle errors
*
Expand All @@ -24,6 +74,29 @@ class ErrorHandler implements ErrorHandlerInterface
*/
public function handle(array $errors, callable $formatter):array
{
return array_map($formatter, $errors);
return array_map(
function (\GraphQL\Error\ClientAware $error) use ($formatter) {
$this->logError($error);

return $formatter($error);
},
$errors
);
}

/**
* @param \GraphQL\Error\ClientAware $error
*
* @return boolean
*/
private function logError(\GraphQL\Error\ClientAware $error):bool
{
if (in_array($error->getCategory(), $this->clientErrorCategories)) {
return $this->clientLogger->error($error);
} elseif (in_array($error->getCategory(), $this->serverErrorCategories)) {
return $this->serverLogger->error($error);
}

return $this->generalLogger->error($error);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
*/
interface ErrorHandlerInterface
{
const SERVER_LOG_FILE = 'var/log/graphql/server/exception.log';
const CLIENT_LOG_FILE = 'var/log/graphql/client/exception.log';
const GENERAL_LOG_FILE = 'var/log/graphql/exception.log';
/**
* Handle errors
*
Expand Down

0 comments on commit 9027c50

Please sign in to comment.