Skip to content

Commit 9027c50

Browse files
author
Maksym Novik
committed
Implement exception logging #220.
Implemented client and server errors logging
1 parent 583ff11 commit 9027c50

File tree

3 files changed

+134
-2
lines changed

3 files changed

+134
-2
lines changed

app/etc/di.xml

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@
209209
<preference for="Magento\Framework\MessageQueue\Bulk\ExchangeFactoryInterface" type="Magento\Framework\MessageQueue\Bulk\ExchangeFactory" />
210210
<preference for="Magento\Framework\MessageQueue\QueueFactoryInterface" type="Magento\Framework\MessageQueue\QueueFactory" />
211211
<preference for="Magento\Framework\Search\Request\IndexScopeResolverInterface" type="Magento\Framework\Indexer\ScopeResolver\IndexScopeResolver"/>
212-
<preference for="\Magento\Framework\GraphQl\Query\ErrorHandlerInterface" type="\Magento\Framework\GraphQl\Query\ErrorHandler"/>
213212
<type name="Magento\Framework\Model\ResourceModel\Db\TransactionManager" shared="false" />
214213
<type name="Magento\Framework\Acl\Data\Cache">
215214
<arguments>
@@ -1757,4 +1756,61 @@
17571756
</argument>
17581757
</arguments>
17591758
</type>
1759+
<preference for="\Magento\Framework\GraphQl\Query\ErrorHandlerInterface" type="\Magento\Framework\GraphQl\Query\ErrorHandler"/>
1760+
<type name="\Magento\Framework\GraphQl\Query\ErrorHandler">
1761+
<arguments>
1762+
<argument name="clientLogger" xsi:type="object">GraphQLClientLogger</argument>
1763+
<argument name="serverLogger" xsi:type="object">GraphQLServerLogger</argument>
1764+
<argument name="generalLogger" xsi:type="object">GraphQLGeneralLogger</argument>
1765+
<argument name="clientErrorCategories" xsi:type="array">
1766+
<item name="graphql" xsi:type="const">\GraphQL\Error\Error::CATEGORY_GRAPHQL</item>
1767+
<item name="alreadyExists" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAlreadyExistsException::EXCEPTION_CATEGORY</item>
1768+
<item name="authentication" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAuthenticationException::EXCEPTION_CATEGORY</item>
1769+
<item name="authorization" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlAuthorizationException::EXCEPTION_CATEGORY</item>
1770+
<item name="input" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlInputException::EXCEPTION_CATEGORY</item>
1771+
<item name="noSuchEntity" xsi:type="const">\Magento\Framework\GraphQl\Exception\GraphQlNoSuchEntityException::EXCEPTION_CATEGORY</item>
1772+
<item name="request" xsi:type="string">request</item>
1773+
<item name="user" xsi:type="string">user</item>
1774+
</argument>
1775+
<argument name="serverErrorCategories" xsi:type="array">
1776+
<item name="internal" xsi:type="const">\GraphQL\Error\Error::CATEGORY_INTERNAL</item>
1777+
</argument>
1778+
</arguments>
1779+
</type>
1780+
<virtualType name="GraphQLClientLogger" type="Magento\Framework\Logger\Monolog">
1781+
<arguments>
1782+
<argument name="handlers" xsi:type="array">
1783+
<item name="error" xsi:type="object">GraphQLClientErrorHandler</item>
1784+
</argument>
1785+
</arguments>
1786+
</virtualType>
1787+
<virtualType name="GraphQLClientErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
1788+
<arguments>
1789+
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::CLIENT_LOG_FILE</argument>
1790+
</arguments>
1791+
</virtualType>
1792+
<virtualType name="GraphQLServerLogger" type="Magento\Framework\Logger\Monolog">
1793+
<arguments>
1794+
<argument name="handlers" xsi:type="array">
1795+
<item name="error" xsi:type="object">GraphQLServerErrorHandler</item>
1796+
</argument>
1797+
</arguments>
1798+
</virtualType>
1799+
<virtualType name="GraphQLServerErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
1800+
<arguments>
1801+
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::SERVER_LOG_FILE</argument>
1802+
</arguments>
1803+
</virtualType>
1804+
<virtualType name="GraphQLGeneralLogger" type="Magento\Framework\Logger\Monolog">
1805+
<arguments>
1806+
<argument name="handlers" xsi:type="array">
1807+
<item name="error" xsi:type="object">GraphQLGeneralErrorHandler</item>
1808+
</argument>
1809+
</arguments>
1810+
</virtualType>
1811+
<virtualType name="GraphQLGeneralErrorHandler" type="\Magento\Framework\Logger\Handler\Base">
1812+
<arguments>
1813+
<argument name="fileName" xsi:type="const">\Magento\Framework\GraphQl\Query\ErrorHandlerInterface::GENERAL_LOG_FILE</argument>
1814+
</arguments>
1815+
</virtualType>
17601816
</config>

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

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,56 @@
1414
*/
1515
class ErrorHandler implements ErrorHandlerInterface
1616
{
17+
/**
18+
* @var \Magento\Framework\Logger\Monolog
19+
*/
20+
private $clientLogger;
21+
22+
/**
23+
* @var \Magento\Framework\Logger\Monolog
24+
*/
25+
private $serverLogger;
26+
27+
/**
28+
* @var array
29+
*/
30+
private $clientErrorCategories;
31+
32+
/**
33+
* @var array
34+
*/
35+
private $serverErrorCategories;
36+
37+
/**
38+
* @var \Magento\Framework\Logger\Monolog
39+
*/
40+
private $generalLogger;
41+
42+
/**
43+
* ErrorHandler constructor.
44+
*
45+
* @param \Magento\Framework\Logger\Monolog $clientLogger
46+
* @param \Magento\Framework\Logger\Monolog $serverLogger
47+
* @param \Magento\Framework\Logger\Monolog $generalLogger
48+
* @param array $clientErrorCategories
49+
* @param array $serverErrorCategories
50+
*
51+
* @SuppressWarnings(PHPMD.LongVariable)
52+
*/
53+
public function __construct(
54+
\Magento\Framework\Logger\Monolog $clientLogger,
55+
\Magento\Framework\Logger\Monolog $serverLogger,
56+
\Magento\Framework\Logger\Monolog $generalLogger,
57+
array $clientErrorCategories = [],
58+
array $serverErrorCategories = []
59+
) {
60+
$this->clientLogger = $clientLogger;
61+
$this->serverLogger = $serverLogger;
62+
$this->generalLogger = $generalLogger;
63+
$this->clientErrorCategories = $clientErrorCategories;
64+
$this->serverErrorCategories = $serverErrorCategories;
65+
}
66+
1767
/**
1868
* Handle errors
1969
*
@@ -24,6 +74,29 @@ class ErrorHandler implements ErrorHandlerInterface
2474
*/
2575
public function handle(array $errors, callable $formatter):array
2676
{
27-
return array_map($formatter, $errors);
77+
return array_map(
78+
function (\GraphQL\Error\ClientAware $error) use ($formatter) {
79+
$this->logError($error);
80+
81+
return $formatter($error);
82+
},
83+
$errors
84+
);
85+
}
86+
87+
/**
88+
* @param \GraphQL\Error\ClientAware $error
89+
*
90+
* @return boolean
91+
*/
92+
private function logError(\GraphQL\Error\ClientAware $error):bool
93+
{
94+
if (in_array($error->getCategory(), $this->clientErrorCategories)) {
95+
return $this->clientLogger->error($error);
96+
} elseif (in_array($error->getCategory(), $this->serverErrorCategories)) {
97+
return $this->serverLogger->error($error);
98+
}
99+
100+
return $this->generalLogger->error($error);
28101
}
29102
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
*/
1515
interface ErrorHandlerInterface
1616
{
17+
const SERVER_LOG_FILE = 'var/log/graphql/server/exception.log';
18+
const CLIENT_LOG_FILE = 'var/log/graphql/client/exception.log';
19+
const GENERAL_LOG_FILE = 'var/log/graphql/exception.log';
1720
/**
1821
* Handle errors
1922
*

0 commit comments

Comments
 (0)