ELK 설치 배포 소계
#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])
# ’60′ is 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.