Skip to content
This repository was archived by the owner on Dec 19, 2019. It is now read-only.

Commit bc45d86

Browse files
author
Maksym Novik
committed
GraphQl-220: Implement exception logging #355.
Moved DI to graphql area; Create ResolveLogger service; Use ClientAvare->isClientSafe() to divide exceptions into client and server
1 parent d40388e commit bc45d86

File tree

6 files changed

+132
-127
lines changed

6 files changed

+132
-127
lines changed

app/etc/di.xml

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,61 +1768,4 @@
17681768
<preference for="Magento\Framework\MessageQueue\PoisonPill\PoisonPillPutInterface" type="Magento\Framework\MessageQueue\PoisonPill\PoisonPillPut"/>
17691769
<preference for="Magento\Framework\MessageQueue\PoisonPill\PoisonPillReadInterface" type="Magento\Framework\MessageQueue\PoisonPill\PoisonPillRead"/>
17701770
<preference for="Magento\Framework\MessageQueue\CallbackInvokerInterface" type="Magento\Framework\MessageQueue\CallbackInvoker"/>
1771-
<preference for="\Magento\Framework\GraphQl\Query\ErrorHandlerInterface" type="\Magento\Framework\GraphQl\Query\ErrorHandler"/>
1772-
<type name="\Magento\Framework\GraphQl\Query\ErrorHandler">
1773-
<arguments>
1774-
<argument name="clientLogger" xsi:type="object">GraphQLClientLogger</argument>
1775-
<argument name="serverLogger" xsi:type="object">GraphQLServerLogger</argument>
1776-
<argument name="generalLogger" xsi:type="object">GraphQLGeneralLogger</argument>
1777-
<argument name="clientErrorCategories" xsi:type="array">
1778-
<item name="graphql" xsi:type="const">\GraphQL\Error\Error::CATEGORY_GRAPHQL</item>
1779-
<item name="alreadyExists" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAlreadyExistsException::EXCEPTION_CATEGORY</item>
1780-
<item name="authentication" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAuthenticationException::EXCEPTION_CATEGORY</item>
1781-
<item name="authorization" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAuthorizationException::EXCEPTION_CATEGORY</item>
1782-
<item name="input" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlInputException::EXCEPTION_CATEGORY</item>
1783-
<item name="noSuchEntity" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException::EXCEPTION_CATEGORY</item>
1784-
<item name="request" xsi:type="string">request</item>
1785-
<item name="user" xsi:type="string">user</item>
1786-
</argument>
1787-
<argument name="serverErrorCategories" xsi:type="array">
1788-
<item name="internal" xsi:type="const">\GraphQL\Error\Error::CATEGORY_INTERNAL</item>
1789-
</argument>
1790-
</arguments>
1791-
</type>
1792-
<virtualType name="GraphQLClientLogger" type="Magento\Framework\Logger\Monolog">
1793-
<arguments>
1794-
<argument name="handlers" xsi:type="array">
1795-
<item name="error" xsi:type="object">GraphQLClientErrorHandler</item>
1796-
</argument>
1797-
</arguments>
1798-
</virtualType>
1799-
<virtualType name="GraphQLClientErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
1800-
<arguments>
1801-
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::CLIENT_LOG_FILE</argument>
1802-
</arguments>
1803-
</virtualType>
1804-
<virtualType name="GraphQLServerLogger" type="Magento\Framework\Logger\Monolog">
1805-
<arguments>
1806-
<argument name="handlers" xsi:type="array">
1807-
<item name="error" xsi:type="object">GraphQLServerErrorHandler</item>
1808-
</argument>
1809-
</arguments>
1810-
</virtualType>
1811-
<virtualType name="GraphQLServerErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
1812-
<arguments>
1813-
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::SERVER_LOG_FILE</argument>
1814-
</arguments>
1815-
</virtualType>
1816-
<virtualType name="GraphQLGeneralLogger" type="Magento\Framework\Logger\Monolog">
1817-
<arguments>
1818-
<argument name="handlers" xsi:type="array">
1819-
<item name="error" xsi:type="object">GraphQLGeneralErrorHandler</item>
1820-
</argument>
1821-
</arguments>
1822-
</virtualType>
1823-
<virtualType name="GraphQLGeneralErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
1824-
<arguments>
1825-
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::GENERAL_LOG_FILE</argument>
1826-
</arguments>
1827-
</virtualType>
18281771
</config>

