ELK 설치 배포 소계

22576 단어
ELK의 설치 배치는 N번째입니다!사실도 매우 간단하다. 여기에는 잊어버리지 않도록 적어 두어라.
#elasticsearch 
wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.tar.gz
tar -zxvf  elasticsearch-6.0.1.tar.gz
cd elasticsearch-6.0.1

# 。    ; ; ip(xxx.xxx.xxx.xxx 0.0.0.0); ( )
vi config/elasticsearch.yml
cluster.name: my-application
node.name: node-1
network.host: ip
http.port: 9200



  echo "*               soft    nofile          65536  *               hard    nofile          65536">> /etc/security/limits.conf
  echo "vm.max_map_count=262144"  >> /etc/sysctl.conf

# 
useradd es #  root  
su es
./bin/elasticsearch -d 
# ./elasticsearch -q    
exit
cd .. # curl ip:
9200 #kibana wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-linux-x86_64.tar.gz tar -zxvf kibana-6.0.1-linux-x86_64.tar.gz cd kibana-6.0.1 vi config/kibana.yml # ;kibana ip;es ip;index server.port: 5601 server.host: "0.0.0.0" elasticsearch.url: "http://xxx.xxx.xxx.xxx:9200" # ip、url localhost、127.0.0.1, ip!!! kibana.index: ".kibana" # nohup ./bin/kibana &
cd ..
# curl ip:5601 #Logstash wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.1.tar.gz tar -zxvf logstash-6.0.1.tar.gz cd logstash-6.0.1 # vi logstash-6.0.1/config/logs_to_es.conf input { file { type => "tomcat-catalina" path => "/opt/apps/apache-tomcat7/logs/catalina.log" codec => multiline { pattern => "^\s" what => "previous" } } } filter { #Only matched data are send to output. } output { elasticsearch { action => "index" #The operation on ES hosts => "xxx.xxx.xxx.xxx:9200" #ElasticSearch host, can be array. index => "tomcat_log" #The index to write data to. } } # nohup ./bin/logstash -f config/logs_to_es.conf &
cd ..
: # Logstash bin
/logstash -e 'input{stdin {}} output{stdout{}}' # https://blog.csdn.net/zhaojiweiwin/article/details/80281525

위의 스크립트는 vi 부분을 sed-i 또는 상호작용이 없는 명령으로 바꾸면 ELK의 설치 배치를 원키로 신속하게 완성할 수 있습니다.주의해야 할 것은 IP는localhost나 127.0.0.1을 사용할 수 없고 실제 IP가 필요하다는 것이다.주의해야 할 것은es가 시작되기 전에 linux 시스템의 매개 변수를 설정해야 한다는 것이다./etc/security/limits.conf, /etc/sysctl.conf, 그렇지 않으면 오류 보고가 시작됩니다.왜냐하면, 나는 아마도 es가 많은 파일 핸들을 열어야 한다고 생각한다.파일은 사실 최대 열 수 있는 파일 수로ulimit-n과 의미가 많지 않지만ulimit-n 설정을 통해 임시로 설정됩니다./etc/보안/limits를 통해.conf 설정이야말로 영구적인 것이다.max_map_count는 가상 메모리 맵으로 하나의 프로세스가 VMAs(가상 메모리 영역)에서 최대 수를 가질 수 있도록 합니다. VMA는 연속적인 가상 주소 공간입니다. 프로세스가 메모리 이미지 파일을 만들 때 VMA의 주소 공간이 증가합니다. max_map_count는 out of memory errors를 되돌려줍니다.이것도sysctl-w를 통해 설정할 수 있지만, 임시로/etc/sysctl에 써야 합니다.conf야말로 영원한 것이다.
 
