【问题标题】:Creating Index based on pattern matching in logstash在logstash中基于模式匹配创建索引
【发布时间】:2025-12-31 09:25:11
【问题描述】:

我正在尝试使用 elasticsearch logstash 和 kibana 为一组 windows 和 linux 服务器构建一个集中式日志记录系统。我的输入将是来自两个系统的系统日志(单个输入流)。我试图了解是否有办法使用 grok 并匹配模式,然后基于此将日志放在不同的索引中(一个用于 windows 日志,一个用于 linux 日志)

任何方向的帮助将不胜感激。

谢谢,

【问题讨论】:

    标签: regex elasticsearch logstash logstash-grok


    【解决方案1】:

    您可以根据日志来自哪个系统来分配“类型”,然后在输出中使用该类型。

    下面是配置:

    input{
       file{
         path =>"path/to/system1_log_file"
         type =>"sys1logs"
       }
    
      file{
        path =>"path/to/system2_log_files"
        type =>"sys2logs"
      }
    }
    
    output{
      if[type]=="sys1logs"{
      #output to sys1 index
       elasticsearch{host => localhost
                   index => "sys1"
                   }
       }
    
     if[type]=="sys2logs"{
     #output to sys2 index
      elasticsearch{host => localhost
                   index =>"sys2"
                  }
      }
    }
    

    【讨论】:

    • 感谢@Ana 的回复!但是我的输入是单一来源(相同的路径),因此我无法区分来源。我需要解析日志,然后将它们放入不同的索引中
    • 查看this question的答案。这可能很有用。
    【解决方案2】:

    当 grok 匹配时,您可以 grok{} 和 add_field:

    grok {
        matches => { "message", "foo %{WORD}" }
        add_field => { "send_to", "fooindex" }
    }
    

    或来自模式中的字段:

    grok {
        matches => { "message", "foo %{WORD:send_to} bar" }
    }
    

    然后在输出中使用 %{send_to}:

    elasticsearch {
        index => "%{send_to}-YYYY.MM.dd"
    }
    

    请注意,如果您的索引未命名为“logstash-*”,您将无法获得 logstash 提供的默认映射。

    【讨论】: