Легкий инструмент для сбора журналов с превосходной производительностью, используемый Microsoft и Amazon!

Spring Boot Java
Легкий инструмент для сбора журналов с превосходной производительностью, используемый Microsoft и Amazon!

Адрес фактического центра электронной коммерции SpringBoot (35k+star):GitHub.com/macro-positive/…

Резюме

ELKВсе знают систему сбора логов, но есть еще и система сбора логовEFK, должно быть много друзей, которые не знают! здесьFОтноситсяFluentd, у него есть функция сбора журналов, аналогичная Logstash, но использование памяти составляет менее одной десятой от того, что у Logstash, и он имеет превосходную производительность и очень легкий. В этой статье будет подробно рассказано об использовании Fluentd, который в основном используется для сбора логов приложений SpringBoot, надеюсь, он будет полезен всем!

Введение во Fluentd

Fluentd — это функция сбора журналов с открытым исходным кодом, предназначенная для создания единого уровня сбора журналов для пользователей, и может использоваться с Elasticsearch и Kibana для создания системы сбора журналов EFK. Что такое унифицированный уровень сбора журналов? Взгляните на картинку ниже, чтобы увидеть ясно!

来自Fluentd官网

Установить

существует"Вы все равно ходите на сервер собирать логи, разве не восхитительно построить систему сбора логов! 》Построение системы сбора логов ELK было представлено в , здесь будет представлена ​​не установка Elasticsearch и Kibana, а установка Fluentd в среде Docker.

  • Загрузите Docker-образ Fluentd;
docker pull fluent/fluentd:v1.10
  • конфигурация по умолчаниюfluent.confфайл скопирован в/mydata/fluentd/В каталоге информация о конфигурации выглядит следующим образом:
<source>
  @type  forward
  @id    input1
  @label @mainstream
  port  24224
</source>

<filter **>
  @type stdout
</filter>

<label @mainstream>
  <match docker.**>
    @type file
    @id   output_docker1
    path         /fluentd/log/docker.*.log
    symlink_path /fluentd/log/docker.log
    append       true
    time_slice_format %Y%m%d
    time_slice_wait   1m
    time_format       %Y%m%dT%H%M%S%z
  </match>
  <match **>
    @type file
    @id   output1
    path         /fluentd/log/data.*.log
    symlink_path /fluentd/log/data.log
    append       true
    time_slice_format %Y%m%d
    time_slice_wait   10m
    time_format       %Y%m%dT%H%M%S%z
  </match>
</label>
  • Чтобы запустить службу Fluentd, она должна быть открыта.24221~24224Четыре порта используются для приема различных типов логов;
docker run -p 24221:24221 -p 24222:24222 -p 24223:24223 -p 24224:24224 --name efk-fluentd \
-v /mydata/fluentd/log:/fluentd/log \
-v /mydata/fluentd/fluent.conf:/fluentd/etc/fluent.conf \
-d fluent/fluentd:v1.10
  • Первый запуск может завершиться неудачей, вы можете перезапустить его после изменения прав доступа к каталогу;
chmod 777 /mydata/fluentd/log/
  • использоватьrootПользователь входит внутрь контейнера Fluentd;
docker exec -it --user root efk-fluentd /bin/sh
  • Установите плагин Elasticsearch для Fluentd;
fluent-gem install fluent-plugin-elasticsearch
  • Если вы все еще хотите использоватьdocker-composeЧтобы установить EFK за один раз, вы можете использовать следующий скрипт,注意использоватьuser:rootНет необходимости изменять права доступа к каталогу для запуска!
version: '3'
services:
  elasticsearch:
    image: elasticsearch:6.4.0
    container_name: efk-elasticsearch
    user: root
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
      - TZ=Asia/Shanghai
    volumes:
      - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: kibana:6.4.0
    container_name: efk-kibana
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
      - TZ=Asia/Shanghai
    ports:
      - 5601:5601
  fluentd:
    image: fluent/fluentd:v1.10
    container_name: efk-fluentd
    user: root
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /mydata/fluentd/log:/fluentd/log
      - /mydata/fluentd/fluent.conf:/fluentd/etc/fluent.conf
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    ports:
      - 24221:24221
      - 24222:24222
      - 24223:24223
      - 24224:24224
  • Использовать новый файл конфигурацииfluent.confЗамените исходный файл конфигурации, затем перезапустите службу Fluentd, новый файл конфигурации будет приведен ниже.

Сведения о конфигурации Fluentd

Далее давайте представим, как настроить файл конфигурации Fluentd, сначала опубликуем полную конфигурацию, а затем подробно объясним некоторые моменты конфигурации.

полностью настроен

<source>
  @type  tcp
  @id    debug-input
  port  24221
  tag debug
  <parse>
	@type json
  </parse>
</source>

<source>
  @type  tcp
  @id    error-input
  port  24222
  tag error
  <parse>
	@type json
  </parse>
</source>

<source>
  @type  tcp
  @id    business-input
  port  24223
  tag business
  <parse>
	@type json
  </parse>
</source>

<source>
  @type  tcp
  @id    record-input
  port  24224
  tag record
  <parse>
	@type json
  </parse>
</source>

<filter record>
  @type parser
  key_name message
  reserve_data true
  remove_key_name_field true
  <parse>
    @type json
  </parse>
</filter>

<match fluent.**>
  @type stdout
  output_type json
