๋šœ๋ถ€๋‹ˆ์˜ Devlog

CentOS ํ™˜๊ฒฝ์— Elastic Stack ๊ตฌ์ถ•ํ•˜๊ธฐ

by ๋šœ๋ถ€๋‹ˆ

ELK

00. ์‹ค์Šต ํ™˜๊ฒฝ

Apache 2.0 License ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋งŒ ํฌํ•จ๋œ OSS ๋ฒ„์ „์„ ํ™œ์šฉํ•˜์—ฌ ์‹ค์Šตํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • CentOS 7.9
  • Elasticsearch OSS 7.10.2
  • Logstash OSS 7.10.2
  • Kibana OSS 7.10.2
  • Filebeat OSS 7.10.2
  • Java 11

์—ฌ๊ธฐ์„œ๋Š” ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„ CentOS ์„œ๋ฒ„๋กœ ํŒŒ์ผ์„ ์˜ฎ๊ฒจ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜์˜€์œผ๋ฉฐ,
๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ™˜๊ฒฝ ๊ตฌ์ถ•์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

01. Elasticsearch ํ™˜๊ฒฝ ๊ตฌ์ถ•

Elasticsearch ์„ค์น˜

๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ
Elasticsearch RPM ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„, CentOS ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์— ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด elasticsearch๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

sudo rpm --install elasticsearch-oss-7.10.2-x86_64.rpm

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, sudo service elasticsearch status ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ๊ตฌ๊ฐ€ ํ™”๋ฉด์— ํ‘œ์ถœ๋˜๋ฉด ์ •์ƒ ์„ค์น˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โ— elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://www.elastic.co

Elasticsearch ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒ

Elasticsearch๋ฅผ rpm์œผ๋กœ ์„ค์น˜ํ•˜์˜€๋‹ค๋ฉด, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‹คํ–‰๊ณผ ์ข…๋ฃŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์‹คํ–‰
sudo -i service elasticsearch start
# ์ข…๋ฃŒ
sudo -i service elasticsearch stop

Elasticsearch๋ฅผ ์‹คํ–‰ ํ›„ sudo service elasticsearch status ๋ช…๋ น์–ด๋กœ status๋ฅผ ํ™•์ธํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ๊ตฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ— elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-05-08 17:52:01 KST; 3s ago
     Docs: https://www.elastic.co
 Main PID: 14541 (java)
   CGroup: /system.slice/elasticsearch.service
           โ””โ”€14541 /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=1...

May 08 17:51:53 buildagent002 systemd[1]: Starting Elasticsearch...
May 08 17:52:01 buildagent002 systemd[1]: Started Elasticsearch.

์‹คํ–‰๋œ Elasticsearch์—์„œ ์ •์ƒ ์‘๋‹ต์ด ์˜ค๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

curl -X GET localhost:9200?pretty

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์˜ JSON ์‘๋‹ต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "name" : "buildagent002",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "SO3bsr3CSOC25BJzgpk9Qw",
  "version" : {
    "number" : "7.10.2",
    "build_flavor" : "oss",
    "build_type" : "rpm",
    "build_hash" : "747e1cc71def077253878a59143c1f785afa92b9",
    "build_date" : "2021-01-13T00:42:12.435326Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

02. Kibana ํ™˜๊ฒฝ ๊ตฌ์ถ•

Kibana ์„ค์น˜

Elaticsearch์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ Kibana RPM ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„, CentOS ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์— ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด kibana๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

sudo rpm --install kibana-oss-7.10.2-x86_64.rpm

Kibana ์„ค์ •ํ•˜๊ธฐ

ํ˜„์žฌ ์ƒํƒœ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•œ Kibana ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์—ด์–ด๋ณผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ,
Kibana ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, kibana ์„ค์ • ํŒŒ์ผ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

sudo vi /etc/kibana/kibana.yml

์šฐ์„ , ์„œ๋ฒ„ ์™ธ๋ถ€์—์„œ๋„ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก host๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

# ...

# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
#server.host: "localhost"
server.host: "0.0.0.0"

# ...

๊ทธ๋‹ค์Œ, elasticsearch๋ฅผ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค. ํ˜„์žฌ elasticsearch์™€ kibana๋Š” ๋™์ผ ์„œ๋ฒ„์— ์žˆ์œผ๋ฏ€๋กœ localhost๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

# The URLs of the Elasticsearch instances to use for all your queries.
elasticsearch.hosts: ["http://localhost:9200"]

Kibana ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒ

elasticsearch์™€ ์œ ์‚ฌํ•œ ํ˜•์‹์œผ๋กœ kibana๋ฅผ ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์‹คํ–‰
sudo -i service kibana start
# ์ข…๋ฃŒ
sudo -i service kibana stop

kibana ์‹คํ–‰ ํ›„ {์„œ๋ฒ„ IP}:5601๋กœ ์ ‘์†ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด kibana๊ฐ€ ์‹คํ–‰๋œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ฒ„๊ฐ€ 127.2.3.4๋ผ๊ณ ํ•˜๋ฉด, 127.2.3.4:5601๋กœ ์ ‘์†ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

image

03. Logstash ํ™˜๊ฒฝ ๊ตฌ์ถ•

Logstash ์„ค์น˜

Logstash๋„ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ RPM ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„, CentOS ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„์— ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด logstash๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

sudo rpm --install logstash-oss-7.10.2-x86_64.rpm

Logstash๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Java ์„ค์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Java ์„ค์น˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. Java ์„ค์น˜ ์‹œ, ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์˜ ์„œํฌํŠธ ๋งคํŠธ๋ฆญ์Šค์—์„œ logstash ๋ฒ„์ „์— ๋”ฐ๋ผ ์ง€์›ํ•˜๋Š” Java ๋ฒ„์ „์„ ํ™•์ธํ•œ ๋‹ค์Œ ์„ค์น˜ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Logstash ์„ค์ •

input.log ํŒŒ์ผ์„ ์ฝ์–ด์™€ output.log ํŒŒ์ผ์— ์“ฐ๋„๋ก ์„ค์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ฝ์„ ํŒŒ์ผ๊ณผ ํŒŒ์ผ์ด ์œ„์น˜ํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•ด logstash๊ฐ€ ์ฝ๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์“ธ ํŒŒ์ผ๊ณผ ํŒŒ์ผ์ด ์œ„์น˜ํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•ด logstash๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฝ์„ ํŒŒ์ผ์€ /var/log/testlog์— ์ƒ์„ฑํ•˜๊ณ  ์“ธ ํŒŒ์ผ์€ /var/log/logstash์— ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € input ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. vi ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์—ด๊ณ  ๋‚œ ๋‹ค์Œ esc ํด๋ฆญ ํ›„ :wq๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

vi /var/log/testlog/input.log

๊ทธ๋ฆฌ๊ณ  ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•ด ์ค๋‹ˆ๋‹ค.

sudo chmod 777 /var/log/testlog/input.log

๊ทธ๋‹ค์Œ, output ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

vi /var/log/logstash/output.log

๊ทธ๋ฆฌ๊ณ  output ํŒŒ์ผ๋กœ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•ด ์ค๋‹ˆ๋‹ค.

sudo chown logstash:logstash /var/log/logstash/*.log

์ด์ œ ์ฝ๊ณ  ์“ธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์œผ๋‹ˆ, logstash ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด ์ค์‹œ๋‹ค!

sudo vi /etc/logstash/conf.d/test.conf

test๋ฅผ ์œ„ํ•œ test.conf ํŒŒ์ผ์„ ์—ด์–ด์„œ ์•„๋ž˜ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

input {
    file {
        path => "/var/log/testlog/input.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
        ignore_older => 0
    }
}

output {
    file {
        path => "/var/log/logstash/output.log"
    }
}

output์„ file์ด ์•„๋‹Œ elasticsearch๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

output {
    elasticsearch{
        hosts => ["127.0.0.1:9200"]
        index => "test-%{+YYYY.MM.dd}"
    }
}

Logstash ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒ

logstash๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ elasticsearch์™€ kibana์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

# ์‹คํ–‰
sudo -i service logstash start
# ์ข…๋ฃŒ
sudo -i service logstash stop

logstash๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์Œ“์ด๋Š” log๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

tail -f /var/log/logstash/logstash-plain.log

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋กœ๊ทธ๊ฐ€ ๋œจ๋ฉด logstash ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[2023-05-10T17:16:24,448][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"7.10.2", "jruby.version"=>"jruby 9.2.13.0 (2.5.7) 2020-08-03 9a89c94bcc OpenJDK 64-Bit Server VM 11.0.8+10 on 11.0.8+10 +indy +jit [linux-x86_64]"}
[2023-05-10T17:16:25,713][INFO ][org.reflections.Reflections] Reflections took 24 ms to scan 1 urls, producing 23 keys and 47 values
[2023-05-10T17:16:25,989][INFO ][logstash.javapipeline    ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>8, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>1000, "pipeline.sources"=>["/etc/logstash/conf.d/test.conf"], :thread=>"#<Thread:0x50e1013f run>"}
[2023-05-10T17:16:26,470][INFO ][logstash.javapipeline    ][main] Pipeline Java execution initialization time {"seconds"=>0.47}
[2023-05-10T17:16:26,607][INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
[2023-05-10T17:16:26,646][INFO ][filewatch.observingtail  ][main][4dc77633e71bb984112a24ec0b874b2227768feace11807fb880a14efd3ebc20] START, creating Discoverer, Watch with file and sincedb collections
[2023-05-10T17:16:26,649][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2023-05-10T17:16:26,795][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด, ์œ„์—์„œ ์ƒ์„ฑํ•œ input.log ํŒŒ์ผ์— ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

echo "Hello World" >> input.log

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด output.log ํŒŒ์ผ์„ ์—ด์–ด ์ฝ์–ด์˜จ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[2023-05-10T17:18:27,078][INFO ][logstash.outputs.file    ][main][877769ce6ad911efbfb23c362b7171c3bffaf81f60c437ee02823cbf6e1ca9a8] Opening file {:path=>"/var/log/logstash/output.log"}
[2023-05-10T17:18:51,641][INFO ][logstash.outputs.file    ][main][877769ce6ad911efbfb23c362b7171c3bffaf81f60c437ee02823cbf6e1ca9a8] Closing file /var/log/logstash/output.log

์‹ค์ œ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ vi /var/log/logstash/output.log๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์—ด์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด logstash์—์„œ ์ถ”๊ฐ€ํ•œ ๋‚ด์šฉ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{"@version":"1","path":"/var/log/testlog/input.log","message":"Hello World","host":"buildagent002","@timestamp":"2023-05-10T08:18:26.927Z"}

04. Filebeat ํ™˜๊ฒฝ ๊ตฌ์ถ•

logstash๋กœ ์ง์ ‘ ํŒŒ์ผ์„ ์ฝ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, filebeat๋ฅผ ํ†ตํ•ด์„œ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
filebeat๋Š” ํŒŒ์ผ์„ ์ฝ๊ณ  ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ logstash ๋Œ€๋น„ ๋‹จ์ˆœํ•˜๊ณ  ์ ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋” ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ๋‹จ์ˆœํžˆ ํŒŒ์ผ์„ ์ฝ์–ด ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด logstash๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค filebeat๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

Filebeat ์„ค์น˜

Filebeat๋„ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ RPM ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„, CentOS ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„์— ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด filebeat๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

sudo rpm --install filebeat-oss-7.10.2-x86_64.rpm

Filebeat ์„ค์ •

Filebeat๋ฅผ ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒํ•˜๊ธฐ ์ „, Filebeat๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘ํ•œ ํŒŒ์ผ ๋‚ด์šฉ์„ Logstash๋กœ ์ „๋‹ฌํ•˜๋„๋ก ๊ตฌ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, ์ „๋‹ฌํ•  logfile์„ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค. ์ด๋•Œ, logstash์—์„œ์™€ ๊ฐ™์ด ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ๊ถŒํ•œ๋„ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# ์ƒ์„ฑ
vi /var/log/testlog/input2.log
# ๊ถŒํ•œ ๋ถ€์—ฌ
sudo chmod 755 /var/log/testlog/input2.log

๊ทธ๋‹ค์Œ input.log ํŒŒ์ผ์„ logstash๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋„๋ก filebeat.yml์„ ์ˆ˜์ •ํ•ด ๋ด…์‹œ๋‹ค.

๋จผ์ €, ์„ค์ • ํŒŒ์ผ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

sudo vi /etc/filebeat/filebeat.yml

๊ทธ๋‹ค์Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ • ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

# ...

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/testlog/input2.log
    #- /var/log/*.log

  # ...

  multiline.pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:'
  multiline.negate: false
  multiline.match: after

# ...

output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

๊ฐ ์„ค์ •์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • filebeat.inputs : filebeat๋กœ ์ˆ˜์ง‘ํ•˜๋ ค๋Š” ๋Œ€์ƒ์— ๋Œ€ํ•œ ์„ค์ •
    • type : input type์œผ๋กœ, log ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ filestream, kafka, redis, S3, container ๋“ฑ์ด ์กด์žฌํ•จ
    • enabled : ์„ค์ •ํ•œ input type์— ๋Œ€ํ•ด ์ˆ˜์ง‘ํ•  ๊ฒƒ์ธ์ง€ ์„ค์ • (true : ์ˆ˜์ง‘, flase : ๋ฏธ์ˆ˜์ง‘)
    • paths : input type์— ๋Œ€ํ•œ ๊ฒฝ๋กœ ๋ฆฌ์ŠคํŠธ
    • multiline.pattern : ์—ฌ๋Ÿฌ ์ค„ ์ˆ˜์ง‘ ํŒจํ„ด. ์—ฌ๊ธฐ์„œ๋Š” ๋ณต์žกํ•œ ์ž๋ฐ” ๋กœ๊ทธ์— ๋งž์ถฐ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • multiline.negate : false๋กœ ์„ค์ • ์‹œ pattern์— ์ผ์น˜ํ•˜๋Š” ์—ฐ์†๋œ ์ค„์„ ๋ฉ€ํ‹ฐ๋ผ์ธ์œผ๋กœ ์ธ์‹ํ•˜๋ฉฐ, true ์„ค์ • ์‹œ pattern์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์—ฐ์†๋œ ์ค„์„ ๋ฉ€ํ‹ฐ ๋ผ์ธ์œผ๋กœ ์ธ์‹
    • multiline.match : after๋กœ ์„ค์ • ์‹œ negate์— ๋งž์ถฐ ์ˆ˜์ง‘ํ•œ ๋ฉ€ํ‹ฐ ๋ผ์ธ์„ ์‹ฑ๊ธ€ ๋ผ์ธ ๋’ค์— ๋ถ™์ด๊ณ , before๋กœ ์„ค์ • ์‹œ negate์— ๋งž์ถฐ ์ˆ˜์ง‘ํ•œ ๋ฉ€ํ‹ฐ ๋ผ์ธ์„ ์‹ฑ๊ธ€ ๋ผ์ธ ์•ž์— ๋ถ™์ž„
  • output.logstash : filebeat๋กœ ์ˆ˜์ง‘ํ•œ ๋‚ด์šฉ์„ ์ „๋‹ฌ๋ฐ›์„ ๋Œ€์ƒ์— ๋Œ€ํ•œ ์„ค์ •์œผ๋กœ, ์—ฌ๊ธฐ์„œ๋Š” logstash๋กœ ์„ค์ •. logstash ์™ธ์— elasticsearch, kafka, redis, file ๋“ฑ์ด ์กด์žฌ
    • hosts : output ๋Œ€์ƒ host ๋ชฉ๋ก
    • output ์„ค์ •์„ ํ•  ๋•Œ, logstash ์™ธ์— ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ output์„ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์œผ๋ ค๋ฉด ์ฃผ์„ ์ฒ˜๋ฆฌ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (e.g. #output.elasticsearch #...)

Logstash Input์„ Filebeat๋กœ ์„ค์ • - ๋‹ค์ค‘ ํŒŒ์ดํ”„๋ผ์ธ

filebeat์˜ output์„ logstash๋กœ ์„ค์ •ํ–ˆ์œผ๋ฏ€๋กœ, logstash์—์„œ filebeat๋ฅผ ํ†ตํ•ด input์„ ๋ฐ›๋„๋ก ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ file์„ ํ†ตํ•ด ์ผ์–ด์˜ค๋˜ ๋ถ€๋ถ„์„ ์œ ์ง€ํ•œ ์ฑ„, beat์— ๋Œ€ํ•œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ค‘ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์„ค์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์ค‘ ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ •์„ ์œ„ํ•ด pipelines.yml์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

sudo vi /etc/logstash/pipelines.yml

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

#- pipeline.id: main
#  path.config: "/etc/logstash/conf.d/*.conf"

- pipeline.id: test1
  path.config: "/etc/logstash/conf.d/test.conf"
- pipeline.id: test2
  path.config: "/etc/logstash/conf.d/test2.conf"

์ด์ œ, logstash์—์„œ filebeat๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋„๋ก test2.conf ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์„ค์ •ํ•ด ๋ด…์‹œ๋‹ค.

sudo vi /etc/logstash/conf.d/test2.conf

filebeat๋ฅผ ํ†ตํ•œ ์ˆ˜์ง‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

input {
    beats{
        port => 5044
    }
}

output {
    file {
        path => "/var/log/logstash/output2.log"
    }
}

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  output2.log๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, logstash์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# ์ƒ์„ฑ
sudo vi /var/log/logstash/output2.log
# ๊ถŒํ•œ ๋ถ€์—ฌ
sudo chown logstash:logstash /var/log/logstash/*.log

๊ทธ๋‹ค์Œ logstash๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ณ , file์„ ํ†ตํ•œ ์ž…๋ ฅ์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค.

# ์žฌ์‹œ์ž‘
sudo -i service logstash restart
# input.log ํŒŒ์ผ ๋‚ด์— ๋‚ด์šฉ ์ถ”๊ฐ€
echo "multi pipeline test" >> input.log
# output.log ์ถœ๋ ฅ
cat /var/log/logstash/output.log
# output.log ์ถœ๋ ฅ ๊ฒฐ๊ณผ ๋‚ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ์Œ
{"host":"buildagent002","@version":"1","message":"multi pipeline test","@timestamp":"2023-05-11T04:52:05.096Z","path":"/var/log/testlog/input.log"}

์ •์ƒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์œผ๋ฏ€๋กœ ์ด์ œ filebeat๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด ๋ด…์‹œ๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ์€ ์•„๋ž˜์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

Filebeat ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒ

๋‹ค๋ฅธ Elastic Stack ์ œํ’ˆ๊ตฐ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ Filebeat๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์‹คํ–‰
sudo -i service filebeat start
# ์ข…๋ฃŒ
sudo -i service filebeat stop

๊ทธ๋‹ค์Œ ์•„๋ž˜ ๋‚ด์šฉ์„ input2.log ๋‚ด์— ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค.

echo -e "2023-05-11 13:54:30.123 ERROR [HomeController] I/O error on POST request for \"http://localhost:9090\"; Connect to failed; connect timed out\n    at org.springframework\n    at org.spring.framework\nCaused by: org.apache.http.conn\n    at org.apache.http\n    at org.apache.http\n    ... 1 more" > input2.log

๊ทธ๋‹ค์Œ cat ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด output2.log๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด ๋ณด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ "message" ๋ถ€๋ถ„์„ ๋ณด๋ฉด, ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ํŒŒ์ผ ๋‚ด์šฉ ๋ณด๊ธฐ
cat /var/log/logstash/output2.log
# ์ถœ๋ ฅ๋œ ํŒŒ์ผ ๋‚ด์šฉ
{"@version":"1","log":{"offset":287,"flags":["multiline"],"file":{"path":"/var/log/testlog/input2.log"}},"tags":["beats_input_codec_plain_applied"],"host":{"name":"buildagent002","architecture":"x86_64","id":"52a8654f14a0436b88623af1d800154a","mac":["fa:16:3e:28:0e:d2"],"containerized":false,"ip":["10.5.187.114","fe80::f816:3eff:fe28:ed2"],"os":{"version":"7 (Core)","name":"CentOS Linux","codename":"Core","kernel":"3.10.0-1160.el7.x86_64","platform":"centos","family":"redhat"},"hostname":"buildagent002"},"@timestamp":"2023-05-11T05:09:42.525Z","input":{"type":"log"},"agent":{"version":"7.10.2","name":"buildagent002","id":"5da5758f-13a9-45f2-9ad4-f6028ba03886","type":"filebeat","ephemeral_id":"93a3c224-5490-4847-be02-80e6b7e01899","hostname":"buildagent002"},"cloud":{"machine":{"type":"8vCPU_RAM64GB_Disk100GB_huge"},"provider":"openstack","instance":{"id":"i-0000aaa1","name":"buildagent002.kr.hmgcloud.com"},"availability_zone":"Reserve-Zone"},"message":"2023-05-11 13:54:30.123 ERROR [HomeController] I/O error on POST request for \"http://localhost:9090\"; Connect to failed; connect timed out\n    at org.springframework\n    at org.spring.framework\nCaused by: org.apache.http.conn\n    at org.apache.http\n    at org.apache.http\n    ... 1 more","ecs":{"version":"1.6.0"}}

 

 

์ฐธ๊ณ 

'ELK' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Elasticsearch Cluster ์„ค์ •ํ•˜๊ธฐ  (0) 2023.06.11

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

๋šœ๋ถ€๋‹ˆ์˜ Devlog

๋šœ๋ถ€๋‹ˆ

ํ™œ๋™ํ•˜๊ธฐ