san4io / request-logger
Laravel Request Response Logger
Requires
- php: >=7.1
- laravel/framework: 5.5.*
- monolog/monolog: ~1.12
This package is not auto-updated.
Last update: 2024-05-08 01:23:11 UTC
README
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.
Installation
You can install the package via composer:
composer require san4io/request-logger
You can publish config
php artisan vendor:publish --provider="San4io\RequestLogger\RequestLoggerServiceProvider"
Configuration
In request-logger.php
config file you'll find current properties:
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:
// in `app/Http/Kernel.php` protected $middleware = [ ... \San4io\RequestLogger\Middleware\RequestLoggerMiddleware::class ];
In group of routes:
// in a routes file Route::group(['middleware' => \San4io\RequestLogger\Middleware\RequestLoggerMiddleware::class], function () { // });
In single route:
// 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.
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
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.
// 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.
Or you can create your own logger with different name, and inject it to RequestLogger
for example:
//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:
// 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!
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" }