app/etc/graphql/di.xml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
9+
<preference for="Magento\Framework\GraphQl\Query\ErrorHandlerInterface" type="Magento\Framework\GraphQl\Query\ErrorHandler"/>
10+
<type name="Magento\Framework\GraphQl\Query\Resolver\ResolveLogger">
11+
<arguments>
12+
<argument name="clientLogger" xsi:type="object">GraphQLClientLogger</argument>
13+
<argument name="serverLogger" xsi:type="object">GraphQLServerLogger</argument>
14+
</arguments>
15+
</type>
16+
<virtualType name="GraphQLClientLogger" type="Magento\Framework\Logger\Monolog">
17+
<arguments>
18+
<argument name="handlers" xsi:type="array">
19+
<item name="error" xsi:type="object">GraphQLClientErrorHandler</item>
20+
</argument>
21+
</arguments>
22+
</virtualType>
23+
<virtualType name="GraphQLClientErrorHandler" type="Magento\Framework\Logger\Handler\Base">
24+
<arguments>
25+
<argument name="fileName" xsi:type="const">Magento\Framework\GraphQl\Query\ErrorHandler::CLIENT_LOG_FILE</argument>
26+
</arguments>
27+
</virtualType>
28+
<virtualType name="GraphQLServerLogger" type="Magento\Framework\Logger\Monolog">
29+
<arguments>
30+
<argument name="handlers" xsi:type="array">
31+
<item name="error" xsi:type="object">GraphQLServerErrorHandler</item>
32+
</argument>
33+
</arguments>
34+
</virtualType>
35+
<virtualType name="GraphQLServerErrorHandler" type="Magento\Framework\Logger\Handler\Base">
36+
<arguments>
37+
<argument name="fileName" xsi:type="const">Magento\Framework\GraphQl\Query\ErrorHandler::SERVER_LOG_FILE</argument>
38+
</arguments>
39+
</virtualType>
40+
<preference for="Magento\Framework\GraphQl\Query\Resolver\ResolveLoggerInterface" type="Magento\Framework\GraphQl\Query\Resolver\ResolveLogger"/>
41+
</config>

lib/internal/Magento/Framework/GraphQl/Query/ErrorHandler.php

Lines changed: 11 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,99 +8,44 @@
88
namespace Magento\Framework\GraphQl\Query;
99

1010
use GraphQL\Error\ClientAware;
11-
use GraphQL\Error\Error;
12-
use Magento\Framework\Logger\Monolog;
11+
use Magento\Framework\GraphQl\Query\Resolver\ResolveLoggerInterface;
1312

