生成示例日志以提供给 logstash 的程序?

Program to generate sample log to feed to logstash?

我写了一个 java 小程序,它生成一些虚拟日志(基本上是将内容写入 txt 文件)。现在我想将这些数据提供给 ELK 堆栈。基本上 logstash 应该从 txt 文件中读取这些数据,我想在 kibana 上可视化这些更改,只是为了感受一下。

然后我基本上想做的是更改我的程序将虚拟日志写入 txt 文件的速度,以便我可以在 kibana 上看到更改。

我刚刚开始探索 ELK 堆栈,这可能是进行此类分析的完全错误的方法。请建议是否有其他更好的方法来做到这一点(考虑到我现在没有实际的日志可以使用)

编辑:@Val

input {
    generator {
        message => “’83.149.9.216 - - [17/May/2015:10:05:03 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36””
        count => 10
    }
}

这是我的 logstash.conf:

input {

 stdin { }

}


filter {
  grok {
    match => {
      "message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}'
    }
  }

  date {
    match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
    locale => en
  }

  geoip {
    source => "clientip"
  }

  useragent {
    source => "agent"
    target => "useragent"
  }
}

output {
  stdout {
codec => plain {
                        charset => "ISO-8859-1"
                }

}
  elasticsearch {
    hosts => "http://localhost:9200"
    index => "apache_elk_example"
    template => "./apache_template.json"
    template_name => "apache_elk_example"
    template_overwrite => true
  }
}

现在,在启动 elasticsearch 和 kabana 之后,我做的是:

cat apache_logs | /usr/local/opt/logstash/bin/logstash -f apache_logs

其中 apache_logs 是从我的 java 程序中获取的:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        PrintStream out = new PrintStream(new FileOutputStream("/Users/username/Desktop/user/apache_logs"));
        System.setOut(out);
    } catch (FileNotFoundException ex) {
        System.out.print("Exception");
    }
    while(true)
    //for(int i=0;i<5;++i)
    {
        System.out.println(generateRandomIPs() + //other log stuff);
        try {
            Thread.sleep(1000);                 //1000 milliseconds is one second.
        } catch(InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }
}

问题来了:

Kibana 不会向我显示实时可视化,即当我的 java 程序将数据输入 apache_log 文件时,它不会向我显示。它只显示直到在执行 :

时已经将任何数据写入 'apache_log'
cat apache_logs | /usr/local/opt/logstash/bin/logstash -f apache_logs

将日志存储配置文件中的输入更改为

input {
    file {
        path => "/Users/purajain/Desktop/purak/logs/*"
    }
}

解决了我的问题。

File 插件有助于从文件流式传输事件。

可能有点晚了,但我写了一小部分我的意思。

我修改了您的 java 程序以添加这样的时间戳:

public class LogWriter {


    public static Gson gson = new Gson();

    public static void main(String[] args) {

        try {
            PrintStream out = new PrintStream(new FileOutputStream("/var/logstash/input/test2.log"));
            System.setOut(out);
        } catch (FileNotFoundException ex) {
            System.out.print("Exception");
        }

        Map<String, String> timestamper = new HashMap<>();

        while(true)
        {

            String format = LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);

            timestamper.put("myTimestamp", format);
            System.out.println(gson.toJson(timestamper));
            try {
                Thread.sleep(1000);                 //1000 milliseconds is one second.
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }

    }
}

现在这样写json:

{"myTimestamp":"2016-06-10T10:42:16.299"}
{"myTimestamp":"2016-06-10T10:42:17.3"}
{"myTimestamp":"2016-06-10T10:42:18.301"}

然后我设置 logstash 来读取该文件并解析它并输出到标准输出:

input {
  file {
     path => "/var/logstash/input/*.log"
     start_position => "beginning"
     ignore_older => 0
     sincedb_path => "/dev/null"
  }   
}

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

output {
    file {
           path => "/var/logstash/out.log"
    }
    stdout { codec => rubydebug }
}

所以它会获取我的日志,它知道它是什么时候创建的,解析它,并创建一个新的时间戳来表示它看到日志的时间:

{
        "message" => "{\"myTimestamp\":\"2016-06-10T10:42:17.3\"}",
       "@version" => "1",
     "@timestamp" => "2016-06-10T09:42:17.687Z",
           "path" => "/var/logstash/input/test2.log",
           "host" => "pandaadb",
    "myTimestamp" => "2016-06-10T10:42:17.3"
}
{
        "message" => "{\"myTimestamp\":\"2016-06-10T10:42:18.301\"}",
       "@version" => "1",
     "@timestamp" => "2016-06-10T09:42:18.691Z",
           "path" => "/var/logstash/input/test2.log",
           "host" => "pandaadb",
    "myTimestamp" => "2016-06-10T10:42:18.301"
}

在这里您现在可以看到处理日志需要多长时间。大约 300 毫秒,我认为您的 java 编写器是异步编写器,不会立即刷新。

您甚至可以 "cooler" 通过使用 elapsed 插件来计算这些时间戳之间的差异。

我希望这对您的测试有所帮助 :) 可能不是最先进的方法,但它很容易理解并且非常先进和快速。

亚瑟