# Using logger in errorhandler

**URL:** <https://discourse.slimframework.com/t/using-logger-in-errorhandler/3672>\
**Category:** Questions\
**Created:** [November 22, 2019, 9:41am UTC](https://discourse.slimframework.com/t/using-logger-in-errorhandler/3672 "2019-11-22T09:41:51Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![sam](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.slimframework.com/sam/32/1030_2.png) [@sam](https://discourse.slimframework.com/u/sam)\
**Post date:** [November 22, 2019, 9:41am UTC](https://discourse.slimframework.com/t/using-logger-in-errorhandler/3672/1 "2019-11-22T09:41:51Z")

</div>

Hi,

I have a new Slim4 application. In the constructor of the router I’m defining a LoggerInterface injectable like this:

```
$containerBuilder->addDefinitions([
  LoggerInterface::class => function (ContainerInterface $c) {
    $logger = new Logger('myApp');

```

I can use this throughout all my normal classes now. However, I want to use the same logger also for the error handler. The errorhandler is set in the index page like this:

```
$errorHandler = new HttpErrorHandler($callableResolver, $responseFactory);
$errorMiddleware->setDefaultErrorHandler($errorHandler);

```

My idea is that I want to override the `logError` function in the errorhandler to use the logger instead of error\_log(). What is the best way to pass the logger Interface into this errorhandler? It seems like a basic requirement but I can not find any related documentation.

thanks!

---

<div class="post-metadata">

**Author:** ![odan](https://avatars.discourse-cdn.com/v4/letter/o/9de053/32.png) [@odan](https://discourse.slimframework.com/u/odan)\
**Post date:** [November 22, 2019, 9:53am UTC](https://discourse.slimframework.com/t/using-logger-in-errorhandler/3672/2 "2019-11-22T09:53:14Z")

</div>

~~Just add a container definition for `HttpErrorHandler::class`. Then you can inject the same logger.~~

---

<div class="post-metadata">

**Author:** ![sam](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.slimframework.com/sam/32/1030_2.png) [@sam](https://discourse.slimframework.com/u/sam)\
**Post date:** [November 22, 2019, 10:31am UTC](https://discourse.slimframework.com/t/using-logger-in-errorhandler/3672/3 "2019-11-22T10:31:33Z")

</div>

Hi Daniel,

thanks for the reply. Could you please elaborate? When adding the `HttpErrorHandler::class` as container definition, how could I inject the logger there, and how would I set this errorhandler as the default errorhandler?

thanks

---

<div class="post-metadata">

**Author:** ![odan](https://avatars.discourse-cdn.com/v4/letter/o/9de053/32.png) [@odan](https://discourse.slimframework.com/u/odan)\
**Post date:** [November 22, 2019, 1:29pm UTC](https://discourse.slimframework.com/t/using-logger-in-errorhandler/3672/4 "2019-11-22T13:29:34Z")

</div>

You can define a custom error handler like this:

```php
$errorMiddleware->setDefaultErrorHandler(\Example\MyDefaultErrorHandler::class);

```

The container then resolves this class. But the handler must be a “callable”. Here is an example:

```php
<?php

namespace Example;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Log\LoggerInterface;
use Psr\Http\Message\ResponseInterface;
use Slim\Psr7\Response;
use Slim\Exception\HttpMethodNotAllowedException;
use Slim\Exception\HttpNotFoundException;
use Throwable;

class MyDefaultErrorHandler
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function __invoke(
        ServerRequestInterface $request,
        Throwable $exception,
        bool $displayErrorDetail
    ): ResponseInterface {
        $response = new Response();
        // Add error log entry
        $this->logger->error($exception->getMessage());

        // Add your custom logic here
        if ($exception instanceof HttpNotFoundException) {
            $response->getBody()->write('404 Not Found');
            $response = $response->withStatus(404);
        } elseif ($exception instanceof HttpMethodNotAllowedException) {
            $response->getBody()->write('405 Method Mot Allowed');
            $response = $response->withStatus(405);
        } else {
            $response->getBody()->write('500 Internal Server Error');
            $response = $response->withStatus(500);
        }

        return $response;
    }
}

```

---

<div class="post-metadata">

**Author:** ![sam](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.slimframework.com/sam/32/1030_2.png) [@sam](https://discourse.slimframework.com/u/sam)\
**Post date:** [November 22, 2019, 3:26pm UTC](https://discourse.slimframework.com/t/using-logger-in-errorhandler/3672/5 "2019-11-22T15:26:00Z")

</div>

Thanks, got it working like this!
