0

我编写了一个小型 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

我的 java 程序在哪里apache_logs输入:

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
4

2 回答 2

1

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

我修改了您的 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 编写器是异步编写器并且不会立即刷新。

你甚至可以通过使用 elapsed 插件来让它更“酷”,它会为你计算这些时间戳之间的差异。

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

阿图尔

于 2016-06-10T09:48:55.173 回答
0

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

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

解决了我的问题。

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

于 2016-06-10T09:09:32.263 回答