로그스태시는 데몬의 행동 방식을 설정 파일로 작성할 수 있다. 따라서 별다른 데몬을 작성하지 않아도, 간단한 설정만으로 원하는 역할을 수행하게 할 수 있다. 뭐 그렇다고 간단한 것은 아니고 문서를 잘 읽어보지 않으면 삽질할 가능성이 크다. 설정 관련된 문서는 다음의 링크에서 확인할 수 있다.

구조

구조는 다음과 같이 크게 세 부분으로 나뉜다.

#sample_configuration.conf

input {
}

filter {
}

output{
}

이름 그대로의 뜻으로 생각하면 된다. 로그스태시 데몬이 실행되어 있는 상태에서 이 데몬으로 어떤 정보가 들어오는 것이 input, 이 들어온 정보를 처리하는 부분이 filter, 마지막으로 처리된 정보를 어딘가로 보내는 것이 output이다.

기본 문법

설정파일을 작성하는 기본 문법은 다음과 같다.

사용하는 변수 타입

Boolean, Number, String, Array, Hash의 다섯 개가 존재한다. 변수에 값은 다음과 같이 넣는다.

a => true
b => 4
c => [4,5,6]
d => {
    e => "x"
    f => "y"
}

유의점

  • Array
    • 값을 계속 대입하면 교체가 되지 않고 append된다.
  • Boolean
    • True/False가 아니고 true/false
  • String
    • 여러 가지 상황이 있지만 무조건 ““로 묶으면 신경쓸 필요 없다.

필드 참조

만약 로그스태시에서 어떤 필드를 참조해야 할 때는 [fieldname]을 사용하여 참조할 수 있다. 일반적인 dict/hash를 참조하는 것과 동일하게 사용 가능하다.

sprintf

문자열 치환을 통해 원하는 문자열을 얻을 수 있다. 예를 들어 어떤 필드의 값을 사용해서 문자열을 만들 경우 다음과 같이 사용할 수 있다.

output {
  statsd {
    increment => "apache.%{[response][status]}"
  }
}

조건문

if, else if, else 를 사용한다. 조건식은 다음을 사용한다.

  • equality, etc: ==, !=, <, >, <=, >=
  • regexp: =~, !~
  • inclusion: in, not in
  • boolean : and, or, nand, xor
  • unary : !

조건문은 filter에서 필터링 조건을 결정하거나, output에서 보낼 위치를 지정할 때 쓴다. 예를 들어 elasticsearch의 서로 다른 인덱스로 보낼 때 if를 사용하여 type을 보고 다른 인덱스로 보낸다거나, filter에서 의미없는 값일 경우 값을 drop시키는 데 사용한다.

설정 파일을 읽어들이는 순서

로그스태시는 특정한 설정 파일을 읽어들여 실행할 수 있다. -f 옵션을 주어 설정파일 경로와 이름을 주면 해당하는 설정 파일대로 행동한다. 다만 파일이 아닌 디렉토리를 주게 되면 그 디렉토리에서 설정 파일들을 정렬했을 때 나오는 순서대로 읽어들인다. 같은 행동양식을 지정했다면 먼저 나온 설정 내용은 다음 설정 내용으로 덮어씌워진다. 따라서 설정 파일을 다음과 같은 방식으로 두어 원하는대로 동작하게 할 수 있다. 꼭 이런 방법이 아니라 순서대로 정렬할 수 있도록 해서 조건을 정하면 된다.

PROJECT_TYPE_NUMBER_NAME.conf
  • PROJECT : 어떤 프로젝트에서 사용하는 것인지에 대한 번호.
  • TYPE : 설정의 세 부분에 대한 번호
  • NUMBER : 적용되어야 할 우선 순위
  • NAME : 사람이 알아볼 수 있는 문자열

이런 방식의 장점은 다음과 같다. 만약 output이 모두 elasticsearch로 가는데, 각각 다른 인덱스를 통해 가야하는 경우 설정은 다음과 같을 것이다.

...
output {
    if [type] == "w" {
        ...
    }
    else if [type] == "cub" {
        ...
    }
    else if [type] == "l" {
        ...
    }
    ....
}

그냥 설정파일에 이름을 나누어 지정하면 else if를 모두 쓸 필요 없이 필요한 if만 사용하면 된다.