ELK-ийн практик хэрэглээ. Бүртгэлийн бүртгэлийг тохируулж байна

Танилцуулга

Өөр системийг ашиглах явцад бид олон тооны янз бүрийн бүртгэлийг боловсруулах шаардлагатай тулгарсан. Хэрэгслээр ELK сонгосон. Энэ нийтлэлд энэ стекийг тохируулах талаархи бидний туршлагын талаар ярих болно.

Бид түүний бүх чадавхийг тодорхойлох зорилго тавиагүй ч практик асуудлыг шийдвэрлэхэд анхаарлаа төвлөрүүлэхийг хүсч байна. Энэ нь хангалттай их хэмжээний баримт бичиг, бэлэн зурагтай бол маш олон бэрхшээл байдаг, ядаж бид тэдгээрийг олсонтой холбоотой юм.

Бид docker-compose-ээр дамжуулан стекийг байршуулсан. Түүгээр ч зогсохгүй бидэнд сайн бичигдсэн docker-compose.yml байсан бөгөөд энэ нь бидэнд стекийг ямар ч асуудалгүйгээр өсгөх боломжийг олгосон. Бидэнд ялалт аль хэдийн ойрхон байгаа юм шиг санагдаж байсан, одоо бид үүнийг хэрэгцээнд нийцүүлэн бага зэрэг эргүүлэх болно, тэгээд л болоо.

Харамсалтай нь манай програмын бүртгэлийг хүлээн авч, боловсруулахын тулд системийг тохируулах оролдлого амжилттай болсонгүй. Тиймээс бид бүрэлдэхүүн хэсэг бүрийг тусад нь судалж, дараа нь тэдгээрийн холболт руу буцах нь зүйтэй гэж шийдсэн.

Тиймээс logstash-аас эхэлье.

Хүрээлэн буй орчин, байршуулалт, Logstash-ийг саванд ажиллуулах

Байршуулахын тулд бид docker-compose ашигладаг, энд тайлбарласан туршилтуудыг MacOS болон Ubuntu 18.0.4 дээр хийсэн.

Бидний анхны docker-compose.yml-д байсан logstash дүрс нь docker.elastic.co/logstash/logstash:6.3.2 юм.

Бид үүнийг туршилтанд ашиглах болно.

Logstash-ийг ажиллуулахын тулд бид тусдаа docker-compose.yml бичсэн. Мэдээжийн хэрэг, командын мөрөөс зургийг эхлүүлэх боломжтой байсан, гэхдээ эцсийн эцэст бид docker-compose-аас эхлээд бүх зүйлийг эхлүүлсэн тодорхой даалгаврыг шийдсэн.

Тохиргооны файлуудын талаар товчхон

Тодорхойлолтоос харахад logstash-ийг нэг суваг шиг ажиллуулж болох бөгөөд энэ тохиолдолд *.conf файл эсвэл хэд хэдэн суваг дамжуулах шаардлагатай бөгөөд энэ тохиолдолд pipelines.yml файлыг шилжүүлэх шаардлагатай бөгөөд энэ нь эргээд , суваг тус бүрийн .conf файлуудыг заана.
Бид хоёр дахь замыг сонгосон. Энэ нь бидэнд илүү уян хатан, өргөн цар хүрээтэй мэт санагдсан. Тиймээс бид pipelines.yml-г үүсгэн, суваг тус бүрийн .conf файлуудыг байрлуулах хоолойн лавлах үүсгэсэн.

Контейнер дотор өөр тохиргооны файл байдаг - logstash.yml. Бид түүнд хүрэхгүй, байгаагаар нь ашигладаг.

Тиймээс манай лавлах бүтэц нь:

ELK-ийн практик хэрэглээ. Бүртгэлийн бүртгэлийг тохируулж байна

Одоогоор бид оролтын өгөгдлийг хүлээн авахын тулд 5046 порт дээрх tcp гэж таамаглаж байгаа бөгөөд бид гаралтад stdout ашиглах болно.