물론, 위의logstash 프로필은 예시적이며, 부족할 수도 있습니다.실제로 사용하는 구성은 다음과 같습니다.
input {
   file {
        type => "erdp-rc"
        #path => "/app/java/logs/nohup-erdp_${WORD:app}-*.log"
        path => "/app/java/logs/nohup-erdp_*.log"
        #add_field => {"app2"=>"aa"}
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601}"
            negate => true
            what => "previous"
        }
    }
}
filter {
  #Only matched data are send to output.
  grok {
    # match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s? %{LOGLEVEL:level} %{INT:pid} --- \[%{URIPATHPARAM:thread}\] %{NOTSPACE:clz}\s+: %{GREEDYDATA:msg}" }
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s? %{LOGLEVEL:level} %{INT:pid} --- \[%{NOTSPACE:thread}\] %{NOTSPACE:clz}\s+: %{GREEDYDATA:msg}" } 
  }

grok {
# match => ["path","%{GREEDYDATA}/nohup-erdp_%{WORD:appName}_%{GREEDYDATA}\.log"] match
=> ["path","%{GREEDYDATA}/nohup-erdp_(?[a-zA-Z0-9.-]+)_%{DATA}\.log"] } # date { # match => [ "timestamp" , "YYYY-MM-dd HH:mm:ss.SSS" ] # } } output { elasticsearch { action => "index" #The operation on ES hosts => "192.168.11.183:9200" #ElasticSearch host, can be array. index => "erdp_log" #The index to write data to. } }

위의 두 개의 grok은 나에게 많은 시간을 썼다.어떤 알은 아프다.grok은 정말 번거로운 물건이다. 매번 한바탕 괴롭힌다.Logstash는 디버깅하기 불편하기 때문에conf를 수정하고 다시 시작하고 조작한 다음 로그가elk로 출력될 때까지 기다린 다음kibana에서 관찰해야 합니다.관찰할 수 없을까, 자신의 조회 조건이 틀렸는지, 각종 수정, 괴롭혔는지 의심해야 한다.이런 수동 디버깅은 2-6분 걸린다.온라인grok debugger는 또 쓸 수 없다.귀찮아.
 
위와 같이 URIPATHPARAM이 스레드와 일치하는 것을 볼 수 있으면 문제가 발생합니다!처음에는 의심이 없었어요.왜 URIPATHPARAM은 안 되고 NOTSPACE는 되나요?아래와 같다
 
URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+
#URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)?
URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?

 
URIPATHPARAM 뒤에 일치하면 문제가 생기는 것 같지만 Logstash는 틀리지 않았습니다.그래서 문제는 줄곧 알아낼 수 없었다.
 
또한 파일 이름을 통해 해당하는 응용 프로그램을 찾아 app_를 추가해야 합니다name 필드, 오래 걸렸어요.
처음에 input-file-add를 통해서...field 플러그인이 추가되었습니다. input-file의 path는 그룹을 사용할 수 없고 파일 이름을 읽을 수 없습니다. 다른 어댑터도 무효입니다.
 
"logstash path 추가 필드"를 검색하면 안 됩니다.뒤에 "logstash get the file name as field"검색해서 드디어 찾았어요.
https://stackoverflow.com/questions/23780000/use-grok-to-add-the-log-filename-as-a-field-in-logstash
https://stackoverflow.com/questions/22916200/logstash-how-to-add-file-name-as-a-field
(사실은 전에 찾았어요.http://www.voidcn.com/article/p-rueddyth-btd.html하지만 이렇게 효율이 낮다고 생각해서add_필드,grok을 통과하고 싶지 않음)
뒤에 알아요. grok을 통해서만 할 수 있어요!잘 생각해 보면 사실grok 방식의 효율도 많지 않을 것이다.
또한 Filter의grok은 여러 개가 가능하며 input의 file도 여러 개가 병행될 수 있음을 알아차렸다.
 
그러나, 나는 로그 파일 이름을 통해 한 단락을 더 캡처해야 한다. appName,% {WORD: appName}을 발견하고, 죽을 때까지 안 되거나, 때로는 좋고 나쁠 때 뒤에 [a-zA-Z0-9.-]+)로 바꾸면 된다!한두 시간의 시간을 낭비하는구나!
자세히 검사해 보니, WORD는 반드시 경계가 있어야 한다!WORD\b\w+\b . 나는 사용자 정의grok 문법이 틀린 것이 아닌지 의심하기 시작했다.(? regex), 뒤에 GREEDYDATA가 DATA로 바뀌어야 하는지 의심스럽다.사실 다 아니에요.
 
기본 제공되는 gork 정규 표현식:
USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})
BASE16NUM (?0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
BASE16FLOAT \b(?0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b

POSINT \b(?:[1-9][0-9]*)\b
NONNEGINT \b(?:[0-9]+)\b
WORD \b\w+\b
NOTSPACE \S+
SPACE \s*
DATA .*?
GREEDYDATA .*
QUOTEDSTRING (?>(?”(?>\\.|[^\\"]+)+”|”"|(?>’(?>\\.|[^\\']+)+’)|”|(?>(?>\\.|[^\]+)+)|`))
UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}


MAC (?:%{CISCOMAC}|%{WINDOWSMAC}|%{COMMONMAC})
IPV4 (?0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])

IP (?:%{IPV6}|%{IPV4})
HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)
HOST %{HOSTNAME}
IPORHOST (?:%{HOSTNAME}|%{IP})
HOSTPORT (?:%{IPORHOST=~/\./}:%{POSINT})


# Years?
YEAR (?>\d\d){1,2}
HOUR (?:2[0123]|[01]?[0-9])
MINUTE (?:[0-5][0-9])
# ’60is a leap second in most time standards and thus is valid.

SECOND (?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?)
TIME (?!0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9])
# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE}))
ISO8601_SECOND (?:%{SECOND}|60)
TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
DATE %{DATE_US}|%{DATE_EU}
DATESTAMP %{DATE}[- ]%{TIME}
TZ (?:[PMCE][SD]T|UTC)
DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}
DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}


# Log Levels
LOGLEVEL ([A-a]lert|ALERT|[T|t]race|TRACE|[D|d]ebug|DEBUG|[N|n]otice|NOTICE|[I|i]nfo|INFO|[W|w]arn?(?:ing)?|WARN?(?:ING)?|[E|e]rr?(?:or)?|ERR?(?:OR)?|[C|c]rit?(?:ical)?|CRIT?(?:ICAL)?|[F|f]atal|FATAL|[S|s]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)

 
 
참고
https://www.cnblogs.com/dyh004/p/9700110.html
https://blog.csdn.net/teaey/article/details/21626621

좋은 웹페이지 즐겨찾기