ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π Π°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΡ Π»ΠΎΠ³ΠΎΠ². Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π²ΡΠ±ΡΠ°Π»ΠΈ ELK. Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΏΠΎΠΉΠ΄ΡΡ ΡΠ΅ΡΡ ΠΎ Π½Π°ΡΠ΅ΠΌ ΠΎΠΏΡΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅ΠΊΠ°.
ΠΠ΅ ΡΡΠ°Π²ΠΈΠΌ ΡΠ΅Π»ΠΈ ΠΎΠΏΠΈΡΠ°ΡΡ Π²ΡΠ΅ Π΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π½ΠΎ Ρ
ΠΎΡΠΈΠΌ ΡΠΊΠΎΠ½ΡΠ΅Π½ΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ
Π·Π°Π΄Π°Ρ. ΠΡΠ·Π²Π°Π½ΠΎ ΡΡΠΎ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΡ
ΠΎΠ±ΡΠ°Π·ΠΎΠ², ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΡ
ΠΊΠ°ΠΌΠ½Π΅ΠΉ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Ρ Π½Π°Ρ ΠΎΠ½ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈΡΡ.
ΠΡ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π»ΠΈ ΡΡΠ΅ΠΊ ΡΠ΅ΡΠ΅Π· docker-compose. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Ρ Π½Π°Ρ Π±ΡΠ» Ρ
ΠΎΡΠΎΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ docker-compose.yml, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π½Π°ΠΌ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΠ΄Π½ΡΡΡ ΡΡΠ΅ΠΊ. Π Π½Π°ΠΌ ΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ ΠΏΠΎΠ±Π΅Π΄Π° ΡΠΆΠ΅ Π±Π»ΠΈΠ·ΠΊΠ°, ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡΡΡΠΈΠΌ ΠΏΠΎΠ΄ ΡΠ²ΠΎΠΈ Π½ΡΠΆΠ΄Ρ ΠΈ Π²ΡΡ.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠΏΡΡΠΊΠ° Π΄ΠΎΠ½Π°ΡΡΡΠΎΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π»ΠΎΠ³ΠΎΠ² ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Ρ Ρ ΠΎΠ΄Ρ Π½Π΅ ΡΠ²Π΅Π½ΡΠ°Π»Π°ΡΡ ΡΡΠΏΠ΅Ρ ΠΎΠΌ. ΠΠΎΡΡΠΎΠΌΡ, ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ ΡΡΠΎΠΈΡ ΠΈΠ·ΡΡΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, Π° ΠΏΠΎΡΠΎΠΌ ΡΠΆΠ΅ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ ΠΈΡ ΡΠ²ΡΠ·ΡΠΌ.
ΠΡΠ°ΠΊ, Π½Π°ΡΠ°Π»ΠΈ Ρ 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
Π§ΡΠΎ ΠΌΡ Π·Π΄Π΅ΡΡ Π²ΠΈΠ΄ΠΈΠΌ?
- Networks ΠΈ volumes Π±ΡΠ»ΠΈ Π²Π·ΡΡΡ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ docker-compose.yml (ΡΠΎΡ Π³Π΄Π΅ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ ΡΡΠ΅ΠΊ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ) ΠΈ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠΈΠ»ΡΠ½ΠΎ Π·Π΄Π΅ΡΡ Π½Π° ΠΎΠ±ΡΡΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ Π½Π΅ Π²Π»ΠΈΡΡΡ.
- ΠΡ ΡΠΎΠ·Π΄Π°ΡΠΌ ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΠ²ΠΈΡ (services) logstash, ΠΈΠ· ΠΎΠ±ΡΠ°Π·Π° docker.elastic.co/logstash/logstash:6.3.2 ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ Π΅ΠΌΡ ΠΈΠΌΡ logstash_one_channel.
- ΠΡ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ Π²Π½ΡΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΏΠΎΡΡ 5046, Π½Π° ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΏΠΎΡΡ.
- ΠΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π½Π°Ρ ΡΠ°ΠΉΠ» Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠ°Π½Π°Π»ΠΎΠ² ./config/pipelines.yml Π½Π° ΡΠ°ΠΉΠ» /usr/share/logstash/config/pipelines.yml Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΎΡΠΊΡΠ΄Π° Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ Π²Π°ΡΠΈΡ logstash ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ Π΅Π³ΠΎ read-only, ΠΏΡΠΎΡΡΠΎ Π½Π° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ.
- ΠΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ./config/pipelines, Π³Π΄Π΅ Ρ Π½Π°Ρ Π»Π΅ΠΆΠ°Ρ ΡΠ°ΠΉΠ»Ρ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΊΠ°Π½Π°Π»ΠΎΠ², Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ /usr/share/logstash/config/pipelines ΠΈ ΡΠΎΠΆΠ΅ Π΄Π΅Π»Π°Π΅ΠΌ Π΅Ρ read-only.
Π€Π°ΠΉΠ» pipelines.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] Unable to retrieve license information from license server {:message=>Β«Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearchΒ», β¦
logstash_one_channel | [2019-04-29T11:28:59,894][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>".monitoring-logstash", :thread=>"#<Thread:0x119abb86 run>Β»}
logstash_one_channel | [2019-04-29T11:28:59,988][INFO ][logstash.agent ] Pipelines running {: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 is installed on Logstash but not on Elasticsearch. Please install X-Pack on Elasticsearch to use the monitoring feature. Other features may be available.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
logstash_one_channel | [2019-04-29T11:29:04,478][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://elasticsearch:9200/, :path=>"/"}
logstash_one_channel | [2019-04-29T11:29:04,487][WARN ][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>Β«
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://elasticsearch:9200/, :path=>"/"}
logstash_one_channel | [2019-04-29T11:29:04,710][WARN ][logstash.licensechecker.licensereader] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>Β«
Π Π½Π°Ρ Π»ΠΎΠ³ Π²ΡΡ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ»Π·ΡΡ Π²Π²Π΅ΡΡ .
ΠΠ΄Π΅ΡΡ Ρ Π²ΡΠ΄Π΅Π»ΠΈΠ» Π·Π΅Π»ΡΠ½ΡΠΌ ΡΠ²Π΅ΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ pipeline ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΠ»Π°ΡΡ, ΠΊΡΠ°ΡΠ½ΡΠΌ β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈ ΠΆΡΠ»ΡΡΠΌ β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΡΠ²ΡΠ·Π°ΡΡΡΡ Ρ
ΠΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΡΠΎ ΠΈΠ· Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π² 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, ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ, ΡΠ°Π±ΠΎΡΠ°Ρ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ.
ΠΠ°Π΄ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠΈΠΉ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΊΠ°Π½Π°Π»Π° Ρ
ΠΎΡΠΎΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅, Π²ΠΎΡ
ΠΡΠ»ΠΈ Ρ
ΠΎΡΠ΅ΡΡΡ ΠΏΠΎΡΠΈΡΠ°ΡΡ ΠΏΠΎ-ΡΡΡΡΠΊΠΈ, ΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ Π²ΠΎΡ ΡΡΠΎΠΉ
ΠΠΎΠΉΠ΄Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡ ΡΠ΅ΠΊΡΠΈΠΈ Input. Π Π°Π±ΠΎΡΡ ΠΏΠΎ tcp ΠΌΡ ΡΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ. Π§ΡΠΎ Π΅ΡΡ Π·Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ?
Π’Π΅ΡΡΠΎΠ²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ heartbeat
ΠΡΡΡ ΡΠ°ΠΊΠ°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π² input ΡΠ΅ΠΊΡΠΈΡ Π½ΡΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ 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 | }
Π₯ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΏΠΎΡΠ°ΡΠ΅, Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ interval.
ΠΠΎΡ ΡΠ°ΠΊ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ°Π· Π² 10 ΡΠ΅ΠΊΡΠ½Π΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
input {
heartbeat {
message => "HeartBeat!"
interval => 10
}
}
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π°
ΠΡΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ΅ΠΆΠΈΠΌ file. ΠΡΠ»ΠΈ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Ρ ΡΠ°ΠΉΠ»ΠΎΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ Π°Π³Π΅Π½ΡΠ° Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ, Π½Ρ Ρ ΠΎΡΡ Π±Ρ Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ, ΡΠ΅ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ tail -f, Ρ.Π΅. ΡΠΈΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΎΠΏΡΠΈΡ, ΡΠΈΡΠ°Π΅Ρ Π²Π΅ΡΡ ΡΠ°ΠΉΠ».
ΠΡΠ°ΠΊ, ΡΡΠΎ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ:
- ΠΡ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² ΠΎΠ΄ΠΈΠ½ Π»ΠΎΠ³ ΡΠ°ΠΉΠ».
- ΠΡ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π»ΠΎΠ³ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΏΡΠΈ ΡΡΠΎΠΌ, ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΡΡΠΎ ΠΎΡΠΊΡΠ΄Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ.
- ΠΡ Ρ ΠΎΡΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ΅ 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
Π ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠ΅ΠΊΡΠΈΡ 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 | }
ΠΠ³Π°, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ!
ΠΡΠΈ ΡΡΠΎΠΌ, ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΎΡΡ ΠΏΠΎΠ»Π΅ path. ΠΠ½Π°ΡΠΈΡ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ, ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎ Π½Π΅ΠΌΡ ΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΠΈΡΠΈ.
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π΅ΡΡ:
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 | }
ΠΡΠ»ΠΈΡΠ½ΠΎ! Π€Π°ΠΉΠ» ΠΏΠΎΠ΄Ρ Π²Π°ΡΠΈΠ»ΡΡ, path ΡΠΊΠ°Π·Π°Π»ΡΡ Π²Π΅ΡΠ½ΠΎ, Π²ΡΡ Ρ ΠΎΡΠΎΡΠΎ.
ΠΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ 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 Ρ ΡΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ input, ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π²ΡΡΠ΅, ΡΠΎ ΠΌΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ. Π’ΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ logstash.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΡΡΠ½ΡΠ»ΠΈΡΡ ΡΡΡΠΎΠΊΠΈ ΠΈΠ· ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² input ΡΠ΅ΠΊΡΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΡΠΎΡΠΊΡ:
input {
file {
start_position => "beginning"
path => "/usr/share/logstash/input/*.log"
}
}
ΠΡΠΈΡΡΠΌ, Π΅ΡΡΡ Π½ΡΠ°Π½Ρ, ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° Π½ΠΎΠ²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ logstash Π΅ΡΡ Π½Π΅ Π²ΠΈΠ΄Π΅Π». ΠΠ»Ρ ΡΠ΅Ρ ΠΆΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΡΠΎ ΡΠΆΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΈ Π² ΠΏΠΎΠ»Π΅ Π·ΡΠ΅Π½ΠΈΡ logstash, ΠΎΠ½ ΡΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠ» ΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ Π±ΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π² Π½ΠΈΡ .
ΠΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° ΡΡΠΎΠΌ Π½Π° ΠΈΠ·ΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅ΠΊΡΠΈΠΈ input. Π’Π°ΠΌ Π΅ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ², Π½ΠΎ Π½Π°ΠΌ, Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠΊΠ° Ρ Π²Π°ΡΠΈΡ.
ΠΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ΅ΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ Π·Π°Π΄Π°ΡΡ, Π΄ΠΎΠΏΡΡΡΠΈΠΌ Ρ Π½Π°Ρ ΠΈΠ΄ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°, ΡΠ°ΡΡΡ ΠΈΠ· Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅, Π° ΡΠ°ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ . ΠΡΠ»ΠΈΡΠ°ΡΡΡΡ ΡΠ΅Π³ΠΎΠΌ. ΠΠ΄Π½ΠΈ INFO, Π΄ΡΡΠ³ΠΈΠ΅ ERROR.
ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ ΠΈΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ. Π’.Π΅. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠΈΡΠ΅ΠΌ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π», Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ, ΠΎΡ ΡΠ΅ΠΊΡΠΈΠΈ input ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ filter ΠΈ output.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΊΡΠΈΠΈ filter ΠΌΡ ΡΠ°Π·Π±Π΅ΡΡΠΌ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡΡΠΈΠ² ΠΈΠ· Π½Π΅Π³ΠΎ hash(ΠΏΠ°ΡΡ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅), Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Ρ.Π΅. ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ. Π Π² ΡΠ΅ΠΊΡΠΈΠΈ output, ΠΎΡΠ±Π΅ΡΡΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π² ΡΠ²ΠΎΠΉ ΠΊΠ°Π½Π°Π».
Π Π°Π·Π±ΠΎΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ grok
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΈΠ· Π½ΠΈΡ Π½Π°Π±ΠΎΡ ΠΏΠΎΠ»Π΅ΠΉ, Π² ΡΠ΅ΠΊΡΠΈΠΈ filter Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ β grok.
ΠΠ΅ ΡΡΠ°Π²Ρ ΡΠ΅Π±Π΅ ΡΠ΅Π»ΡΡ Π΄Π°ΡΡ Π·Π΄Π΅ΡΡ Π΅Π³ΠΎ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ (Π·Π° ΡΡΠΈΠΌ ΠΎΡΡΡΠ»Π°Ρ ΠΊ
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ, Π½Π°Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡΡ Ρ ΡΠΎΡΠΌΠ°ΡΠΎΠΌ Π²Ρ ΠΎΠ΄Π½ΡΡ ΡΡΡΠΎΠΊ. Π£ ΠΌΠ΅Π½Ρ ΠΎΠ½ΠΈ ΡΠ°ΠΊΠΈΠ΅:
1 INFO message1
2 ERROR message2
Π’.Π΅. ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, Π·Π°ΡΠ΅ΠΌ INFO/ERROR, Π·Π°ΡΠ΅ΠΌ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΡΠ»ΠΎΠ²ΠΎ Π±Π΅Π· ΠΏΡΠΎΠ±Π΅Π»ΠΎΠ².
ΠΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° ΡΠ°Π±ΠΎΡΡ Ρ
Π²Π°ΡΠΈΡ.
ΠΡΠ°ΠΊ, Π² ΡΠ΅ΠΊΡΠΈΠΈ filter, Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ grok ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠ°ΡΡΠ΅ΡΠ½ Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° Π½Π°ΡΠΈΡ ΡΡΡΠΎΠΊ.
ΠΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊ:
filter {
grok {
match => { "message" => ["%{INT:message_id} %{LOGLEVEL:message_type} %{WORD:message_text}"] }
}
}
ΠΠΎ ΡΡΡΠΈ, ΡΡΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ INT, LOGLEVEL, WORD. ΠΡ
ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΡ
Π’Π΅ΠΏΠ΅ΡΡ, ΠΏΡΠΎΡ ΠΎΠ΄Ρ ΡΠ΅ΡΠ΅Π· ΡΡΠΎΡ ΡΠΈΠ»ΡΡΡ, Π½Π°ΡΠ° ΡΡΡΠΎΠΊΠ° ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡΡ Π² hash ΠΈΠ· ΡΡΡΡ ΠΏΠΎΠ»Π΅ΠΉ: message_id, message_type, message_text.
ΠΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠ΅ΠΊΡΠΈΠΈ output.
ΠΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΊΡΠΈΠΈ output Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ if
Π ΡΠ΅ΠΊΡΠΈΠΈ output, ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π»ΠΈΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π° Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ΄Π½ΠΈ β ΠΊΠΎΡΠΎΡΡΠ΅ iNFO, Π±ΡΠ΄Π΅ΠΌ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ, Π° Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ, Π±ΡΠ΄Π΅ΠΌ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π² ΡΠ°ΠΉΠ».
ΠΠ°ΠΊ Π½Π°ΠΌ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ? Π£ΡΠ»ΠΎΠ²ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΡΠΆΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β Ρ Π½Π°Ρ Π²Π΅Π΄Ρ Π΅ΡΡΡ ΡΠΆΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ message_type, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ INFO ΠΈ ERROR. ΠΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎ Π½Π΅ΠΌΡ ΠΈ ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠ±ΠΎΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° if.
if [message_type] == "ERROR" {
# ΠΠ΄Π΅ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ Π² ΡΠ°ΠΉΠ»
} else
{
# ΠΠ΄Π΅ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ Π² stdout
}
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠΎΠ»ΡΠΌΠΈ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΡ Π² ΡΡΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ
Π’Π΅ΠΏΠ΅ΡΡ, ΠΏΡΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°ΠΌ Π²ΡΠ²ΠΎΠ΄.
ΠΡΠ²ΠΎΠ΄ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ, Π·Π΄Π΅ΡΡ Π²ΡΡ ΠΏΠΎΠ½ΡΡΠ½ΠΎ β stdout {}
Π Π²ΠΎΡ Π²ΡΠ²ΠΎΠ΄ Π² ΡΠ°ΠΉΠ» β Π²ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ, ΡΡΠΎ ΠΌΡ ΡΡΠΎ Π²ΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ ΡΡΠΎΠ±Ρ ΡΠ°ΠΉΠ», Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π±ΡΠ» Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠ½Π°ΡΡΠΆΠΈ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΊΡΡΡΡ ΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π² docker-compose.yml.
ΠΡΠΎΠ³ΠΎ:
Π‘Π΅ΠΊΡΠΈΡ output Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π²ΠΎΡ ΡΠ°ΠΊ:
β¨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
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ, ΠΏΡΠΎΠ±ΡΠ΅ΠΌ, Π²ΠΈΠ΄ΠΈΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com