Ներածություն
Մեկ այլ համակարգ տեղակայելիս մենք բախվեցինք մեծ թվով տարբեր տեղեկամատյանների մշակման անհրաժեշտության հետ: Որպես գործիք ընտրվել է ELK-ը։ Այս հոդվածը կքննարկի այս բուրգը կարգավորելու մեր փորձը:
Մենք նպատակ չենք դնում նկարագրել նրա բոլոր հնարավորությունները, այլ ցանկանում ենք կենտրոնանալ գործնական խնդիրների լուծման վրա։ Դա պայմանավորված է նրանով, որ բավականաչափ մեծ քանակությամբ փաստաթղթերով և պատրաստի պատկերներով, որոգայթները շատ են, համենայնդեպս, մենք գտանք դրանք:
Մենք տեղադրեցինք ստեկը docker-compose-ի միջոցով: Ավելին, մենք ունեինք լավ գրված docker-compose.yml, որը թույլ էր տալիս մեզ բարձրացնել stack-ը գրեթե առանց խնդիրների: Եվ մեզ թվում էր, թե հաղթանակն արդեն մոտ է, հիմա մենք այն մի փոքր կշրջենք մեր կարիքներին համապատասխան և վերջ։
Ցավոք, մեր հավելվածից տեղեկամատյանները ստանալու և մշակելու համար համակարգը կարգավորելու փորձն անմիջապես չհաջողվեց: Ուստի որոշեցինք, որ արժե ուսումնասիրել յուրաքանչյուր բաղադրիչ առանձին, իսկ հետո վերադառնալ դրանց կապերին։
Այսպիսով, եկեք սկսենք logstash-ից:
Շրջակա միջավայր, տեղակայում, Logstash-ի գործարկում կոնտեյներով
Տեղակայման համար մենք օգտագործում ենք docker-compose-ը, այստեղ նկարագրված փորձերն իրականացվել են MacOS-ի և Ubuntu 18.0.4-ի վրա:
logstash պատկերը, որը մենք ունեինք մեր սկզբնական docker-compose.yml-ում, դա docker.elastic.co/logstash/logstash:6.3.2 է:
Մենք այն կօգտագործենք փորձերի համար։
Logstash-ը գործարկելու համար մենք գրել ենք առանձին docker-compose.yml: Իհարկե, հնարավոր էր պատկերը գործարկել հրամանի տողից, բայց, ի վերջո, մենք լուծեցինք կոնկրետ խնդիր, որտեղ մեզ համար գործարկվում է ամեն ինչ docker-compose-ից։
Հակիրճ կոնֆիգուրացիայի ֆայլերի մասին
Ինչպես հետևում է նկարագրությունից, logstash-ը կարող է գործարկվել ինչպես մեկ ալիքի համար, այս դեպքում այն պետք է փոխանցի *.conf ֆայլը կամ մի քանի ալիքների համար, որի դեպքում պետք է փոխանցի pipelines.yml ֆայլը, որն էլ իր հերթին։ , կվերաբերի .conf ֆայլերին յուրաքանչյուր ալիքի համար:
Մենք բռնեցինք երկրորդ ճանապարհը. Այն մեզ թվում էր ավելի բազմակողմանի և մասշտաբային: Հետևաբար, մենք ստեղծեցինք pipelines.yml և պատրաստեցինք pipelines գրացուցակ, որտեղ մենք կտեղադրենք .conf ֆայլեր յուրաքանչյուր ալիքի համար:
Կոնտեյների ներսում կա մեկ այլ կազմաձևման ֆայլ՝ logstash.yml: Մենք դրան չենք դիպչում, օգտագործում ենք այնպես, ինչպես կա։
Այսպիսով, մեր գրացուցակի կառուցվածքը հետևյալն է.
Առայժմ մենք ենթադրում ենք, որ սա tcp է 5046 նավահանգստում մուտքային տվյալներ ստանալու համար, և մենք կօգտագործենք 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
Ի՞նչ ենք մենք տեսնում այստեղ:
- Ցանցերն ու ծավալները վերցվել են սկզբնական docker-compose.yml-ից (այն, որտեղ գործարկվել է ամբողջ փաթեթը) և կարծում եմ, որ դրանք մեծապես չեն ազդում այստեղի ընդհանուր պատկերի վրա:
- Մենք ստեղծում ենք մեկ ծառայության (ծառայությունների) logstash՝ docker.elastic.co/logstash/logstash:6.3.2 պատկերից և տալիս ենք logstash_one_channel անունը:
- Մենք տեղափոխում ենք 5046 նավահանգիստը կոնտեյների ներսում, նույն ներքին պորտին:
- Մենք քարտեզագրում ենք մեր ./config/pipelines.yml խողովակի կազմաձևման ֆայլը բեռնարկղի ներսում գտնվող /usr/share/logstash/config/pipelines.yml ֆայլին, որտեղ logstash-ը կվերցնի այն և կդարձնի միայն կարդալու, ամեն դեպքում:
- Մենք քարտեզագրում ենք ./config/pipelines գրացուցակը, որտեղ ունենք խողովակների կազմաձևման ֆայլերը, /usr/share/logstash/config/pipelines գրացուցակում և նաև դարձնում այն միայն կարդալու համար:
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
Եվ մենք տեսնում ենք պատասխանը կոնտեյների վահանակում.
Բայց միևնույն ժամանակ մենք նաև տեսնում ենք.
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-ում: Խնդրում ենք տեղադրել X-Pack-ը Elasticsearch-ում՝ մոնիտորինգի գործառույթն օգտագործելու համար: Այլ գործառույթներ կարող են հասանելի լինել:
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][INFO ][logstash.outputs.elasticsearch] Աշխատում է առողջության ստուգում՝ տեսնելու, թե արդյոք Elasticsearch կապն աշխատում է {:healthcheck_url=>http://elasticsearch:9200/, :path=> «/»}
logstash_one_channel | [2019-04-29T11:29:04,487][ԶԳՈՒՇԱՑՈՒՄ ][logstash.outputs.elasticsearch] Փորձել է վերականգնել կապը մահացած ES օրինակի հետ, սակայն սխալ է ստացել: {:url=>"
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] Աշխատում է առողջության ստուգում՝ տեսնելու, թե արդյոք Elasticsearch կապն աշխատում է {:healthcheck_url=>http://elasticsearch:9200/, :path=> «/»}
logstash_one_channel | [2019-04-29T11:29:04,710][ԶԳՈՒՇԱՑՈՒՄ ][logstash.licensechecker.licensereader] Փորձել է վերականգնել կապը մահացած ES օրինակի հետ, սակայն սխալ է ստացել: {:url=>"
Եվ մեր գերանը անընդհատ սողում է վերև։
Այստեղ ես կանաչ գույնով ընդգծեցի հաղորդագրությունը, որ խողովակաշարը հաջողությամբ սկսվել է, կարմիրով` սխալի հաղորդագրությունը և դեղինով` կապվելու փորձի մասին հաղորդագրությունը:
Դա տեղի է ունենում այն պատճառով, որ պատկերում ներառված logstash.conf-ում ստուգվում է elasticsearch-ի առկայությունը: Ի վերջո, logstash-ը ենթադրում է, որ այն աշխատում է որպես Elk stack-ի մաս, և մենք այն առանձնացրել ենք:
Դուք կարող եք աշխատել, բայց դա հարմար չէ:
Լուծումը այս ստուգումն անջատելն է 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 ֆայլին, տեսնենք, թե ինչ կարող ենք ստանալ մեկ ալիքով աշխատելով։
Պետք է ասեմ, որ ալիքի կազմաձևման ֆայլի հետ աշխատելու ընդհանուր սկզբունքը լավ նկարագրված է պաշտոնական ձեռնարկում, այստեղ
Եթե ցանկանում եք կարդալ ռուսերեն, ապա մենք օգտագործել ենք այս մեկը
Հաջորդաբար անցնենք Input բաժնից։ Մենք արդեն տեսել ենք աշխատանքը tcp-ում։ Էլ ի՞նչը կարող է հետաքրքիր լինել այստեղ:
Թեստային հաղորդագրություններ՝ օգտագործելով սրտի բաբախյունը
Ավտոմատ թեստային հաղորդագրություններ ստեղծելու այսպիսի հետաքրքիր հնարավորություն կա։
Դա անելու համար անհրաժեշտ է ներածման բաժնում ներառել heartbean plugin-ը:
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, այսինքն. կարդում է նոր տողեր կամ, ըստ ցանկության, կարդում է ամբողջ ֆայլը:
Այսպիսով, այն, ինչ մենք ուզում ենք ստանալ.
- Մենք ցանկանում ենք ստանալ տողեր, որոնք կցվում են մեկ log ֆայլին:
- Մենք ցանկանում ենք ստանալ տվյալներ, որոնք գրված են մի քանի log ֆայլերում՝ միաժամանակ կարողանալով առանձնացնել այն, ինչ ստացվել է որտեղից:
- Մենք ցանկանում ենք համոզվել, որ երբ logstash-ը վերագործարկվի, այն այլևս չի ստանա այս տվյալները:
- Մենք ուզում ենք ստուգել, որ եթե 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 կոնտեյները հեռացվի (docker stop logstash_one_channel && docker rm logstash_one_channel), ոչինչ չի վերցվի: Ֆայլի դիրքը, մինչև այն կարդացվել է, պահվում էր տարայի ներսում: Եթե դուք սկսում եք զրոյից, ապա այն կընդունի միայն նոր տողեր:
Գոյություն ունեցող ֆայլերի ընթերցում
Ենթադրենք, մենք առաջին անգամ ենք գործարկում logstash-ը, բայց մենք արդեն ունենք տեղեկամատյաններ և կցանկանայինք մշակել դրանք:
Եթե մենք գործարկենք logstash-ը վերևում օգտագործված մուտքագրման բաժնում, մենք ոչինչ չենք ստանա: Միայն նոր տողերը կմշակվեն logstash-ի կողմից:
Գոյություն ունեցող ֆայլերից տողեր հանելու համար մուտքագրման բաժնում ավելացրեք լրացուցիչ տող.
input {
file {
start_position => "beginning"
path => "/usr/share/logstash/input/*.log"
}
}
Ավելին, կա մի նրբերանգ, սա ազդում է միայն նոր ֆայլերի վրա, որոնք logstash-ը դեռ չի տեսել։ Նույն ֆայլերի համար, որոնք արդեն գտնվում էին logstash-ի տեսադաշտում, այն արդեն հիշել է դրանց չափը և այժմ դրանցում կվերցնի միայն նոր գրառումներ:
Սրա վրա կանգ առնենք՝ ուսումնասիրելով մուտքագրման բաժինը։ Կան շատ ավելի շատ տարբերակներ, բայց առայժմ մենք բավականաչափ ունենք հետագա փորձերի համար:
Ուղղորդում և տվյալների փոխակերպում
Փորձենք լուծել հետևյալ խնդիրը, ասենք, ունենք հաղորդագրություններ մեկ ալիքից, որոնցից մի քանիսը տեղեկատվական են, իսկ որոշները սխալի հաղորդագրություններ են։ Նրանք տարբերվում են պիտակով: Ոմանք INFO են, մյուսները՝ ERROR:
Մենք պետք է դրանք առանձնացնենք ելքի մոտ: Նրանք. Մենք գրում ենք տեղեկատվական հաղորդագրություններ մի ալիքում, իսկ սխալի հաղորդագրությունները մեկ այլ ալիքում:
Դա անելու համար մուտքագրման բաժնից անցեք զտիչ և ելք:
Օգտագործելով ֆիլտրի բաժինը՝ մենք կվերլուծենք մուտքային հաղորդագրությունը՝ դրանից ստանալով հեշ (բանալին-արժեք զույգեր), որի հետ արդեն կարող ենք աշխատել, այսինքն. վերլուծել ըստ պայմանների. Իսկ ելքային բաժնում մենք կընտրենք հաղորդագրությունները և կուղարկենք յուրաքանչյուրը իր ալիքին։
Հաղորդագրության վերլուծություն grok-ի հետ
Տեքստային տողերը վերլուծելու և դրանցից դաշտերի հավաքածու ստանալու համար զտիչ բաժնում կա հատուկ փլագին՝ grok:
Առանց ինքս ինձ նպատակ դնելու այստեղ դրա մանրամասն նկարագրությունը տալու (սրա համար ես վերաբերում եմ
Դա անելու համար դուք պետք է որոշեք մուտքագրման գծերի ձևաչափը: Ես ունեմ դրանք այսպիսին.
1 ՏԵՂԵԿԱՏՎԱԿԱՆ հաղորդագրություն1
2 ՍԽԱԼ հաղորդագրություն 2
Նրանք. Սկզբում նույնացուցիչ, հետո INFO/ERROR, հետո մի բառ առանց բացատների:
Դժվար չէ, բայց բավական է աշխատանքի սկզբունքը հասկանալու համար։
Այսպիսով, ֆիլտրի բաժնում, grok plugin-ում, մենք պետք է սահմանենք օրինաչափություն մեր տողերի վերլուծության համար:
Այն այսպիսի տեսք կունենա.
filter {
grok {
match => { "message" => ["%{INT:message_id} %{LOGLEVEL:message_type} %{WORD:message_text}"] }
}
}
Հիմնականում դա սովորական արտահայտություն է: Օգտագործվում են պատրաստի նախշեր, ինչպիսիք են INT, LOGLEVEL, WORD: Նրանց նկարագրությունը, ինչպես նաև այլ օրինաչափություններ, կարելի է դիտել այստեղ։
Այժմ, անցնելով այս ֆիլտրով, մեր տողը կվերածվի երեք դաշտերի հեշի՝ message_id, message_type, message_text:
Դրանք կցուցադրվեն ելքային բաժնում:
Հաղորդագրությունների ուղղորդում ելքային բաժնում if հրամանով
Արդյունք բաժնում, ինչպես հիշում ենք, մենք պատրաստվում էինք հաղորդագրությունները բաժանել երկու հոսքի: Որոշները, որոնք iNFO-ն են, մենք կթողարկենք կոնսոլ, իսկ սխալների դեպքում մենք կթողարկենք ֆայլ:
Ինչպե՞ս կարող ենք կիսվել այս հաղորդագրություններով: Խնդրի վիճակն արդեն լուծում է հուշում. ի վերջո, մենք արդեն ունենք հատուկ message_type դաշտ, որը կարող է ընդունել ընդամենը երկու արժեք՝ 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
Սկսում ենք, փորձում ենք, տեսնում ենք բաժանումը երկու հոսքերի։
Source: www.habr.com