logstashfile output plugin을 이용하면 수집된 로그(데이터)를 파일로 쓰게 된다.
하나의 파일에 모든 데이터를 쓰게되면 디스크/데이터 관리가 불편하기 때문에 날짜별로 분리하여 파일을 저장하는 것이 좋다.

YYYY-MM-DD 포맷으로 파일 분리

file output plugin 문서의 path 항목에 설명된 대로 path 항목에 %{+YYYY-MM-dd}를 붙여서 날짜별로 파일을 분리 할 수 있다.

output {
    file {
        path => "/path/of/output/file.%{+YYYY-MM-dd}"
    }
}

이렇게 설정하면 rotate는 잘되는데 timezone이 UTC기준(+00:00)으로만 동작하는 단점이 있다. date filter plugin이 타임존을 변경할 수 있을 것 같지만 date 플러그인은 데이터의 특정 필드를 파싱하여 데이터 자체의 event time으로 지정하는 플러그인이라 사용 용도가 맞지 않는다.

timezone 지정하여 파일 분리

file output plugin의 path에는 %{+YYYY-MM-dd}말고도 임의의 필드명을 사용할 수 있는데 이를 이용하여 별도의 타임존이 적용된 날짜 문자열을 생성하여 적용하면 된다.
ruby filter plugin을 이용해 임의의 코드를 각 데이터(로그)에 적용해 줄수 있으므로 아래와 같은 ruby 코드를 생성한다. (필요에 따라 timezone 문자열 변경 - localtime 부분)

# my-log-date.rb
def register(params)
end

def filter(event)
    log_time_str = event.get("@timestamp").time.localtime("+09:00").strftime("%Y-%m-%d")
    event.set("[@metadata][log_date_str]", log_time_str)
    return [event]
end

위 코드를 설정에서 사용하도록 추가해 주고 file output의 path에도 [@metadata][log_date_str]를 참조하도록 한다.

filter {
	ruby {
		path => "/ruby/code/path/my-log-date.rb"
	}
}
output {
    file {
        path => "${VARS_PATH}/logstash-out/s2s.error.out.%{[@metadata][log_time_str]}"
        path => "/path/of/output/file.%{[@metadata][log_date_str]}""
    }
}

log_date_str@metadata하위에 설정했는데 @metadata 밑으로 넣은 값은 최종 output에는 전달되지 않는다.