Logstash file output plugin에 날짜별 rotate 적용하기 - timezone 적용
logstash
의 file 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에는 전달되지 않는다.