Эхний ээлжинд ийм энгийн тохиргоо энд байна. Учир нь эхний ажил бол хөөргөх явдал юм.

Тэгэхээр бидэнд энэ docker-compose.yml байна

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      	- elk
    ports:
      	- 5046:5046
    volumes:
      	- ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
	- ./config/pipelines:/usr/share/logstash/config/pipelines:ro

Бид энд юу харж байна вэ?

  1. Сүлжээнүүд болон ботьуудыг анхны docker-compose.yml (бүхэл бүтэн стек ажиллуулдаг)-аас авсан бөгөөд энэ нь ерөнхий дүр зурагт тийм ч их нөлөөлөхгүй гэж би бодож байна.
  2. Бид docker.elastic.co/logstash/logstash:6.3.2 зургаас нэг үйлчилгээ (үйлчилгээ) үүсгэж, түүнд logstash_one_channel гэсэн нэр өгдөг.
  3. Бид чингэлэг доторх 5046 портыг ижил дотоод порт руу дамжуулж байна.
  4. Бид ./config/pipelines.yml хоолойн тохиргооны файлыг чингэлэг доторх /usr/share/logstash/config/pipelines.yml файл руу буулгах ба тэндээс logstash үүнийг авч, зөвхөн унших боломжтой болгоно.
  5. Бид хоолойн тохиргооны файлуудтай ./config/pipelines лавлахыг /usr/share/logstash/config/pipelines сан руу буулгаж, зөвхөн унших боломжтой болгодог.

ELK-ийн практик хэрэглээ. Бүртгэлийн бүртгэлийг тохируулж байна

piping.yml файл

- pipeline.id: HABR
  pipeline.workers: 1
  pipeline.batch.size: 1
  path.config: "./config/pipelines/habr_pipeline.conf"

Энэ нь HABR танигчтай нэг суваг болон түүний тохиргооны файлд хүрэх замыг тайлбарладаг.

Эцэст нь "./config/pipelines/habr_pipeline.conf" файл

input {
  tcp {
    port => "5046"
   }
  }
filter {
  mutate {
    add_field => [ "habra_field", "Hello Habr" ]
    }
  }
output {
  stdout {
      
    }
  }

Бид одоогоор түүний тайлбар руу орохгүй, бид ажиллуулахыг хичээх болно:

docker-compose up

Бид юу харж байна вэ?

Контейнер эхэллээ. Бид түүний ажлыг шалгаж болно:

echo '13123123123123123123123213123213' | nc localhost 5046

Мөн бид контейнер консол дээрх хариуг харж байна:

ELK-ийн практик хэрэглээ. Бүртгэлийн бүртгэлийг тохируулж байна

Гэхдээ үүнтэй зэрэгцэн бид дараахь зүйлийг харж байна.

