Logstash로 여러 이기종 입력을 처리하는 방법은 무엇입니까?


95

기술 및 비즈니스 로그와 같이 매우 다른 두 가지 유형의 로그가 있고 다음을 원한다고 가정 해 보겠습니다.

  • 원시 기술 로그는 gelf출력을 사용하여 graylog2 서버로 라우팅됩니다 .
  • json 비즈니스 로그는 전용 elasticsearch_http출력을 사용하여 elasticsearch 클러스터에 저장됩니다 .

내가 가진 것을 알고 Syslog-NG예를 들어, 구성 파일이 다음 파견되기 전에 별도로 처리 할 수있는 몇 가지 별개의 입력을 정의 할 수 있습니다; 어떻게 Logstash할 수없는 것 같다. 두 개의 특정 구성 파일로 하나의 인스턴스를 시작할 수 있더라도 모든 로그는 동일한 채널을 사용하고 동일한 처리를 적용하고 있습니다.

다른 유형의 로그가있는만큼 많은 인스턴스를 실행해야합니까?


2
Ben Lim의 정답을 받아 들여야합니다!
Ben Wheeler

답변:


191

다른 유형의 로그가있는만큼 많은 인스턴스를 실행해야합니까?

아니! 다른 유형의 로그를 처리하기 위해 하나의 인스턴스 만 실행할 수 있습니다.

logstash 구성 파일에서 다른 유형으로 각 입력을 지정할 수 있습니다 . 그런 다음 필터에서 if 를 사용 하여 다른 처리를 구별 할 수 있으며 출력에서도 "if"출력을 다른 대상으로 사용할 수 있습니다.

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
} 
filter {
    if [type] == "technical" {
            # processing .......
    }
    if [type] == "business" {
            # processing .......
    }
}
output {
    if [type] == "technical" {
            # output to gelf
    }
    if [type] == "business" {
            # output to elasticsearch
    }
}

이것이 당신을 도울 수 있기를 바랍니다 :)


1
또한 구성 파일 내의 추가 형식을 약간 줄여야하는 필터 및 출력 정의에 type속성 (동일한 type => "value"구문)을 사용할 수도 있습니다 . 예 : gist.github.com/fairchild/3030472 문서 별 :이 입력으로 처리되는 모든 이벤트에 'type'필드를 추가합니다. 유형은 주로 필터 활성화에 사용됩니다. 유형은 이벤트 자체의 일부로 저장되므로 유형을 사용하여 웹 인터페이스에서 검색 할 수도 있습니다.
Tony Cesaro 2014 년

5
글쎄요, Ben이 제공 한 것이 실제로 이것을하는 새로운 방법 인 것 같습니다. type => "value"출력에서 사용할 때 다음 메시지가 표시됩니다. "표준 출력에서 ​​사용되지 않는 구성 설정"유형 "을 사용하고 있습니다. 사용되지 않는 설정은 계속 작동하지만 향후 logstash에서 제거 될 예정입니다. 다음과 같은 새 조건부에서도 이와 동일한 동작이 발생합니다 if [type] == "sometype" { stdout { ... } }. " 이전 댓글을 철회합니다. :)
Tony Cesaro 2014 년

점을 유의 type이미 입력에서 유형 필드가 있다면 속성이 적용되지 않습니다. 이것은 재정의되지 않는 특수 속성이며 문서화되어 있습니다. 나는 탄성에서 티켓을 오픈하고 사용하라고 권장 tags또는 add_field대신에type
BornToCode

@BornToCode, 나는 잘 이해하지 못합니다. Ben의 코드에 문제가 있다는 말입니까? 아니면 로그 경로가 동일한 파일이면 작동하지 않을까요? 작동하지 않는 시나리오는 무엇입니까?
Ben Wheeler

2
@BenLim OP는 귀하의 답변을 수락하지 않았지만 가장 도움이되었고 귀하를 찬성했습니다.
bigbadmouse

15

여러 파일 입력에 태그를 사용했습니다.

input {
    file {
        type => "java"
        path => "/usr/aaa/logs/stdout.log"
        codec => multiline {
            ...
        },
        tags => ["aaa"]
    }

    file {
        type => "java"
        path => "/usr/bbb/logs/stdout.log"
        codec => multiline {
                ...
        }
        tags => ["bbb"]
    }
}
output {
    stdout {
        codec => rubydebug
    }
    if "aaa" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "aaa"
            document_type => "aaa-%{+YYYY.MM.dd}"
        }
    }

    if "bbb" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "bbb"
            document_type => "bbb-%{+YYYY.MM.dd}"
        }
    }
}

이것은 허용되는 대답보다 낫습니다. logstash에서 여러 파일 비트 입력을 허용합니다. 이러한 경우 "type"속성은 "log"로 설정되며 수정할 수 없습니다.
Régis B.

그러나 이것은 마지막 태그 (bbb)로 태그를 덮어 쓰지 않습니까? 그리고 다시 if statememt에서 태그가 배열이거나 단일 문자열이면 두 IF가 모두 작동합니다. 따라서 논리적으로 이것은 올바르지 않지만 logstash는 if의 내부에 다른 논리를 가지고있을 수 있습니다
meso_2600

0

나는 logstash가 Input section에서 2 개 이상의 파일을 읽을 수 없다고 생각합니다. 아래를 시도하십시오

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 

예, 동일한 '문제'가 발생합니다
meso_2600
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.