Как использовать хост nginx для перезаписи информации о хосте logstash при отправке ее с помощью filebeat?

#nginx #kubernetes #logstash #host #filebeat

#nginx #kubernetes #logstash #хост #filebeat

Вопрос:

Теперь с помощью filebeat и logstash отправка журнала json nginx в k8s.

Конфигурация nginx нравится

nginx.conf

 http {
    log_format bucket escape=json
    '{'
        '"request_id": "$request_id",'
        '"method": "$request_method",'
        '"status": "$status",'
        '"forwarded_for": "$http_x_forwarded_for",'
        '"host": "$host",'
        '"url": "$request_uri",'
        '"referer": "$http_referer",'
        '"remote_ip": "$remote_addr",'
        '"server_ip": "$server_addr",'
        '"user_agent": "$http_user_agent",'
    '}';
}

server {
    access_log  /var/log/nginx/access.json  bucket;
}
 

Конфигурация Filebeat:

filebeat.yml

 filebeat.shutdown_timeout: 5s

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/nginx/access.json*
    exclude_files: ['.gz

Здесь  overwirte_keys  верно, поэтому он должен перезаписывать метаданные, верно?

Конфигурация Logstash:

logstash.conf

 input {
  beats {
    port => 5044
  }
}

filter {
  if "access" in [tags] {
    mutate {
      add_field => { "[@metadata][tags]" => "%{tags}" }
      remove_field => [
        "agent",
        "event",
        "service",
        "log",
        "input",
        "fileset",
        "ecs",
        "container",
        "kubernetes",
        "@timestamp",
        "@version",
        "message",
        "tags"
      ]
    }
  }
}

output {
  if "access" in [@metadata][tags] {
    google_cloud_storage {
      bucket => "nginx_logs"
      json_key_file => "/secrets/service_account/credentials.json"
      temp_directory => "/tmp/nginx_logs"
      log_file_prefix => "logstash_nginx_logs"
      max_file_size_kbytes => 1024
      output_format => "json"
      date_pattern => "%Y-%m-%dT%H:00"
      flush_interval_secs => 2
      gzip => false
      gzip_content_encoding => false
      uploader_interval_secs => 60
      include_uuid => true
      include_hostname => true
    }
  }
}
 

Вначале это работает хорошо. Данные журнала были сгенерированы в файлы json как:

 {"user_agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 14_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone13,1;FBMD/iPhone;FBSN/iOS;FBSV/14.2.1;FBSS/3;FBID/phone;FBLC/ja_JP;FBOP/5]","forwarded_for":"1.2.3.4","host":"api.mysite.com","method":"OPTIONS","request_id":"0127054b954fe4973852e1886130a6ca","referer":"https://www.world.com/","remote_ip":"2.3.4.5","server_ip":"3.4.5.6","status":"204","url":"/api/v1/post"}
 

Но недавно эти данные появились:

 {"user_agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 14_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone13,1;FBMD/iPhone;FBSN/iOS;FBSV/14.2.1;FBSS/3;FBID/phone;FBLC/ja_JP;FBOP/5]","forwarded_for":"1.2.3.4","host":"api.mysite.com","method":"OPTIONS","request_id":"0127054b954fe4973852e1886130a6ca","referer":"https://www.world.com/","remote_ip":"2.3.4.5","server_ip":"3.4.5.6","status":"204","url":"/api/v1/post"}
{"host":{"name":"filebeat-adio3"}}
{"host":{"name":"filebeat-adio3"}}
{"host":{"name":"filebeat-adio3"}}
 

Это не обычные данные. Похоже, host что метаданные сервера filebeat были отправлены. Но почему? Это ошибка filebeat или logstash?
Есть ли другой хороший способ отфильтровать данные этого хоста, чтобы гарантировать, что они будут отправлены без конфликта с метаданными fb / logstash?

Комментарии:

1. Это {"host":{"name":"filebeat-adio3"}} единственное и полное содержимое документа или есть дополнительная информация? Если да, можете ли вы поделиться им полностью?

2. {"host":{"name":"filebeat-adio3"}} иногда это единственное содержимое. Я обновил свой вопрос.

3. Итак, просто для ясности, это содержимое можно найти в /var/log/nginx/access.json ?

4. Трудно найти старые файлы о nginx, поскольку его ротация журнала составляет одну неделю. Но, похоже, проблема возникла после того, как мы развернули новую функцию на прошлой неделе. В то время, возможно, что-то пошло не так (но не уверен, были ли это данные nginx или fb / logstash). В наши дни такого рода данные больше не повторялись.

5. Хорошо, не стесняйтесь обновлять этот поток, если это произойдет снова

]
tags: ["access"]

processors:
- decode_json_fields:
fields: ["message"]
process_array: true
max_depth: 1
target: ""
overwrite_keys: true
add_error_key: false

output.logstash:
hosts: ["logstash.default.svc.cluster.local:5044"]
Здесь overwirte_keys верно, поэтому он должен перезаписывать метаданные, верно?

Конфигурация Logstash:

logstash.conf


Вначале это работает хорошо. Данные журнала были сгенерированы в файлы json как:


Но недавно эти данные появились:


Это не обычные данные. Похоже, host что метаданные сервера filebeat были отправлены. Но почему? Это ошибка filebeat или logstash?
Есть ли другой хороший способ отфильтровать данные этого хоста, чтобы гарантировать, что они будут отправлены без конфликта с метаданными fb / logstash?

Комментарии:

1. Это {"host":{"name":"filebeat-adio3"}} единственное и полное содержимое документа или есть дополнительная информация? Если да, можете ли вы поделиться им полностью?

2. {"host":{"name":"filebeat-adio3"}} иногда это единственное содержимое. Я обновил свой вопрос.

3. Итак, просто для ясности, это содержимое можно найти в /var/log/nginx/access.json ?

4. Трудно найти старые файлы о nginx, поскольку его ротация журнала составляет одну неделю. Но, похоже, проблема возникла после того, как мы развернули новую функцию на прошлой неделе. В то время, возможно, что-то пошло не так (но не уверен, были ли это данные nginx или fb / logstash). В наши дни такого рода данные больше не повторялись.

5. Хорошо, не стесняйтесь обновлять этот поток, если это произойдет снова