在kibana中搜索按KQL语法发现

waxmsbnn  于 2022-12-09  发布在  Kibana
关注(0)|答案(2)|浏览(247)

我已经在laravel中创建了一个中间件!

<?php

namespace App\Http\Middleware;

use Carbon\Carbon;
use Closure;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Log;
use phpDocumentor\Reflection\Types\String_;

class SystemActivityLogger
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return Response|RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        Log::channel('rabbitmq_elk')->info($this->prepareLogData($request));
        return $next($request);
    }

    /**
     * Prepare log data and log it
     * @param Request $request
     * @return string
     */
    private function prepareLogData(Request $request)
    {
      return json_encode([
          'ip' => $request->ip(),
          'url' => $request->url(),
          'agent' => $request->userAgent(),
          'date' => Carbon::now()->toDateTimeString(),
          'params' => $request->query(),
       ]);
    }
}

此中间件用于日志记录,我希望prepareLogData()返回json类型,并且我可以使用KQL语法在kibana discover中搜索它。这是我的sdamiii.conf文件

input {
       rabbitmq {
        host => "localhost"
        port => 5672
        heartbeat => 30
        queue => "system_logs"
        durable => "true"
        user => "guest"
        password => "guest"
        vhost => "/"
    }   
}
output {
       elasticsearch {
           hosts => ["localhost:9200"]
           index => "my-index-000001"
           data_stream => "false"
       }
}

在运行‍‍bin/logstash -f conf.d/sdamiii.conf命令并请求Laravel后,我在Kiabana中得到以下输出。

但我不按KQL语法搜索,例如我想搜索message.ip我不接收
我该如何解决这个问题?

mspsb9vt

mspsb9vt1#

当您像这样更改prepareLogData方法时,会得到什么结果?

/**
 * Prepare log data and log it
 * @param Request $request
 * @return string
 */
private function prepareLogData(Request $request)
{
  return [
      'ip' => $request->ip(),
      'url' => $request->url(),
      'agent' => $request->userAgent(),
      'date' => Carbon::now()->toDateTimeString(),
      'params' => $request->query(),
   ];
}
i2byvkas

i2byvkas2#

如果希望整个管道的行为与7.13中的in 8.x EXACTLY相同,最好的方法是将管道设置为pipeline.ecs_compaitibility
由于您使用的配置为每个Logstash进程恰好提供一个管道,因此在logstash.yml中这样做是合理的。如果要运行多个管道,则最好在其pipelines.yml条目中为每个适用的管道都这样做。
如果出于某种原因,您希望避免上述简单的路径(提示:您可能没有),可以通过调整管道定义,使每个插件定义都有一个ecs_compatibility => disabled指令,来解决这个不赞成使用的警告。

codec =>
 json becomes codec =>
   json { 
     ecs_compatibility => disabled 
   }

我鼓励您选择简单的方法,锁定整个管道所需的行为。

filter{
        json{
                source => "data"
        }
        json{
                source => "data.params"
        }
}

filter{
        json{
                source => "message"
        }
}

这是输出

现在您可以使用KQL语言进行搜索

相关问题