</match>

<match **>
  @type elasticsearch
  host 192.168.3.101
  port 9200
  type_name docker
  logstash_format true
  logstash_prefix docker-${tag}-logs
  logstash_dateformat %Y-%m-%d
  flush_interval 5s
  include_tag_key true
</match>

Анализ точек конфигурации

<source>

Определяет источник сбора логов, который может быть tcp, udp, tail (файл), forward (tcp+udp), http и т. д.

Здесь собираем логи от tcp запросов, порт указан24221, и установите тег наdebug.

<source>
  @type  tcp
  @id    debug-input
  port  24221
  tag debug
  <parse>
	@type json
  </parse>
</source>

<parse>

Определяет, как анализировать необработанные данные и преобразовывать журналы в формат JSON.

Например, мы можем преобразовать журнал отладки в JSON и настроить его следующим образом.

<source>
  @type  tcp
  @id    debug-input
  port  24221
  tag debug
  <parse>
	@type json
  </parse>
</source>

<filter>

Для собранных журналов можно выполнить ряд операций, например распечатать журналы на консоли или проанализировать журналы.

Конфигурация для печати всех журналов на консоль:

<filter **>
  @type stdout
</filter>

для тега какrecordlog источника, мы включимmessageАтрибуты конвертируются в формат JSON, если не конвертируются,messageСвойство будет строкой.

<filter record>
  @type parser
  key_name message
  reserve_data true
  remove_key_name_field true
  <parse>
    @type json
  </parse>
</filter>

<match>

Определяет, куда окончательно выводятся собранные логи, которые могут быть выведены на стандартный вывод (консоль), в файл, elasticsearch, mongo и т. д.

Здесь мы используемelasticsearchдля хранения информации журнала,logstash_format,logstash_prefix,logstash_dateformatОн в основном используется для управления созданием имени индекса журнала Формат индекса текущей конфигурации для создания журнала отладки:docker-debug-logs-2020-06-03,flush_intervalИспользуется для управления интервалом вывода журнала в elasticsearch.

<match **>
  @type elasticsearch
  host 192.168.3.101
  port 9200
  type_name docker
  logstash_format true
  logstash_prefix docker-${tag}-logs
  logstash_dateformat %Y-%m-%d
  flush_interval 5s
  include_tag_key true
</match>

заменить файл конфигурации

заменить оригинал/mydata/fluentd/fluent.confФайл конфигурации, а затем перезапустите службу, наша служба Fluentd может начать сбор журналов.

docekr restart efk-fluentd

Использовать с SpringBoot

На самом деле, принцип сбора журналов Fluentd такой же, как и у Logstash: он собирает журналы через порт tcp, поэтому нам нужно только изменить исходный порт адреса сбора журналов Logstash в файле конфигурации logback на порт Fluentd.

  • Исправлятьlogback-spring.xmlконфигурационный файл;
<!--DEBUG日志输出到LogStash-->
<appender name="LOG_STASH_DEBUG" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>${LOG_STASH_HOST}:24221</destination>
</appender>

<!--ERROR日志输出到LogStash-->
<appender name="LOG_STASH_ERROR" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>${LOG_STASH_HOST}:24222</destination>
</appender>

<!--业务日志输出到LogStash-->
<appender name="LOG_STASH_BUSINESS" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>${LOG_STASH_HOST}:24223</destination>
</appender>

<!--接口访问记录日志输出到LogStash-->
<appender name="LOG_STASH_RECORD" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>${LOG_STASH_HOST}:24224</destination>
</appender>
  • Если ваш Fluentd не развернут на исходном сервере Logstash, вам также необходимо изменитьapplication-dev.ymlв конфигурацииlogstash.hostАтрибуты.
logstash:
  host: localhost
  • Получите наше приложение SpringBoot и запустите его.

Просмотр журналов в Кибане

На данный момент наша система сбора журналов EFK завершена, и ее нужно использовать только в Kibana.

  • существуетManagement->Kibana->Index Patternsможно создать вIndex Patterns, Адрес доступа к сервису Kibana:http://192.168.3.101:5601

  • Проверьте журнал после завершения создания, вы увидите, что функция сбора журнала точно такая же, как и в системе ELK, которую мы создали ранее.

Logstash vs Fluentd

Далее давайте сравним различные аспекты двух инструментов сбора журналов.

Контраст Logstash Fluentd
использование памяти Начало около 1G Старт около 60м
использование процессора выше ниже
Поддержка плагинов Богатый Богатый
Общий разбор журнала Поддержка синтаксического анализа grok (на основе регулярных выражений) Поддержка разбора регулярных выражений
определенный тип журнала Поддержка основных форматов, таких как JSON Поддержка основных форматов, таких как JSON
Фильтрация данных служба поддержки служба поддержки
отправка буфера данных Поддержка плагинов Поддержка плагинов
Рабочая среда Реализация JRuby, зависящая от среды JVM CRuby, реализация C, зависит от среды Ruby
поддержка резьбы Поддержка многопоточности Многопоточность ограничена GIL

использованная литература

Официальная документация:docs.fluentd.org/

Адрес исходного кода проекта

GitHub.com/macro-positive/…

публика

проект торгового центраПолный набор учебных пособий сериализуется,Обратите внимание на публичный аккаунтПолучите это прямо сейчас.

公众号图片