ELKStack - 실전 편 (二)
nginx 로그 상태 코드 를 통계 하 는 떡 그림 을 추가 합 니 다.
1.2 모니터링 디스크 추가
2. logstash 실전 입력 플러그 인 syslog
https://www.elastic.co/guide/en/logstash/2.3/plugins-inputs-syslog.html
주의 하 다.
2.1 설정 시스템 의 rsyslog. conf 파일
[root@elk01-node2 ~]# vim /etc/rsyslog.conf
# :
90 *.* @@10.0.0.204:514
# *
# *
# , 。
[root@elk01-node2 ~]# systemctl restart rsyslog
2.2 프로필 수집 시스템 로그 작성
2.2.1 먼저 프론트 데스크 에 인쇄
[root@elk01-node2 conf.d]# cat rsyslog.conf
input {
syslog {
type => "rsyslog"
port => 514
}
}
filter {
}
output {
stdout {
codec => "rubydebug"
}
}
프론트 데스크 에 시동 을 걸 고 테스트 를 진행 합 니 다.
#
[root@elk01-node2 conf.d]# /opt/logstash/bin/logstash -f ./rsyslog.conf
Settings: Default pipeline workers: 4
Pipeline main started
{
"message" => "[system] Activating service name='org.freedesktop.problems' (using servicehelper)
",
"@version" => "1",
"@timestamp" => "2017-05-04T19:31:44.000Z",
"type" => "rsyslog",
"host" => "10.0.0.204",
"priority" => 29,
"timestamp" => "May 4 15:31:44",
"logsource" => "elk01-node2",
"program" => "dbus",
"pid" => "900",
"severity" => 5,
"facility" => 3,
"facility_label" => "system",
"severity_label" => "Notice"
...........
...........
logger 。
[root@elk01-node2 conf.d]# logger wangfei
.......
}
{
"message" => "wangfei
",
"@version" => "1",
"@timestamp" => "2017-05-04T19:43:19.000Z",
"type" => "rsyslog",
"host" => "10.0.0.204",
"priority" => 13,
"timestamp" => "May 4 15:43:19",
"logsource" => "elk01-node2",
"program" => "root",
"severity" => 5,
"facility" => 1,
"facility_label" => "user-level",
"severity_label" => "Notice"
}
2.2.2 es 수집
[root@elk01-node2 conf.d]# cat rsyslog.conf
input {
syslog {
type => "rsyslog"
port => 514
}
}
filter {
}
output {
#stdout {
# codec => "rubydebug"
#}
if [type] == "rsyslog" {
elasticsearch {
hosts => ["10.0.0.204:9200"]
# , , , 。
index => "rsyslog-%{+YYYY.MM}"
}
}
}
ps: logger , es
2.2.3 kibana 색인 추가
대략.
3. logstash 실전 - input 플러그 인 tcp
https://www.elastic.co/guide/en/logstash/2.3/plugins-inputs-tcp.html
적용 필드
[root@elk01-node2 conf.d]# cat tcp.conf
input {
tcp {
port => 6666 # , 。
type => "tcp"
mode => "server" # , server
}
}
filter {
}
output {
stdout {
codec => rubydebug
}
}
보 낼 로 그 를 nc 명령 으로 logstash tcp 서버 에 보 냅 니 다.
1
[root@web01-node1 ~]# echo wf |nc 10.0.0.204 6666
2
[root@web01-node1 ~]# nc 10.0.0.204 6666 /dev/tcp/10.0.0.204/6666
4. logstash 필터 플러그 인 - grok
역할: 가 져 온 로그 내용 에 대해 필드 분할 을 진행 합 니 다.열: nginx 는 로 그 를 json 형식 으로 쓸 수 있 습 니 다. apache 의 로 그 는 안 됩 니 다. grok 모듈 을 사용 해 야 합 니 다.
주의:
4.1 filter 모듈 을 사용 하 는 작은 예
root@elk01-node2 conf.d]# cat grok.conf
input {
stdin {}
}
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
output{
stdout {
codec => rubydebug
}
}
다음 테스트 로 그 를 입력 하 십시오:
55.3.244.1 GET /index.html 15824 0.043
효과.
{
"message" => "55.3.244.1 GET /index.html 15824 0.043",
"@version" => "1",
"@timestamp" => "2017-05-04T23:59:15.836Z",
"host" => "elk01-node2.damaiche.org-204",
"client" => "55.3.244.1",
"method" => "GET",
"request" => "/index.html",
"bytes" => "15824",
"duration" => "0.043"
}
{
"message" => "",
"@version" => "1",
"@timestamp" => "2017-05-04T23:59:16.000Z",
"host" => "elk01-node2.damaiche.org-204",
"tags" => [
[0] "_grokparsefailure"
]
}
4.2 apache 로그 수집
프론트 데스크 에 인쇄
[root@elk01-node2 conf.d]# cat grok.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output{
stdout {
codec => rubydebug
}
}
테스트 로그 생 성
[root@elk01-node2 httpd]# ab -n 10 http://10.0.0.204:8081/
es 에 저장
[root@elk01-node2 conf.d]# cat grok.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output{
#stdout {
# codec => rubydebug
#}
elasticsearch {
hosts => ["10.0.0.204:9200"]
index => "httpd-log-%{+YYYY.MM.dd}"
}
}
, 。
효과.
5. 메시지 큐 확장 사용
https://www.elastic.co/guide/en/logstash/2.3/deploying-and-scaling.html
메시지 큐 의 구조 가 없 으 면 ex 시스템 이 끊 기 면 놀 수 있 습 니 다.데이터 - logstash - es
결합 해제 후 구조.mq 후의 구조, es 끊 기, 그리고 redis, 데이터 아무것도 잃 어 버 리 지 않 습 니 다.data - logstash - mq -logstash -es
input 의 redishttps://www.elastic.co/guide/en/logstash/2.3/plugins-inputs-redis.html#plugins- input - redisotput 의 redishttps://www.elastic.co/guide/en/logstash/2.3/plugins-outputs-redis.html
설명 하 다.
web01 - node1. damaiche. org - 203 logstash 수집 데이터 elk01 - node2. damaiche. org - 204 logstash (indexer) + kibana + es + redis
5.1 배포 redis
기계: elk01 - node2. damaiche. org - 204
yum -y install redis
프로필 수정
vim /etc/redis.conf
61 bind 10.0.0.204 127.0.0.1
128 daemonize yes
시작 redis
systemctl restart redis
redis 가 정상적으로 기록 할 수 있 는 지 테스트 합 니 다.
redis-cli -h 10.0.0.204 -p 6379
10.0.0.204:6379> set name hehe
OK
10.0.0.204:6379> get name
"hehe"
5.2 apache 로그 수집
5.2.1 redis 로 로그 수집
web01 - node1. damaiche. org - 203
[root@web01-node1 conf.d]#cat redis.conf
input {
stdin{}
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
output {
redis {
host => ['10.0.0.204']
port => '6379'
db => "6"
key => "apache_access_log"
data_type => "list"
}
}
로그 인 redis 보기
10.0.0.204:6379> info # redis
......
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
db6:keys=2,expires=0,avg_ttl=0
10.0.0.204:6379> select 6 # key
OK
10.0.0.204:6379[6]> keys * # key ,
1) "apache_access_log"
2) "demo"
10.0.0.204:6379[6]> type apache_access_log # key
list
10.0.0.204:6379[6]> llen apache_access_log # key
(integer) 10
10.0.0.204:6379[6]> lindex apache_access_log -1 # , , , 。
"{\"message\":\"10.0.0.204 - - [04/May/2017:21:07:17 -0400] \\\"GET / HTTP/1.0\\\" 403 4897 \\\"-\\\" \\\"ApacheBench/2.3\\\"\",\"@version\":\"1\",\"@timestamp\":\"2017-05-05T01:07:17.422Z\",\"path\":\"/var/log/httpd/access_log\",\"host\":\"elk01-node2.damaiche.org-204\"}"
10.0.0.204:6379[6]>
5.2.2 logstash 를 시작 하여 redis 에서 데 이 터 를 읽 습 니 다.
기계: elk01 - node2. damaiche. org - 204
redis 에서 데 이 터 를 정상적으로 읽 을 수 있 는 지 테스트 합 니 다 (es 에 쓰 지 마 십시오)
root@elk01-node2 conf.d]# cat indexer.conf
input {
redis {
host => ['10.0.0204']
port => '6379'
db => "6"
key => "apache_access_log"
data_type => "list"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output{
stdout {
codec => rubydebug
}
}
데 이 터 를 만들다
[root@elk01-node2 conf.d]# ab -n 100 -c 1 http://10.0.0.203:8081/
이때 redis 에 가서 key access 보기apache_log 길이
10.0.0.204:6379[6]> llen apache_access_log
(integer) 100
기 록 된 indexer. conf 를 프론트 데스크 에 시작 합 니 다. 이 때 redis apache 를 다시 봅 니 다.access_log 길이
10.0.0.204:6379[6]> llen apache_access_log
(integer) 0
0, redis
이 때 데 이 터 를 es 에 기록 합 니 다.
[root@elk01-node2 conf.d]# cat indexer.conf
input {
redis {
host => ['10.0.0204']
port => '6379'
db => "6"
key => "apache_access_log"
data_type => "list"
}
}
filter {
# , type , 。grok , , 。
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output{
elasticsearch {
hosts => ["10.0.0.204:9200"]
index => "apache-access-log-%{+YYYY.MM.dd}"
}
}
효과.
6. 프로젝트 실전
6.1 수요 분석
접근 로그: apache 접근 로그, nginx 접근 로그, tomcat (file > filter) 오류 로그: 자바 로그.시스템 로그: / var / log / * syslog rsyslog 실행 로그: 프로그램 이 작성 한 (json 형식) 네트워크 로그: 방화벽, 교환기, 공유 기.
표준화: 로 그 는 어떤 형식의 제 이 슨 입 니까?어떻게 명명 합 니까?어디 에 맡 깁 니까? /data/logs/? 일 지 는 어떻게 자 릅 니까?날짜 에 따라?시간 당?어떤 공구 로 절단 합 니까?스 크 립 트 + crontab?도구 화: 어떻게 logstash 를 사용 하여 수집 방안 을 진행 합 니까?
6.2 실전
6.2.1 설명
로그 수집: nginx 액세스 로그, apache 액세스 로그, es 로그, 시스템 메시지 로그
캐릭터 설명: 10.0.0.203 web01 - node1. damaiche. org - 203 logstash 수집 데이터 10.0.0.204 elk 01 - node2. damaiche. org - 204 logstash (indexer) + kibana + es + redis
6.2.2 클 라 이언 트 가 로 그 를 수집 하여 redis 에 저장 합 니 다.
[root@web01-node1 conf.d]# cat shipper.conf
input{
file {
path => "/var/log/nginx/access.log"
start_position => "beginning"
type => "nginx-access01-log"
}
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
type => "apache-access01-log"
}
file {
path => "/var/log/elasticsearch/myes.log"
start_position => "beginning"
type => "myes01-log"
codec => multiline {
pattern => "^\["
negate => "true"
what => "previous"
}
}
file {
path => "/var/log/messages"
start_position => "beginning"
type => "messages01"
}
}
output{
if [type] == "nginx-access01-log" {
redis {
host => "10.0.0.204"
port => "6379"
db => "3"
data_type => "list"
key => "nginx-access01-log"
}
}
if [type] == "apache-access01-log" {
redis {
host => "10.0.0.204"
port => "6379"
db => "3"
data_type => "list"
key => "apache-access01-log"
}
}
if [type] == "myes01-log" {
redis {
host => "10.0.0.204"
port => "6379"
db => "3"
data_type => "list"
key => "myes01-log"
}
}
if [type] == "messages01" {
redis {
host => "10.0.0.204"
port => "6379"
db => "3"
data_type => "list"
key => "messages01"
}
}
}
[root@web01-node1 conf.d]# /etc/init.d/logstash start
주:
redis 에 로그 인하 여 각 key 가 정상적으로 생 성 되 었 는 지, 그리고 key 의 길 이 를 확인 합 니 다.
info
....
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
db3:keys=4,expires=0,avg_ttl=0
db6:keys=5,expires=0,avg_ttl=0
10.0.0.204:6379> select 3
OK
10.0.0.204:6379[3]> keys *
1) "messages01"
2) "myes01-log"
3) "apache-access01-log"
4) "nginx-access01-log"
10.0.0.204:6379[3]> llen messages01
(integer) 20596
10.0.0.204:6379[3]> llen myes01-log
(integer) 2336
10.0.0.204:6379[3]> llen apache-access01-log
(integer) 92657
10.0.0.204:6379[3]> llen nginx-access01-log
(integer) 100820
6.2.3 es 에서 logstash 를 시작 하여 redis 에서 데 이 터 를 읽 습 니 다.
[root@elk01-node2 conf.d]# cat indexer.conf
input {
redis {
host => "10.0.0.204"
port => "6379"
db => "3"
data_type => "list"
key => "nginx-access01-log"
}
redis {
host => "10.0.0.204"
port => "6379"
db => "3"
data_type => "list"
key => "apache-access01-log"
}
redis {
host => "10.0.0.204"
port => "6379"
db => "3"
data_type => "list"
key => "myes01-log"
}
redis {
host => "10.0.0.204"
port => "6379"
db => "3"
data_type => "list"
key => "messages01"
}
}
filter {
if [type] == "apache-access01-log" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
}
output {
if [type] == "nginx-access01-log" {
elasticsearch {
hosts => ["10.0.0.204:9200"]
index => "nginx-access01-log-%{+YYYY.MM.dd}"
}
}
if [type] == "apache-access01-log" {
elasticsearch {
hosts => ["10.0.0.204:9200"]
index => "apache-access01-log-%{+YYYY.MM.dd}"
}
}
if [type] == "myes01-log" {
elasticsearch {
hosts => ["10.0.0.204:9200"]
index => "myes01-log-%{+YYYY.MM.dd}"
}
}
if [type] == "messages01" {
elasticsearch {
hosts => ["10.0.0.204:9200"]
index => "messages01-%{+YYYY.MM}"
}
}
}
redis list 를 elkstack 메시지 큐 로 사용 하려 면 모든 list key 의 길 이 를 모니터링 해 야 합 니 다. 실제 상황 에 따라 '10w' 를 초과 하면 경찰 에 신고 합 니 다.
다음으로 전송:https://blog.51cto.com/damaicha/2122640
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.