2017 © Pedro Peláez
 

library request-logger

Laravel Request Response Logger

image

san4io/request-logger

Laravel Request Response Logger

  • Friday, February 9, 2018
  • by san4io
  • Repository
  • 1 Watchers
  • 0 Stars
  • 139 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 5 Versions
  • 0 % Grown

The README.md

Request Logger

Build Status Scrutinizer Code Quality Code Coverage, (*1)

Package for logging Laravel HTTP requests. By default it uses Monolog with LogStash formatter, but it can be overriden in your ServiceProvider, check Advanced Configuration section., (*2)

Installation

You can install the package via composer:, (*3)

composer require san4io/request-logger

You can publish config, (*4)

php artisan vendor:publish --provider="San4io\RequestLogger\RequestLoggerServiceProvider"

Configuration

In request-logger.php config file you'll find current properties:, (*5)

Property Default Descirption
storage_path /logs/request-logger.log Where your logs gonna be stored
param_exceptions ['password', 'password_confirmation'] which params should be filtered out from RequestParamsFormatter

Usage

In global middleware:, (*6)

// in `app/Http/Kernel.php`

protected $middleware = [
    ...

    \San4io\RequestLogger\Middleware\RequestLoggerMiddleware::class
];

In group of routes:, (*7)

// in a routes file
Route::group(['middleware' => \San4io\RequestLogger\Middleware\RequestLoggerMiddleware::class], function () {
    //
});

In single route:, (*8)

// in a routes file
Route::get('/', function () {
    //
})->middleware(\San4io\RequestLogger\Middleware\RequestLoggerMiddleware::class);

Default Log Context Formatters

