将数据从Filebeats发送到多个Logstash文件时遇到问题

时间:2017-06-14 13:09:34

标签: elasticsearch logstash kibana filebeat logstash-forwarder

要精确,我正在处理一个拥有近百万条记录的日志文件。由于它是一个“结算摘要”日志,因此将不按特定顺序记录客户信息 我正在使用customized GROK Patternslogstash XML filter plugin来提取足以跟踪的数据。要跟踪个人客户活动,我使用“Customer_ID”作为唯一密钥。因此即使我使用多个Logstash文件和多个GROK模式,他的所有信息都可以使用他的“Customer_ID”(唯一键)进行限制/聚合

这是我的日志文件样本,
        7-04-2017 08:49:41 INFO abcinfo (ABC_RemoteONUS_Processor.java52) - Customer_Entry :::<?xml version="1.0" encoding="UTF-8"?><ns2:ReqListAccount xmlns:ns2="http://vcb.org/abc/schema/"/"><Head msgId="1ABCDEFegAQtQOSuJTEs3u" orgId="ABC" ts="2017-04-27T08:49:51+05:30" ver="1.0"/><Cust id="ABCDVFR233cd662a74a229002159220ce762c" note="Account CUST Listing" refId="DCVD849512576821682" refUrl="http://www.ABC.org.in/" ts="2017-04-27T08:49:51+05:30"

我的Grok模式,

grok {
patterns_dir => "D:\elk\logstash-5.2.1\vendor\bundle\jruby\1.9\gems\logstash-patterns-core-4.0.2\patterns"
match => [ "message" , "%{DATESTAMP:datestamp} %{LOGLEVEL:Logseverity}\s+%{WORD:ModuleInfo} \(%{NOTSPACE:JavaClass}\)%{ABC:Customer_Init}%{GREEDYDATA:Cust}"]add_field => { "Details" => "Request" }remove_tag => ["_grokparsefailure"]}  

我的自定义模式,存储在Pattern_dir,

ABC ( - Customer_Entry :::)

我的XML过滤插件,

xml {
source => "Cust"
store_xml =>false
xpath => [
  "//Head/@ts", "Cust_Req_time",
  "//Cust/@id", "Customer_ID",
  "//Cust/@note", "Cust_note", ]
  }  

因此无论细节如何** - Customer_Entry ::: **,我将能够使用XML插件过滤器(将存储类似于多行编解码器)来提取它。我编写了5个不同的Logstash文件,用5种不同的Grok模式提取不同的Customer活动。这将说明,

1.Customer_Entry
2.Customer_Purchase
3.Customer_Last_Purchase
4.Customer_Transaction
5.Customer_Authorization

所有上述Grok模式都有不同的信息集,如前所述,它将按Customer_ID分组。

我能够通过使用具有不同日志文件的自定义模式,在Kibana中清晰地提取信息并将其可视化,而没有任何缺陷。

由于我每天都有100个日志文件并且每天都要进入logstash,我选择了Filebeats,但Filebeats只运行一个端口“5044”。我尝试使用5个不同的端口运行5个不同的logstash文件但是没有用,只有一个5的logstash文件被加载其余的配置文件正在空闲。
这是我的示例filebeat output.prospector

output.logstash:
  主持人:[“localhost:5044”]

output.logstash:
  主持人:[“localhost:5045”]

output.logstash:
  主持人:[“localhost:5046”]

我无法在一个logstash配置文件中添加所有grok模式,因为XML Filter插件采用源“GREEDYDATA”。在这种情况下,我将为5种不同的Grok模式提供5种不同的Source=>。 我甚至尝试过这种方法但是没有用。

寻找更好的方法。

1 个答案:

答案 0 :(得分:0)

听起来你正在寻找规模,并行摄取。碰巧,File beats支持名为load-balancing的东西,听起来就像你正在寻找的东西。

val tweets = TwitterUtils.createStream(ssc,auth)
<console>:49: error: overloaded method value createStream with alternatives:
  (jssc: org.apache.spark.streaming.api.java.JavaStreamingContext,twitterAuth: twitter4j.auth.Authorization)org.apache.spark.streaming.api.java.JavaReceiverInputDStream[twitter4j.Status] <and>
  (jssc: org.apache.spark.streaming.api.java.JavaStreamingContext,filters: Array[String])org.apache.spark.streaming.api.java.JavaReceiverInputDStream[twitter4j.Status] <and>
  (ssc: org.apache.spark.streaming.StreamingContext,twitterAuth: Option[twitter4j.auth.Authorization],filters: Seq[String],storageLevel: org.apache.spark.storage.StorageLevel)org.apache.spark.streaming.dstream.ReceiverInputDStream[twitter4j.Status]
 cannot be applied to (org.apache.spark.streaming.StreamingContext, twitter4j.auth.OAuthAuthorization)
       val tweets = TwitterUtils.createStream(ssc,auth)

这是输出。虽然,我相信你想要输入多线程。 FileBeats应该跟踪prospector配置中指定的所有文件,但是你已经找到了限制。 Globbing或指定目录将单线程化该glob /目录中的文件。如果你的文件名支持它,creative-globbing可以通过在同一目录中定义多个globs来提高你的并行性。

假设您的日志按类型进入:

output.logstash:
  hosts: [ "localhost:5044", "localhost:5045", "localhost:5046" ]
  loadbalance: true

这将使多个线程上的探矿者能够在这里读取并行文件。

如果您的日志是以随机名称输入的,则可以使用类似的设置

- input_type: log
  paths:
    - /mnt/billing/*entry.log
    - /mnt/billing/*purchase.log
    - /mnt/billing/*transaction.log

如果您处理的许多文件具有永不重复的唯一名称,则向您的探索者添加- input_type: log paths: - /mnt/billing/a* - /mnt/billing/b* - /mnt/billing/c* [...] - /mnt/billing/z* config config-option将使您的FileBeat保持快速运行。

clean_inactive

将删除超过24小时的文件的所有状态,并且不会处理任何超过18小时的文件。