ELK只LogStash配置

代办

[√] Grok 可选字段配置

如何解决:

%{TIMESTAMP_ISO8601:timestamp} \[(?<filename>.*?.py)\] \[func:(?<func>.*?)\] \[line:%{NUMBER:line}\] \[%{LOGLEVEL:log_evel}\] (\[transaction:(?<transid>.*?)\])?(\[file_path:(?<file_path>.*?)\])?(\[language:(?<lang>.*?)\])?%{GREEDYDATA:content}

上面的grok表达式中, transaction/file_path/language 三个字段都是可选字段

[ ] Logstash 接受 同一个 beat的不同不同输入并route到正确的es 的index中

如何解决

解决方法:

同一个beat发送过来的logs即使在不同的log文件,那么他们的log.file.path字段就可以作为区分的条件,可以按如下判断条件:

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}

# sample:
# %{TIMESTAMP_ISO8601:timestamp} \\[file:(?<filename>.*?.py)\\] \\[func:(?<func>.*?)\\] \\[line:%{NUMBER:line}\\] \\[%{LOGLEVEL:log_evel}\\] %{GREEDYDATA:content}
# contain optional fields
# %{TIMESTAMP_ISO8601:timestamp} \[(?<filename>.*?.py)\] \[func:(?<func>.*?)\] \[line:%{NUMBER:line}\] \[%{LOGLEVEL:log_evel}\] (\[transaction:(?<transid>.*?)\])?(\[file_path:(?<file_path>.*?)\])?(\[language:(?<lang>.*?)\])?%{GREEDYDATA:content}

filter {
  if ("test1" in [tags]) and ([log][file][path] == "/logs/main.log") {
    grok {
      match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[file:(?<filename>.*?.py)\] \[func:(?<func>.*?)\] \[line:%{NUMBER:line}\] \[%{LOGLEVEL:log_evel}\] (\[transaction:(?<transid>.*?)\])?(\[file_path:(?<file_path>.*?)\])?(\[language:(?<lang>.*?)\])?%{GREEDYDATA:content}"}
    } 
  }
}

output {
  # stdout { codec => rubydebug }
  if ("test1" in [tags]) and ([log][file][path] == "/logs/main.log") {
    elasticsearch {
      hosts => ["192.168.56.102:9200"]
      index => "test1-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #   #user => "elastic"
    #   #password => "changeme"
    }
  }
  
}

[] Logstash 接受不同beat的输入并route到正确的es的index

如何解决

解决方法

在路径: /var/logstash/www/logstash-7.8.1/config/pipelines.yml 添加yml文件,内容如下

- pipeline.id: test1
  path.config: "/var/logstash/www/config/logstash.conf"

如果有多个pipeline则配置多个pipeline配置文件