Laravel用麋鹿解析日志(elasticsearch,logstash,kibana)

时间:2017-09-13 11:16:32

标签: logstash kibana elastic-stack logstash-grok

我已经为Laravel应用程序成功配置了ELK,但我们正面临着Laravel日志的问题。我已使用以下代码配置了logstash模板。但是我在Kibana接受Break线路。我按照以下细节尝试了两种不同的配置代码。

  

20-laravel.conf

input {
stdin{
    codec => multiline {
        pattern => "^\["
        what => "previous"
        negate => true
    }
}
}

filter {
grok {
    match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:severity}: %{DATA:message}" }
}
}

output {
elasticsearch {
    document_type => "logs"
    hosts => ["127.0.0.1"]
    index => "laravel_logs"
}
}
filter {
 # Laravel log files
if [type] == "laravel" {
grok {
  match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:severity}: %{DATA:message} \[" }
    }
  }
 }
  

laraval样本日志是:

[2017-09-13 16:19:28] production.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Parse error: syntax error, unexpected identifier (T_STRING), expecting ',' or ')' in /var/www/app/Http/Controllers/BrandsController.php:57
Stack trace:
#0 /var/www/vendor/composer/ClassLoader.php(322): 
 Composer\Autoload\includeFile('/var/www/vendor...')
 #1 [internal function]: Composer\Autoload\ClassLoader-
>loadClass('App\\Http\\Contro...')
#2 [internal function]: spl_autoload_call('App\\Http\\Contro...')
  

所以我的主要问题是我们在单行中记录kibana中的这个日志。例如,上面的日志代码是一个划分为不同的行消息,我们无法确定哪个行消息来自哪个错误?

单个laravel日志的Kibana日志输出显示在下面的图像中。kibana log-output

2 个答案:

答案 0 :(得分:0)

一个简单的替代方法是使用Laralog

使用Laralog,Laravel可以直接登录到Elastic Search而无需安装所有完整的Logstash堆栈,因此它适用于小型和容器环境。

使用示例:

laralog https://elasticsearch:9200 --input=laravel.log

Laralog将自动解析并发送日志。

答案 1 :(得分:0)

您应该创建一个新的提供程序来正确设置monolog,请尝试以下设置:

class LogstashProvider extends ServiceProvider
{
    public function boot(): void
    {
        $stream = storage_path('logs/laravel.log');
        $name = env('APP_NAME');

        $formatter = new LogstashFormatter($name, null, null, 'ctxt_', LogstashFormatter::V1);
        $streamHandler = new StreamHandler($stream, Logger::DEBUG, false);
        $streamHandler->setFormatter($formatter);

        Log::getMonolog()->pushHandler(
            $streamHandler
        );
    }
}

您还应配置您的logstash以解析json而不是