본문 바로가기
Programming/검색엔진

[ELK] logback에서 설정한 시간 포맷과 ELK 시간 포맷 동기화

by ★용호★ 2017. 4. 25.

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로 변경

댓글