elasticsearch에서는 ISO8601 표준 date 포맷을 사용해야 date 형식으로 변환하는데 오류가 발생하지 않는다. 형식이 맞지 않더라도 logstash에서 date 형식을 지정해주면 되지만 포맷을 통일하는 것이 좋을 것 같아서 ISO8601로 통일했다. 또한 타임존은 기본 UTC를 사용하고 Kibana에서 타임존을 설정하는 방식으로 결정했다.
logback 설정
기존에 yyyy-MM-dd HH:mm:ss.SSS
포맷으로 사용하던 것을 ISO8601
로 변경
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>Log/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>Log/debug-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{ISO8601} %level %msg %n</pattern>
</encoder>
</appender>
- 가장 하단의 encoder 태그 부분에
%d{ISO8601}
로 설정하여 실제 파일에 작성될 때 해당 포맷을 사용하도록 함.
logstash 설정
logstash에서 사용하는 @timestamp 보다는 실제 서버에 로그가 찍힌 시간이 더 정확하므로 해당 시간을 이용하도록 timestamp 설정
...
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{WORD:log_level} %{GREEDYDATA:detail}" }
}
date {
match => [ "timestamp", "ISO8601" ]
target => "timestamp"
}
...
- grok 패턴을 사용하여 logback 설정에 의해 작성된 로그에서 시간 정보를 ISO8601 포맷으로 매칭
- grok 패턴으로 매칭되었더라도 elasticsearch로 전달되면 해당 필드가 String 타입으로 인식되기 때문에 date 타입으로 전달될 수 있도록 date에 대한 설정을 추가로 수행
kibana 설정
Management => Advanced Setting => dateFormat:tz 설정을 Asia/Seoul로 변경
'Programming > 검색엔진' 카테고리의 다른 글
로그스태시는 장애 시 어떻게 데이터 손실을 방지할까? (0) | 2017.12.12 |
---|---|
ELK에 Search Guard 적용 (3) | 2017.07.14 |
ELK 구성 노트 (0) | 2017.03.18 |
filebeat를 사용하여 logstash로 파일 수집하기 (0) | 2017.03.10 |
댓글