ELKStack - 실전 편 (二)

17623 단어
1. kibana 도형 화
  • 1. es 마다 kibana
  • 2 kibana 자신 을 연결 하 는 es
  • 3 전단 의 Nginx 로그 인 인증
  • 1.1 도형 추가
    nginx 로그 상태 코드 를 통계 하 는 떡 그림 을 추가 합 니 다.
    1.2 모니터링 디스크 추가
    2. logstash 실전 입력 플러그 인 syslog
    https://www.elastic.co/guide/en/logstash/2.3/plugins-inputs-syslog.html
    주의 하 다.
  • 1 syslog 의 플러그 인 성능 은 좋 지 않 지만 수천 대가 걸 리 지 않 습 니 다.
  • 2 syslog 는 기본적으로 감청 514 포트 입 니 다.logstash 의 syslog 모듈 로 시스템 의 514 포트 를 감청 하면 로 그 를 얻 을 수 있 습 니 다.
  • 3 syslog 모듈 은 교환기, 공유 기 등 을 수집 할 수 있 는 로그 도 있다.

  • 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
    적용 필드
  • 1. es 가 특정한 파일 로그 부분 에 대해 정상적으로 수집 되 지 않 았 을 때.
  • 2 클 라 이언 트 가 logstash 를 설치 하지 않 았 거나 설치 하고 싶 지 않 습 니 다.
  • [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 모듈 을 사용 해 야 합 니 다.
    주의:
  • 1 grok 은 성능 에 매우 영향 을 미친다.
  • 2 융통성 이 없다.루비 를 알 지 않 는 한
  • 3 grok 에 정규 표현 식 이 많이 내장 되 어 있 으 니 직접 호출 하면 됩 니 다.표현 식 위치: / opt / logstash / vendor / bundle / jruby / 1.9 / gems / logstash - patterns - core - 2.0.5 / patterns / grok - patterns
  • https://www.elastic.co/guide/en/logstash/2.3/plugins-filters-grok.html
    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

    주:
  • 1 이 시작 되면 logstash 에 이상 출력 이 있 는 지 확인 해 야 합 니 다.설정 파일 을 자세히 확인 하고 시작 하 는 것 이 좋 습 니 다. 오류 가 발생 하면 오류 로 그 를 결합 하여 분석 하 는 것 이 좋 습 니 다.ps: 일반적으로 설정 파일 을 잘못 써 서 오류 가 발생 합 니 다.
  • 2 일 지 를 작성 하 세 요.
  • 3 logstash 는 rpm 으로 설치 되 어 있 습 니 다. 기본 시작 사용 자 는 logstash 입 니 다. 일부 로 그 를 수집 할 때 권한 이 부족 하여 정상적으로 수집 할 수 없습니다.두 가지 해결 방법 이 있다.
  • 1 logstash 사용 자 를 루트 그룹 에 추가 합 니 다.
  • 2. logstsh 를 루트 사용자 로 시작 (/ etc / init. d / logstash 스 크 립 트 수정, LS USER 를 루트 로 변경

  • 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

    좋은 웹페이지 즐겨찾기