Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΄ΡΡΠ³Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°Ρ ΠΌΠ΅ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π±Π΅ΡΠ΅ ΠΈΠ·Π±ΡΠ°Π½ 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
ΠΠ°ΠΊΠ²ΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΡΡΠΊ?
- ΠΡΠ΅ΠΆΠΈΡΠ΅ ΠΈ ΡΠΎΠΌΠΎΠ²Π΅ΡΠ΅ ΡΠ° Π²Π·Π΅ΡΠΈ ΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ 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][ΠΠ ΠΠ¨ΠΠ][logstash.licensechecker.licensereader] ΠΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π»ΠΈΡΠ΅Π½Π·Π° ΠΎΡ ΡΡΡΠ²ΡΡΠ° Π·Π° Π»ΠΈΡΠ΅Π½Π·ΠΈ {:message=>"Elasticsearch Unreachable: [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][ΠΠ ΠΠ¨ΠΠ][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][ΠΠΠ€ΠΠ ΠΠΠ¦ΠΠ― ][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][ΠΠΠ€ΠΠ ΠΠΠ¦ΠΠ― ][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 ΠΈ Π½ΠΈΠ΅ Π³ΠΎ ΠΎΡΠ΄Π΅Π»ΠΈΡ
ΠΌΠ΅.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅, Π½ΠΎ Π½Π΅ Π΅ ΡΠ΄ΠΎΠ±Π½ΠΎ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π΄Π° Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ ΡΠ°Π·ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΠ΅Π· ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° 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
}
}
ΠΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΠ°ΠΉΠ»
Π Π΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈΡ ΡΠ΅ΠΆΠΈΠΌ. ΠΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π΄ΠΎΠ±ΡΠ΅ Ρ ΡΠ°ΠΉΠ»Π°, ΡΠΎΠ³Π°Π²Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π°Π³Π΅Π½Ρ, Π΄ΠΎΠ±ΡΠ΅, ΠΏΠΎΠ½Π΅ Π·Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°.
Π‘ΠΏΠΎΡΠ΅Π΄ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ΠΆΠΈΠΌΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° 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
Π ΠΏΡΠΎΠΌΠ΅Π½Π΅ΡΠ΅ ΡΠ΅ΠΊΡΠΈΡΡΠ° Π·Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π² 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, ΡΠΎΠΉ Π²Π΅ΡΠ΅ Π΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠ» ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈΠΌ ΠΈ ΡΠ΅Π³Π° ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠ°ΠΌΠΎ Π½ΠΎΠ²ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΡΡ .
ΠΠ΅ΠΊΠ° ΡΠΏΡΠ΅ΠΌ Π½Π° ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΡΠΈΡΡΠ° Π·Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅. ΠΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠΏΡΠΈΠΈ, Π½ΠΎ Π·Π°ΡΠ΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π·Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ.
ΠΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ
ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΊΠ°Π½Π°Π», Π½ΡΠΊΠΎΠΈ ΠΎΡ ΡΡΡ ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΈ, Π° Π΄ΡΡΠ³ΠΈ ΡΠ° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Π³ΡΠ΅ΡΠΊΠ°. Π’Π΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ ΠΏΠΎ Π΅ΡΠΈΠΊΠ΅Ρ. ΠΡΠΊΠΎΠΈ ΡΠ° ΠΠΠ€Π, Π΄ΡΡΠ³ΠΈ ΡΠ° ΠΠ ΠΠ¨ΠΠ.
Π’ΡΡΠ±Π²Π° Π΄Π° Π³ΠΈ ΡΠ°Π·Π΄Π΅Π»ΠΈΠΌ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π°. Π’Π΅Π·ΠΈ. ΠΠΈΡΠ΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Π΅Π΄ΠΈΠ½ ΠΊΠ°Π½Π°Π», Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ Π² Π΄ΡΡΠ³.
ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΎΡ ΡΠ΅ΠΊΡΠΈΡΡΠ° Π·Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ ΠΊΡΠΌ ΡΠΈΠ»ΡΡΡ ΠΈ ΠΈΠ·Ρ ΠΎΠ΄.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ°Π·Π΄Π΅Π»Π° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅, ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΉΠΊΠΈ ΠΎΡ Π½Π΅Π³ΠΎ Ρ Π΅Ρ (Π΄Π²ΠΎΠΉΠΊΠΈ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ), Ρ ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ, Ρ.Π΅. Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΡΠΏΠΎΡΠ΅Π΄ ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ°. Π Π² ΡΠ°Π·Π΄Π΅Π»Π° Π·Π° ΠΈΠ·Ρ ΠΎΠ΄ ΡΠ΅ ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠΈΠΌ Π²ΡΡΠΊΠΎ ΠΎΡ ΡΡΡ Π΄ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΊΠ°Π½Π°Π».
Π Π°Π·Π±ΠΎΡ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ 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, 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
ΠΠ°ΠΏΠΎΡΠ²Π°ΠΌΠ΅, ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅, Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com