Программа для создания образца журнала для подачи в logstash?

Я написал небольшую Java-программу, которая генерирует несколько фиктивных логов (в основном записывает материал в текстовый файл). Теперь я хочу передать эти данные в стек ELK. По сути, logstash должен читать эти данные из txt-файла, и я хочу визуализировать эти изменения на кибане, просто чтобы почувствовать это.

Что я в основном хочу сделать, так это изменить скорость, с которой моя программа записывает фиктивные логи в текстовый файл, чтобы я мог видеть изменения в кибане.

Я только начал изучать стек 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
  }
}

Теперь, после запуска эластичного поиска и кабана, я делаю:

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

2 ответа

Решение

Может быть немного поздно, но я написал небольшой пример того, что я имел в виду.

Я изменил вашу 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-писатель является асинхронным писателем и не будет сбрасываться сразу.

Вы даже можете сделать это немного "круче", используя истекший плагин, который вычислит разницу между этими временными метками для вас.

Надеюсь, это поможет вам в тестировании:) Возможно, это не самый продвинутый способ сделать это, но он прост для понимания, довольно прост и быстр.

Артур

Изменение входных данных в файле конфигурации log stash на

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

решил мою проблему.

Файловый плагин помогает поток событий из файлов.

Другие вопросы по тегам