logstash_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] Лицензийн серверээс лицензийн мэдээллийг авах боломжгүй {:message=>"Elasticsearch-д хандах боломжгүй: [http://elasticsearch:9200/][Manticore ::ResolutionFailure]elasticsearch", ...

logstash_one_channel | [2019-04-29T11:28:59,894][INFO][logstash.pipeline ] Дамжуулах хоолой амжилттай эхэллээ {:pipeline_id=>".monitoring-logstash", :thread=>"# »}

logstash_one_channel | [2019-04-29T11:28:59,988][INFO ][logstash.agent ] Ажиллаж байгаа дамжуулах хоолой {:count=>2, :running_pipelines=>[:HABR, :".monitoring-logstash"], :non_running_pipelines=>[ ]}
logstash_one_channel | [2019-04-29T11:29:00,015][ERROR][logstash.inputs.metrics ] X-Pack нь Logstash дээр суулгасан боловч Elasticsearch дээр суулгаагүй. Хяналтын функцийг ашиглахын тулд Elasticsearch дээр X-Pack суулгана уу. Бусад боломжууд байж болно.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Logstash API төгсгөлийн цэгийг амжилттай эхлүүлсэн {:port=>9600}
logstash_one_channel | [2019-04-29T11:29:04,478][МЭДЭЭЛЭЛ ][logstash.outputs.elasticsearch] Elasticsearch холболт ажиллаж байгаа эсэхийг шалгахын тулд эрүүл мэндийн үзлэг хийж байна {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][АНХААРУУЛГА ][logstash.outputs.elasticsearch] Үхсэн ES инстанстай холболтыг сэргээх гэж оролдсон боловч алдаа гарлаа. {:url=>"эластик хайлт:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch-д хандах боломжгүй: [http://elasticsearch:9200/:][Manticore:il] elasticsearch"}
logstash_one_channel | [2019-04-29T11:29:04,704][МЭДЭЭЛЭЛ ][logstash.licensechecker.licensereader] Elasticsearch холболт ажиллаж байгаа эсэхийг шалгахын тулд эрүүл мэндийн шалгалтыг ажиллуулж байна {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,710][АНХААРУУЛГА ][logstash.licensechecker.licensereader] Үхсэн ES инстанстай холболтыг сэргээх гэж оролдсон боловч алдаа гарлаа. {:url=>"эластик хайлт:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch-д хандах боломжгүй: [http://elasticsearch:9200/:][Manticore:il] elasticsearch"}

Тэгээд манай гуалин байнга мөлхөж байдаг.

Энд би дамжуулах хоолой амжилттай эхэлсэн гэсэн мессежийг ногоон өнгөөр, алдааны мессежийг улаанаар, холбогдохыг оролдсон тухай мессежийг шараар тодруулсан. эластик хайлт: 9200.
Энэ нь зурганд орсон logstash.conf дээр elasticsearch байгаа эсэхийг шалгасантай холбоотой юм. Эцсийн эцэст, logstash нь Elk стекийн нэг хэсэг болж ажилладаг гэж үздэг бөгөөд бид үүнийг салгасан.

Та ажиллаж болно, гэхдээ энэ нь тийм ч тохиромжтой биш юм.

Үүний шийдэл нь XPACK_MONITORING_ENABLED орчны хувьсагчаар дамжуулан энэ шалгалтыг идэвхгүй болгох явдал юм.

docker-compose.yml-д өөрчлөлт оруулаад дахин ажиллуулъя:

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      - elk
    environment:
      XPACK_MONITORING_ENABLED: "false"
    ports:
      - 5046:5046
   volumes:
      - ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
      - ./config/pipelines:/usr/share/logstash/config/pipelines:ro

Одоо бүх зүйл сайхан байна. Сав нь туршилт хийхэд бэлэн байна.

Бид зэргэлдээх консол дээр дахин бичиж болно:

echo '13123123123123123123123213123213' | nc localhost 5046

Мөн үзнэ үү:

logstash_one_channel | {
logstash_one_channel |         "message" => "13123123123123123123123213123213",
logstash_one_channel |      "@timestamp" => 2019-04-29T11:43:44.582Z,
logstash_one_channel |        "@version" => "1",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |            "host" => "gateway",
logstash_one_channel |            "port" => 49418
logstash_one_channel | }

Нэг суваг дотор ажиллах

Тиймээс бид эхэлсэн. Одоо та logstash-ийг шууд тохируулах цаг гаргаж болно. Одоохондоо pipelines.yml файлыг хөндөхгүй, нэг сувагтай ажилласнаар юу авч болохыг харцгаая.

Сувгийн тохиргооны файлтай ажиллах ерөнхий зарчмыг энд албан ёсны гарын авлагад сайн тайлбарласан гэж би хэлэх ёстой энд
Хэрэв та орос хэл дээр уншихыг хүсч байвал бид үүнийг ашигласан нийтлэл(гэхдээ асуулгын синтакс тэнд хуучин байгаа тул та үүнийг анхаарч үзэх хэрэгтэй).

Оролтын хэсгээс дараалан орцгооё. Бид tcp дээрх ажлыг аль хэдийн үзсэн. Энд өөр юу сонирхолтой байж болох вэ?

Зүрхний цохилтыг ашиглан мессежийг шалгана уу

Автомат туршилтын мессеж үүсгэх ийм сонирхолтой боломж бий.
Үүнийг хийхийн тулд оролтын хэсэгт heartbean залгаасыг оруулах хэрэгтэй.

input {
  heartbeat {
    message => "HeartBeat!"
   }
  } 

Бид үүнийг асааж, минут тутамд нэг удаа хүлээн авч эхэлдэг

logstash_one_channel | {
logstash_one_channel |      "@timestamp" => 2019-04-29T13:52:04.567Z,
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |         "message" => "HeartBeat!",
logstash_one_channel |        "@version" => "1",
logstash_one_channel |            "host" => "a0667e5c57ec"
logstash_one_channel | }

Бид илүү олон удаа хүлээн авахыг хүсч байгаа тул интервалын параметрийг нэмэх хэрэгтэй.
Ингэж бид 10 секунд тутамд мессеж хүлээн авах болно.

input {
  heartbeat {
    message => "HeartBeat!"
    interval => 10
   }
  }

Файлаас өгөгдөл авч байна

Бид мөн файлын горимыг харахаар шийдсэн. Хэрэв энэ нь файлтай сайн ажилладаг бол ядаж орон нутгийн хэрэглээнд зориулж агент шаардлагагүй байж магадгүй юм.

Тайлбарын дагуу үйл ажиллагааны горим нь сүүлтэй төстэй байх ёстой -f, i.e. шинэ мөрүүдийг унших эсвэл сонголтоор файлыг бүхэлд нь уншина.

Тэгэхээр бид юу авахыг хүсч байна:

  1. Бид нэг бүртгэлийн файлд хавсаргасан мөрүүдийг хүлээн авахыг хүсч байна.
  2. Бид хэд хэдэн бүртгэлийн файлд бичигдсэн өгөгдлийг хүлээн авахын зэрэгцээ хаанаас хүлээн авсаныг нь салгах боломжтой байхыг хүсч байна.
  3. Бид logstash-ийг дахин эхлүүлэх үед энэ өгөгдлийг дахин хүлээж авахгүй гэдэгт итгэлтэй байхыг хүсч байна.
  4. Хэрэв logstash идэвхгүй болсон бөгөөд өгөгдлийг файлууд руу үргэлжлүүлэн бичвэл бид үүнийг ажиллуулах үед энэ өгөгдлийг хүлээн авах болно гэдгийг шалгахыг хүсч байна.

Туршилтыг хийхийн тулд docker-compose.yml-д дахин нэг мөр нэмж, файлуудаа байршуулах директороо нээцгээе.

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      - elk
    environment:
      XPACK_MONITORING_ENABLED: "false"
    ports:
      - 5046:5046
   volumes:
      - ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
      - ./config/pipelines:/usr/share/logstash/config/pipelines:ro
      - ./logs:/usr/share/logstash/input

Мөн habr_pipeline.conf дахь оролтын хэсгийг өөрчил

input {
  file {
    path => "/usr/share/logstash/input/*.log"
   }
  }

Бид эхлэх:

docker-compose up

Лог файл үүсгэх, бичихийн тулд бид дараах тушаалыг ашиглана.


echo '1' >> logs/number1.log

{
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:28:53.876Z,
logstash_one_channel |        "@version" => "1",
logstash_one_channel |         "message" => "1",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number1.log"
logstash_one_channel | }

Тийм ээ, энэ нь ажилладаг!

Үүний зэрэгцээ бид замын талбарыг автоматаар нэмсэн болохыг бид харж байна. Тиймээс цаашид бид үүгээр бичлэгийг шүүж авах боломжтой.

Дахин оролдоод үзье:

echo '2' >> logs/number1.log

{
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:28:59.906Z,
logstash_one_channel |        "@version" => "1",
logstash_one_channel |         "message" => "2",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number1.log"
logstash_one_channel | }

Одоо өөр файл руу:

 echo '1' >> logs/number2.log

{
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:29:26.061Z,
logstash_one_channel |        "@version" => "1",
logstash_one_channel |         "message" => "1",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number2.log"
logstash_one_channel | }

Агуу их! Файлыг авсан, замыг зөв зааж өгсөн, бүх зүйл хэвийн байна.

Logstash-ыг зогсоож, дахин эхлүүлнэ үү. Хүлээцгээе. Чимээгүй. Тэдгээр. Бид эдгээр бүртгэлийг дахин хүлээж авахгүй.

Одоо хамгийн зоригтой туршилт.

Бид logstash-ийг тавиад гүйцэтгэнэ:

echo '3' >> logs/number2.log
echo '4' >> logs/number1.log

Logstash-ийг дахин ажиллуулаад харна уу:

logstash_one_channel | {
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |         "message" => "3",
logstash_one_channel |        "@version" => "1",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number2.log",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:48:50.589Z
logstash_one_channel | }
logstash_one_channel | {
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |         "message" => "4",
logstash_one_channel |        "@version" => "1",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number1.log",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:48:50.856Z
logstash_one_channel | }

Өө! Бүгдийг нь авлаа.

Гэхдээ дараахь зүйлийг анхааруулах хэрэгтэй. Хэрэв logstash савыг устгавал (докер зогсоол logstash_one_channel && docker rm logstash_one_channel) юу ч авахгүй. Уншсан файлын байрлалыг чингэлэг дотор хадгалсан. Хэрэв та эхнээс нь эхлэх юм бол энэ нь зөвхөн шинэ мөрүүдийг хүлээн авах болно.

Одоо байгаа файлуудыг уншиж байна

Бид анх удаа logstash ажиллуулж байна гэж бодъё, гэхдээ бидэнд бүртгэлүүд байгаа бөгөөд тэдгээрийг боловсруулахыг хүсч байна.
Хэрэв бид дээр ашигласан оролтын хэсэгтэй logstash-ийг ажиллуулбал бид юу ч авахгүй. Зөвхөн шинэ мөрүүдийг logstash боловсруулна.

Одоо байгаа файлуудаас мөр татахын тулд оролтын хэсэгт нэмэлт мөр нэмнэ үү.

input {
  file {
    start_position => "beginning"
    path => "/usr/share/logstash/input/*.log"
   }
  }

Түүгээр ч барахгүй нэг нюанс бий, энэ нь зөвхөн logstash хараахан үзээгүй шинэ файлуудад л нөлөөлдөг. Logstash-ийн харагдах талбарт байсан ижил файлуудын хувьд энэ нь тэдний хэмжээг аль хэдийн санаж байгаа бөгөөд одоо зөвхөн шинэ бичлэгүүдийг авах болно.

Оролтын хэсгийг судлах замаар үүнийг зогсооё. Өөр олон сонголт байгаа ч одоохондоо бид цаашдын туршилт хийхэд хангалттай.

Чиглүүлэлт ба өгөгдлийг хувиргах

Дараах асуудлыг шийдэхийг хичээцгээе, нэг сувгийн мессежүүд байна гэж бодъё, тэдгээрийн зарим нь мэдээллийн шинжтэй, зарим нь алдааны мессежүүд байна. Тэд шошгон дээр ялгаатай. Зарим нь МЭДЭЭЛЭЛ, зарим нь АЛДАА.

Бид тэднийг гарц дээр салгах хэрэгтэй. Тэдгээр. Бид нэг сувагт мэдээллийн мессеж, нөгөө сувагт алдааны мессеж бичдэг.

Үүнийг хийхийн тулд оролтын хэсгээс шүүж, гаргана.

Шүүлтүүрийн хэсгийг ашиглан бид ирж буй мессежийг задлан шинжилж, үүнээс хэш (түлхүүр утгын хос) авах бөгөөд үүнтэй аль хэдийн ажиллах боломжтой болно. нөхцөлийн дагуу задлан шинжилнэ. Мөн гаралтын хэсэгт бид мессежийг сонгож, тус бүрийг өөрийн суваг руу илгээх болно.

Grok ашиглан мессежийг задлан шинжилж байна

Текстийн мөрүүдийг задлан шинжилж, тэдгээрээс олон талбар авахын тулд шүүлтүүр хэсэгт тусгай залгаас байдаг - grok.

Өөртөө энэ талаар дэлгэрэнгүй тайлбар өгөх зорилго тавиагүйгээр (үүнийг би энд дурдлаа албан ёсны баримт бичиг), Би энгийн жишээ хэлье.

Үүнийг хийхийн тулд та оролтын мөрүүдийн форматыг шийдэх хэрэгтэй. Надад ийм байна:

1 МЭДЭЭЛЭЛИЙН мессеж1
2 АЛДААНЫ мессеж2

Тэдгээр. Эхлээд танигч, дараа нь INFO/ERROR, дараа нь хоосон зайгүй зарим үг.
Хэцүү биш, гэхдээ ажлын зарчмыг ойлгоход хангалттай.

Тиймээс, шүүлтүүрийн хэсэгт, grok залгаас дээр бид мөрүүдийг задлан шинжлэх загварыг тодорхойлох хэрэгтэй.

Энэ нь дараах байдлаар харагдах болно.

filter {
  grok {
    match => { "message" => ["%{INT:message_id} %{LOGLEVEL:message_type} %{WORD:message_text}"] }
   }
  } 

Үндсэндээ энэ нь тогтмол илэрхийлэл юм. INT, LOGLEVEL, WORD гэх мэт бэлэн загваруудыг ашигладаг. Тэдний тайлбар болон бусад хэв маягийг эндээс харж болно. энд

Одоо энэ шүүлтүүрээр дамжин өнгөрөхөд бидний мөр гурван талбарын хэш болж хувирна: message_id, мессежийн_төрөл, мессежийн_текст.

Тэдгээрийг гаралтын хэсэгт харуулах болно.

If командын тусламжтайгаар гаралтын хэсэг дэх мессежүүдийг чиглүүлэх

Гаралтын хэсэгт, бидний санаж байгаагаар бид мессежийг хоёр урсгал болгон хуваах болно. Зарим нь - iNFO, бид консол руу гаргах бөгөөд алдаа гарвал файл руу гаргана.

Бид эдгээр мессежийг хэрхэн хуваалцах вэ? Асуудлын нөхцөл нь аль хэдийн шийдлийг санал болгож байна - эцэст нь бидэнд зөвхөн INFO болон ERROR гэсэн хоёр утгыг авах боломжтой мессежийн төрөл талбар аль хэдийн бий болсон. Үүн дээр бид if хэллэгийг ашиглан сонголт хийх болно.

if [message_type] == "ERROR" {
        # Здесь выводим в файл
       } else
     {
      # Здесь выводим в stdout
    }

Талбай болон операторуудтай хийсэн ажлын тайлбарыг энэ хэсгээс олж болно албан ёсны гарын авлага.

Одоо дүгнэлтийн талаар.

Консолын гаралт, энд бүх зүйл тодорхой байна - stdout {}

Гэхдээ файлын гаралт - бид энэ бүгдийг контейнерээс ажиллуулж байгаа бөгөөд үр дүнг бичиж буй файлаа гаднаас нь авах боломжтой байхын тулд бид энэ санг docker-compose.yml дээр нээх хэрэгтэй гэдгийг санаарай.

Нийт:

Манай файлын гаралтын хэсэг дараах байдалтай байна.


output {
  if [message_type] == "ERROR" {
    file {
          path => "/usr/share/logstash/output/test.log"
          codec => line { format => "custom format: %{message}"}
         }
    } else
     {stdout {
             }
     }
  }

Гаралт хийхийн тулд docker-compose.yml-д дахин нэг боть нэмнэ үү:

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      - elk
    environment:
      XPACK_MONITORING_ENABLED: "false"
    ports:
      - 5046:5046
   volumes:
      - ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
      - ./config/pipelines:/usr/share/logstash/config/pipelines:ro
      - ./logs:/usr/share/logstash/input
      - ./output:/usr/share/logstash/output

Бид эхэлж, хичээж, хоёр урсгалд хуваагдахыг бид харж байна.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх