CentOS 7 시스템에 ELK 스택을 설치하는 방법에 대해 Digital Ocean의 이 튜토리얼을 따랐습니다.
그것은 꽤 좋아 보였고 초기 Elastic Search 노드가 올바르게 작동하고 NGINX 뒤에서 kibana 4가 실행되도록 했습니다. 그런데 Logstash를 설치할 때 Elasticsearch에서 인덱스를 생성하지 않는 것 같은 문제가 발생했습니다!! 어딘가에 구성 문제가 있다고 확신합니다. 하지만 내가 모르는 곳!
Logstash를 다시 시작한 후 _cat API를 사용하여 elasticsearch 인덱스를 제거하면 logstash가 인덱스를 생성하지 않은 것으로 나타났습니다.
curl http://localhost:9200/_cat/indices
yellow open .kibana 1 1 1 0 2.4kb 2.4kb
yellow open security 5 1 0 0 575b 575b
여기에 kibana의 인덱스가 있는데, 제가 생각하는 것은 '보안'이라는 표준 ES 인덱스입니다. 그런데 Logstash가 ES와 통신하지 않는 것 같습니다! 그리고 모든 것이 동일한 시스템에서 실행됩니다.
내가 설치한 ES 및 LS 버전은 다음과 같습니다.
elasticsearch-1.5.2-1.noarch
logstash-1.5.1-1.noarch
logstash-forwarder-0.4.0-1.x86_64
그리고 제가 따랐던 튜토리얼에서 설정한 방식대로,logstash conf.d 디렉토리에 3개의 구성 파일이 있습니다.
/etc/logstash/conf.d/01-lumberjack-input.conf에는 다음이 있습니다.
lumberjack {
port => 5000
type => "logs"
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
/etc/logstash/conf.d/10-syslog.conf에는 다음이 있습니다.
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
또한 포트 2541에서 수신 대기하는 20-logstash.conf라는 파일에 넣은 이전 Logstash 서버의 자체 구성도 있습니다.
/etc/logstash/conf.d/20-logstash.conf에 다음이 있습니다.
input {
lumberjack {
# The port to listen on
port => 2541
# The paths to your ssl cert and key
ssl_certificate => "/etc/pki/tls/certs/lumberjack.crt"
ssl_key => "/etc/pki/tls/private/lumberjack.key"
# Set this to whatever you want.
type => "logstash"
codec => "json"
}
}
filter {
if [type] == "postfix" {
grok {
match => [ "message", "%{SYSLOGBASE}", "timestamp", "MMM dd HH:mm:ss" ]
add_tag => [ "postfix", "grokked" ]
}
}
}
filter {
if [type] == "system" {
grok {
match => [ "message", "%{SYSLOGBASE}" ]
add_tag => [ "system", "grokked" ]
}
}
}
filter {
if [type] == "syslog" {
grok {
match => [ "message", "%{SYSLOGBASE}" ]
add_tag => [ "syslog", "grokked" ]
}
}
}
filter {
if [type] == "security" {
grok {
match => [ "message", "%{SYSLOGBASE}" ]
add_tag => [ "security", "grokked" ]
}
}
}
output {
stdout {
#debug => true
#debug_format => "json"
}
elasticsearch {
host => "logs.mydomain.com"
}
}
그리고 /etc/logstash/conf.d/30-lumberjack-output.conf에서 ES로 출력이 진행됩니다.
output {
elasticsearch { host => localhost }
stdout { codec => rubydebug }
}
이제 Logstash를 다시 시작한 후 Logstash가 구성에서 지정한 포트에서 수신 대기하는 것을 볼 수 있습니다.
[root@logs:/etc/logstash] #lsof -i :5000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 23893 logstash 16u IPv6 11665234 0t0 TCP *:commplex-main (LISTEN)
[root@logs:/etc/logstash] #lsof -i :2541
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 23893 logstash 18u IPv6 11665237 0t0 TCP *:lonworks2 (LISTEN)
현재 logstash가 실행 중이며 로그 출력이 생성되지 않습니다.
#ps -ef | grep logstash | grep -v grep
logstash 23893 1 16 11:49 ? 00:01:45 /bin/java -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.io.tmpdir=/var/lib/logstash -Xmx500m -Xss2048k -Djffi.boot.library.path=/opt/logstash/vendor/jruby/lib/jni -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Djava.awt.headless=true -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.io.tmpdir=/var/lib/logstash -Xbootclasspath/a:/opt/logstash/vendor/jruby/lib/jruby.jar -classpath : -Djruby.home=/opt/logstash/vendor/jruby -Djruby.lib=/opt/logstash/vendor/jruby/lib -Djruby.script=jruby -Djruby.shell=/bin/sh org.jruby.Main --1.9 /opt/logstash/lib/bootstrap/environment.rb logstash/runner.rb agent -f /etc/logstash/conf.d -l /var/log/logstash/logstash.log
ls -lh /var/log/logstash/logstash.log
-rw-r--r--. 1 logstash logstash 0 Jun 22 11:49 /var/log/logstash/logstash.log
하지만 여전히 Elasticsearch에는 인덱스가 생성되지 않습니다.
#curl http://localhost:9200/_cat/indices
yellow open .kibana 1 1 1 0 2.4kb 2.4kb
yellow open security 5 1 0 0 575b 575b
그리고 Kibana를 구성하려고 하면 "logstash-*"를 사용하여 검색할 패턴을 찾을 수 없다는 메시지가 나타납니다.
이 작업을 수행하려면 여기에서 어디로 가야 합니까? 구성 자체는 이전에 보여드린 것과 변경되지 않았습니다.
나는 logstash 전달자를 가리키려고 시도하지 않았지만 다음 명령을 사용하여 elasticsearch 클러스터에 stdin을 작성해 보았습니다.
logstash -e 'input { stdin { } } output { elasticsearch { host => localhost } }'
그리고 나는 다음과 같은 오류를 받았습니다.
`Got error to send bulk of actions: blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];[SERVICE_UNAVAILABLE/2/no master]; {:level=>:error}
Failed to flush outgoing items {:outgoing_count=>1, :exception=>org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];[SERVICE_UNAVAILABLE/2/no master];, :backtrace=>["org.elasticsearch.cluster.block.ClusterBlocks.globalBlockedException(org/elasticsearch/cluster/block/ClusterBlocks.java:151)", "org.elasticsearch.cluster.block.ClusterBlocks.globalBlockedRaiseException(org/elasticsearch/cluster/block/ClusterBlocks.java:141)", "org.elasticsearch.action.bulk.TransportBulkAction.executeBulk(org/elasticsearch/action/bulk/TransportBulkAction.java:210)", "org.elasticsearch.action.bulk.TransportBulkAction.access$000(org/elasticsearch/action/bulk/TransportBulkAction.java:73)", "org.elasticsearch.action.bulk.TransportBulkAction$1.onFailure(org/elasticsearch/action/bulk/TransportBulkAction.java:148)", "org.elasticsearch.action.support.TransportAction$ThreadedActionListener$2.run(org/elasticsearch/action/support/TransportAction.java:137)", "java.util.concurrent.ThreadPoolExecutor.runWorker(java/util/concurrent/ThreadPoolExecutor.java:1142)", "java.util.concurrent.ThreadPoolExecutor$Worker.run(java/util/concurrent/ThreadPoolExecutor.java:617)", "java.lang.Thread.run(java/lang/Thread.java:745)"], :level=>:warn}`
무슨 일이 일어날 수 있는지에 대한 생각이 있나요?