I have a laravel application that I want to store my logs into my logstash and see them in kibana i searched a lot over the net to find a solution for it but I didnt find any good source for it, is there any package to use laravel logs into logstash ??? by the way I have my logstash and kibana running without any problem I just need a source of data now . and here is my elstic search running :
{ name: "5351ced3b7a4", cluster_name: "elasticsearch", cluster_uuid: "Ej5TRN8CQyGvemZlT3gAFA", version: { number: "7.1.1", build_flavor: "oss", build_type: "tar", build_hash: "7a013de", build_date: "2019-05-23T14:04:00.380842Z", build_snapshot: false, lucene_version: "8.0.0", minimum_wire_compatibility_version: "6.8.0", minimum_index_compatibility_version: "6.0.0-beta1" }, tagline: "You Know, for Search" }
EDIT as the answer explains the way I did and now I get this error in my logs in laravel :
[2019-08-05 14:16:17] laravel.INFO: Hello logstash!
EDIT : The Logging Config file :
<?php use MonologHandlerStreamHandler; use MonologHandlerSyslogUdpHandler; return [ /* |-------------------------------------------------------------------------- | Default Log Channel |-------------------------------------------------------------------------- | | This option defines the default log channel that gets used when writing | messages to the logs. The name specified in this option should match | one of the channels defined in the "channels" configuration array. | */ 'default' => env('LOG_CHANNEL', 'stack'), /* |-------------------------------------------------------------------------- | Log Channels |-------------------------------------------------------------------------- | | Here you may configure the log channels for your application. Out of | the box, Laravel uses the Monolog PHP logging library. This gives | you a variety of powerful log handlers / formatters to utilize. | | Available Drivers: "single", "daily", "slack", "syslog", | "errorlog", "monolog", | "custom", "stack" | */ 'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['daily'], 'ignore_exceptions' => false, ], 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', ], 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'days' => 14, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => 'critical', ], 'papertrail' => [ 'driver' => 'monolog', 'level' => 'debug', 'handler' => SyslogUdpHandler::class, 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), ], ], 'stderr' => [ 'driver' => 'monolog', 'handler' => StreamHandler::class, 'formatter' => env('LOG_STDERR_FORMATTER'), 'with' => [ 'stream' => 'php://stderr', ], ], 'syslog' => [ 'driver' => 'syslog', 'level' => 'debug', ], 'errorlog' => [ 'driver' => 'errorlog', 'level' => 'debug', ], 'logstash' => [ 'driver' => 'custom', 'via' => AppLogstashLogger::class, 'host' => env('LOGSTASH_HOST', '127.0.0.1'), 'port' => env('LOGSTASH_PORT', 9200), ], ], ];
Advertisement
Answer
As explained in this post it’s quite easy to do.
- Configure a logging channel in
config/logging.php
(docs)
'channels' => [ // ... other channels like stack or single 'logstash' => [ 'driver' => 'custom', 'via' => AppLogstashLogger::class, 'host' => env('LOGSTASH_HOST', '127.0.0.1'), 'port' => env('LOGSTASH_PORT', 4718), ], ],
- Create a custom Logger factory (docs)
namespace App; use MonologFormatterLogstashFormatter; use MonologHandlerSocketHandler; use MonologLogger; use PsrLogLoggerInterface; class LogstashLogger { /** * @param array $config * @return LoggerInterface */ public function __invoke(array $config): LoggerInterface { $handler = new SocketHandler("udp://{$config['host']}:{$config['port']}"); $handler->setFormatter(new LogstashFormatter(config('app.name'))); return new Logger('logstash.main', [$handler]); } }
This will write logs via udp to the specified host and port using the monolog logstash formatter
- To now write log entries to logstash specify the logging channel you just created (docs)
Log::channel('logstash')->info('Hello logstash!');