Formatter Name Descirption Example
RequestIPFormatter request_ip Returns request ip information 192.22.22.11
RequestMethodFormatter request_method Returns request method information POST
RequestUriFormatter request_uri Returns request uri information http://localhost/api/v1/authenticate
RequestHeadersFormatter request_headers Returns request headers information {cookie:[Phpstorm-f176c91a=b5df2557-0cd3-44be-857d-7ea59b93c24a; io=Xm-fflHJzYnRSle0AAAB; JSESSIONID.41a4f06a=ux60gwkijzfr1cleylxjci7po;], "origin":["http://localhost"], "accept":["application/json"]}
RequestParamsFormatter request_params Returns request params(filtered) information {"email":"qwe"}
ResponseBenchmarkFormatter response_ms Returns execution time 0.1858180046081543
ResponseContentFormatter response_content Return response content(can be very heavy, use wisely) {\"message\":\"The given data was invalid.\",\"errors\":{\"email\":[\"The email must be a valid email address.\"]}}

Extending

You can extend your Logger with your own ContextFormatters., (*9)

Your context formatter should extend \San4io\RequestLogger\Contracts\ContextFormatterContract interface. In format method should return your desired output. In name method, you should return unique name of formatter, (*10)

Advanced Configuration

Overriding Logger

You can override logger in your ServiceProvider by binding your logger to 'app.request.logger' For example you want other Formatter like MongoDBFormatter., (*11)

// YourServiceProvider.php
public function register()
{
    $this->app->bind('app.request.logger', function () {
        $logger = new Logger('request-logger');

        $handler = new RotatingFileHandler(
            storage_path(config('request-logger.storage_path'))
        );
        // Changing Handler
        $handler->setFormatter(new MongoDBFormatter(
            env('APP_NAME'),
            null,
            null,
            null
        ));

        $logger->pushHandler($handler);

        return $logger;
    });
}

That's it, you have setted logger with your desired formatter., (*12)

Or you can create your own logger with different name, and inject it to RequestLogger for example:, (*13)

//YourServiceProvider.php
public function register()
{
    $this->app->bind('my_mega_super_dupper_logger', function () {
        ...

        return $logger;
    });

    $this->app->bind(RequestLogger::class, function (Application $app) {
        return new RequestLogger(
            // Injecting your logger
            $app->make('my_mega_super_dupper_logger'),
            $app->make(LogContextFormatter::class)
        );
    });
}

Overriding LogContextFormatter

It is possible that you need some addidtional data to be returned to your log. In this case you extend \San4io\RequestLogger\Contracts\ContextFormatterContract interface (check Extending section) and adding it to LogContextFormatter. Example:, (*14)

// YourServiceProvider.php
public function register()
{
    // Totally override LogContextFormatter, in this case it will return only your data.
    $this->app->bind(LogContextFormatter::class, function (Application $app) {
        $contextFormatter = new LogContextFormatter();

        $contextFormatter->addContextFormatter($app->make(YourContextFormatter::class));

        return $contextFormatter;
    });


    // Adding additional contexts to default ones.
    $this->app->bind(LogContextFormatter::class, function (Application $app) {
        $contextFormatter = $app->make(LogContextFormatter::class);

        $contextFormatter->addContextFormatter($app->make(YourContextFormatter::class));

        return $contextFormatter;
    });

}

Road map

  • Tests

Contribution

Any contributions welcome!, (*15)

Log Examples

{  
   "@timestamp":"2017-11-05T13:49:24.308258+00:00",
   "@source":"3b1ceb06851b",
   "@fields":{  
      "channel":"request-logger",
      "level":200,      
      "request_ip":"192.22.22.11",
      "request_method":"POST",
      "request_uri":"http://localhost/api/v1/authenticate",
      "request_params":{  
         "email":"qwe"
      },
      "request_headers":{  
         "cookie":[  
            "Phpstorm-f176c91a=b5df2557-0cd3-44be-857d-7ea59b93c24a; io=Xm-fflHJzYnRSle0AAAB; JSESSIONID.41a4f06a=ux60gwkijzfr1cleylxjci7po; _nsuid=d3c208ab-5937-4e2c-a974-7ae2c71b8c43; ns.welcomemessage.displayed=true; user=undefined; token=undefined; refreshToken=Bunn1cX7CBS1VdS%2BfbWAY12oQOD0utiDGW5jKAK06two2a0eWOMwxhetPiAe3Ao73IX5fP56UymvucykD6ZbXT4sJvyorXUR%2FNph%2FuamwK2zkE%2F%2Bh8iUqPzK5qluRWklHtZV0AXUTxjTEok3hcksRTus2uxLz3cff1JMpwXJwzEYT8Oi1WxVj8WU7XzTevskrvoil1gtRkQKKq5porjntD2nk3IU4vCNvA6HnlRIeHpz2uooXNZYRJzpbpbZBXQTUDPEu9g7psspBbhnBw87ymvxGUqrWaWr9axtDSalkuNA1UFOgoQO3hjR864xEhiGKfGVsZvQYov4I5OEDcbt45xmNE1ZE6thgSbZqGAGdQDIvnpJf%2FAkImy48sfJ4DIduziP9SBbJvgRmVblnyUDQshCg2Gm1dEi6nGuqr2iUbmzTYgACaWUkRL67oCG0fIq18vrpNcxXXbhKtd3SIHx1lrSRN%2Bg0IjFD30QnquvXpJ09OvoOp5WF6fbz5yjfrK4E%2BSg7QOEleKJZeVM2Ax2u%2BH2ED1GsWkuYy7L7GtfBAL7QfDOvY9DgFGtL4lXOxu8b10IHxI9806J1gARvFojwrpCi4wQpyui%2F9Y1WKbCK0ii2IXk6aBq%2F917znc%2FycXOFCTtxgv5O5t9ed9E7%2BYO75%2FOWCJibn%2FI2bSLGm8VC8U%3D; accessToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImVhZDA0MDJiYjM2YmY3Mjc2Y2UxMGUzNTYxNmU1NGEwY2RmZTMyY2M1MTQ1NjExNDQ0ZGQyMDhhNGQ3OGNiZWNhZWU5NjM5YzdiOGQ2YTllIn0.eyJhdWQiOiI1ODdkMmFkMzljOWMwYjJhMTgyMmMyNjQiLCJqdGkiOiJlYWQwNDAyYmIzNmJmNzI3NmNlMTBlMzU2MTZlNTRhMGNkZmUzMmNjNTE0NTYxMTQ0NGRkMjA4YTRkNzhjYmVjYWVlOTYzOWM3YjhkNmE5ZSIsImlhdCI6MTQ5NDE1ODY5NiwibmJmIjoxNDk0MTU4Njk2LCJleHAiOjE1MjU2OTQ2OTYsInN1YiI6IjU5MGYwZDY4OWM5YzBiMzIyOTUzZDQwNCIsInNjb3BlcyI6WyIqIl19.HeVwuLNYmNYIsy9J-9uP3_sMa03XCddLLrkZVRqllUgB7Epx1YjQr4WiZgWF0uJl_JE0AxupavzOx94l-eCTau9UBT4EzRHpbB1wcKhy6mw4N2YYeYwHjJQ46gEN5idfASLsICgcrA5puXCZcn2iCopM-qQz2H7Hgxin_nga-X756C4_hCLR-fQZMw5PbKdKcAv63U8HlmsRsjdmkfintEW_eUrHW3uApExNbTGcluAxDwTL3WNVDAGlaWGXbyhDuMLksW22gUNjjCz8WfRXhyycnKuafiLZNOSq2U5GtT5erAalTn2yw5CIfwD-P2xvujjE54sgxQPjO9kC1H2m8fHqNrvEGHGroA6IWIrh5ko-0FsXRVtuHXEF9MTBB1_O-YGGZ2dzrt6zWuq3PW2pLCYgFBiDepcLjcnk_RkfsahgT6lVEKJc9vo0779cC5kStcBzP3iqtaGhcrptn9BSql6H8VktzS8FwgjQLJfMfG9VziQVoJz6wAw2aAdIkidQqVwp8jAuDQEU6TqQZc0Y9dtzcc1G-zF9Cqlv5AcR45tMWFX9UZxout6BrCdFvxSgWdl35QlgfYNNkxEwK0swvGH83WbnmNhy7OmtU4FKkmFWEDQA7GYxqnLKNYtSYoON3BhDzKeDoX6-z2Cb8mMHQoTQ6dud1syKdzxb-ekfqaY; JSESSIONID.ffeb04b9=1buw5fipdaki21qjk09qphnlrn; XDEBUG_SESSION=PHPSTORM; JSESSIONID.a11d2002=node01iw7cp8duqs3vmec8szk9ni3c1.node0; screenResolution=1920x1080"
         ],
         "accept-language":[  
            "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,lt;q=0.6,it;q=0.5"
         ],
         "accept-encoding":[  
            "gzip, deflate, br"
         ],
         "referer":[  
            "http://localhost/api/documentation"
         ],
         "content-type":[  
            "multipart/form-data; boundary=----WebKitFormBoundaryNm6iocezUxk36GAH"
         ],
         "user-agent":[  
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/62.0.3202.62 Chrome/62.0.3202.62 Safari/537.36"
         ],
         "origin":[  
            "http://localhost"
         ],
         "accept":[  
            "application/json"
         ],
         "cache-control":[  
            "no-cache"
         ],
         "pragma":[  
            "no-cache"
         ],
         "content-length":[  
            "237"
         ],
         "connection":[  
            "keep-alive"
         ],
         "host":[  
            "localhost"
         ]
      },
      "response_content":"{\"message\":\"The given data was invalid.\",\"errors\":{\"email\":[\"The email must be a valid email address.\"]}}",
      "response_ms":0.121142101287842
   },
   "@message":"POST http://localhost/api/v1/authenticate",
   "@tags":[  
      "request-logger"
   ],
   "@type":"TestApplication"
}

The Versions

09/02 2018

dev-master

9999999-dev

Laravel Request Response Logger

  Sources   Download

MIT

The Requires

 

07/11 2017

0.1.3

0.1.3.0

Laravel Request Response Logger

  Sources   Download

MIT

The Requires

 

05/11 2017

0.1.1

0.1.1.0

Laravel Request Response Logger

  Sources   Download

MIT

The Requires

 

05/11 2017

0.1

0.1.0.0

Laravel Request Response Logger

  Sources   Download

MIT

The Requires