Instead of observer use NoRouteHandler
. By default all the 404 pages are forwarded to noroute
.
etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\App\Router\NoRouteHandlerList">
<arguments>
<argument name="handlerClassesList" xsi:type="array">
<item name="default" xsi:type="array">
<item name="class" xsi:type="string">Vendor\Module\Controller\NoRouteHandler</item>
<item name="sortOrder" xsi:type="string">200</item>
</item>
</argument>
</arguments>
</type>
</config>
Vendor\Module\Controller\NoRouteHandler.php
<?php
namespace Vendor\Module\Controller;
class NoRouteHandler implements \Magento\Framework\App\Router\NoRouteHandlerInterface {
protected $logger;
public function __construct(\Psr\Log\LoggerInterface $logger)
{
$this->logger = $logger;
}
public function process(\Magento\Framework\App\RequestInterface $request) {
//log the 404 url
$this->logger->info(':: 404 list ::'.$request->getPathInfo());
$request -> setModuleName('cms') -> setControllerName('noroute') -> setActionName('index');
return false;
}
}
output in system.log [http://your.host.name/tqertqwe/test1234qw.html
]
[2017-07-24 14:33:47] main.INFO: :: 404 list ::/tqertqwe/test1234qw.html [] []