1413
/**
15-
* Class ErrorHandler
14+
* @inheritDoc
1615
*
1716
* @package Magento\Framework\GraphQl\Query
1817
*/
1918
class ErrorHandler implements ErrorHandlerInterface
2019
{
21-
/**
22-
* @var Monolog
23-
*/
24-
private $clientLogger;
25-
26-
/**
27-
* @var Monolog
28-
*/
29-
private $serverLogger;
20+
const SERVER_LOG_FILE = 'var/log/graphql/server/exception.log';
21+
const CLIENT_LOG_FILE = 'var/log/graphql/client/exception.log';
3022

3123
/**
32-
* @var array
24+
* @var ResolveLoggerInterface
3325
*/
34-
private $clientErrorCategories;
26+
private $resolveLogger;
3527

3628
/**
37-
* @var array
38-
*/
39-
private $serverErrorCategories;
40-
41-
/**
42-
* @var Monolog
43-
*/
44-
private $generalLogger;
45-
46-
/**
47-
* ErrorHandler constructor.
48-
*
49-
* @param Monolog $clientLogger
50-
* @param Monolog $serverLogger
51-
* @param Monolog $generalLogger
52-
* @param array $clientErrorCategories
53-
* @param array $serverErrorCategories
54-
*
55-
* @SuppressWarnings(PHPMD.LongVariable)
29+
* @param ResolveLoggerInterface $resolveLogger
5630
*/
5731
public function __construct(
58-
Monolog $clientLogger,
59-
Monolog $serverLogger,
60-
Monolog $generalLogger,
61-
array $clientErrorCategories = [],
62-
array $serverErrorCategories = []
32+
ResolveLoggerInterface $resolveLogger
6333
) {
64-
$this->clientLogger = $clientLogger;
65-
$this->serverLogger = $serverLogger;
66-
$this->generalLogger = $generalLogger;
67-
$this->clientErrorCategories = $clientErrorCategories;
68-
$this->serverErrorCategories = $serverErrorCategories;
34+
$this->resolveLogger = $resolveLogger;
6935
}
7036

7137
/**
72-
* Handle errors
73-
*
74-
* @param Error[] $errors
75-
* @param callable $formatter
76-
*
77-
* @return array
38+
* @inheritDoc
7839
*/
7940
public function handle(array $errors, callable $formatter): array
8041
{
8142
return array_map(
8243
function (ClientAware $error) use ($formatter) {
83-
$this->logError($error);
44+
$this->resolveLogger->execute($error)->error($error);
8445

8546
return $formatter($error);
8647
},
8748
$errors
8849
);
8950
}
90-
91-
/**
92-
* @param ClientAware $error
93-
*
94-
* @return boolean
95-
*/
96-
private function logError(ClientAware $error): bool
97-
{
98-
if (in_array($error->getCategory(), $this->clientErrorCategories)) {
99-
return $this->clientLogger->error($error);
100-
} elseif (in_array($error->getCategory(), $this->serverErrorCategories)) {
101-
return $this->serverLogger->error($error);
102-
}
103-
104-
return $this->generalLogger->error($error);
105-
}
10651
}

lib/internal/Magento/Framework/GraphQl/Query/ErrorHandlerInterface.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
/**
1313
* Interface ErrorHandlerInterface
1414
*
15-
* @package Magento\Framework\GraphQl\Query
15+
* GraphQL error handler
16+
* @see \Magento\Framework\GraphQl\Query\QueryProcessor
17+
*
18+
* @api
1619
*/
1720
interface ErrorHandlerInterface
1821
{
19-
const SERVER_LOG_FILE = 'var/log/graphql/server/exception.log';
20-
const CLIENT_LOG_FILE = 'var/log/graphql/client/exception.log';
21-
const GENERAL_LOG_FILE = 'var/log/graphql/exception.log';
2222
/**
2323
* Handle errors
2424
*
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Framework\GraphQl\Query\Resolver;
9+
10+
use GraphQL\Error\ClientAware;
11+
use Psr\Log\LoggerInterface;
12+
13+
/**
14+
* @inheritDoc
15+
*/
16+
class ResolveLogger implements ResolveLoggerInterface
17+
{
18+
/**
19+
* @var LoggerInterface
20+
*/
21+
private $clientLogger;
22+
23+
/**
24+
* @var LoggerInterface
25+
*/
26+
private $serverLogger;
27+
28+
/**
29+
* @param LoggerInterface $clientLogger
30+
* @param LoggerInterface $serverLogger
31+
*/
32+
public function __construct(
33+
LoggerInterface $clientLogger,
34+
LoggerInterface $serverLogger
35+
) {
36+
$this->clientLogger = $clientLogger;
37+
$this->serverLogger = $serverLogger;
38+
}
39+
40+
/**
41+
* @param ClientAware $clientAware
42+
*
43+
* @return LoggerInterface
44+
*/
45+
public function execute(ClientAware $clientAware): LoggerInterface
46+
{
47+
return $clientAware->isClientSafe() ?
48+
$this->clientLogger :
49+
$this->serverLogger;
50+
}
51+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Framework\GraphQl\Query\Resolver;
9+
10+
use GraphQL\Error\ClientAware;
11+
use Psr\Log\LoggerInterface;
12+
13+
/**
14+
* Resolver which logger to use for certain ClientAware exception
15+
* @api
16+
*/
17+
interface ResolveLoggerInterface
18+
{
19+
/**
20+
* @param ClientAware $clientAware
21+
*
22+
* @return LoggerInterface
23+
*/
24+
public function execute(ClientAware $clientAware): LoggerInterface;
25+
}

0 commit comments

Comments
 (0)