Хобрук: Ваш путь к мастерству в программировании

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

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

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

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

Изменить: @Вал

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

  • Вы также можете использовать плагин generator input. . 09.06.2016
  • вы можете использовать ввод файла. Попросите вашу программу генерировать временные метки с другим именем. Logstash добавит свою временную метку в поле @timestamp. Отметка времени logstash будет отметкой времени, когда он ее анализирует, а ваша будет отметкой времени ее записи. Однако вы должны учитывать, что ваша Java-программа также работает асинхронно, поэтому будет задержка 09.06.2016
  • @Val, можете ли вы проиллюстрировать, как использовать этот плагин для создания случайных журналов. Проверьте редактирование. 09.06.2016
  • Вы все сделали правильно, вы можете использовать настройки lines, если вам нужно сгенерировать несколько разных строк. 10.06.2016
  • @Val Так что это в основном один журнал много раз или массив журналов, повторяющийся много раз. Если я хочу, чтобы он генерировал, скажем, 1000 журналов с разными временными метками? 10.06.2016
  • Хорошо, если вы хотите 1000 разных строк журнала, возможно, это действительно неправильный путь. Тем не менее, вы можете найти множество примеров файлов журнала в Интернете. 10.06.2016
  • @Val Я не хочу использовать загруженные файлы журналов. Я хочу передать данные тайника журнала, которые были сгенерированы в реальном времени, чтобы я мог просматривать изменения в реальном времени на графике kabana ... и видеть влияние изменения скорости создания журнала на kibana. 10.06.2016
  • @pandaadb, пожалуйста, проверьте редактирование. 10.06.2016
  • Извините, я слишком устал прошлой ночью :) 10.06.2016

Ответы:


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, который рассчитает для вас разницу между этими временными метками.

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

Артур

10.06.2016

2

Изменение ввода в файле конфигурации хранилища журнала на

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

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

Плагин File помогает передавать события из файлов.

10.06.2016
Новые материалы

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

Создание дизайна обуви с помощью машинного обучения
Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

GraalVM в 2022 году: итоги года
2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..

Быстрая разработка: волшебный мир больших языковых моделей
РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..

Ускоренный курс по Node Redis
Сегодня мы будем учиться использовать Redis в Node.js, однако я не собираюсь вываливать сюда всю документацию и утомлять вас до смерти. Это руководство для начинающих? — спросите вы. Ну..

Обзор Python для науки о данных и машинного обучения
Python стал наиболее предпочтительным языком программирования среди разработчиков, которые в основном занимаются наукой о данных и машинным обучением. Интуитивно понятные и уникальные функции..

Принудительный сброс состояния компонента React с помощью ключевого свойства
Принудительный сброс состояния компонента React с помощью ключевого свойства Знаете ли вы, что вы можете использовать опору key для принудительного сброса состояния компонента? В..