Home Spring access log Logstash 수집하기
Post
Cancel

Spring access log Logstash 수집하기

spirng boot + ELK stack 구현 시 http access logging을 빠르게 구현하고 싶을때 적용 할 수 있는 방법 정리

의존성

1
2
3
4
implementation("org.slf4j:slf4j-api")
implementation("net.logstash.logback:logstash-logback-encoder")
implementation("ch.qos.logback:logback-access")
implementation("ch.qos.logback:logback-classic")

LogStashAppender, Encoder를 사용하기때문에 위 의존성을 프로젝트에 추가하여야한다. 현재 프로젝트의 의존성을 확인하여 적절한 버전 명시 필요

dependencyManagement를 사용하여 의존성 중복문제를 발생하지 않도록 작업하는것을 추천한다.

logback-access.xml 작성

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appender name="access"
            class="net.logstash.logback.appender.LogstashAccessTcpSocketAppender">
    <destination>{LOGSTASH ADDRESS}</destination>
    <encoder class="net.logstash.logback.encoder.LogstashAccessEncoder"/>
  </appender>

  <appender-ref ref="access"/>
</configuration>

TomcatContext Pipeline 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Configuration
class AccessLogConfig {

  @Bean
  fun addLogbackValve() = TomcatContextCustomizer { context ->
    javaClass.getResourceAsStream("/logback-access.xml").use {
      Files.createDirectories(
        (context.catalinaBase.toPath()
          .resolve(LogbackValve.DEFAULT_CONFIG_FILE)).parent
      )

      Files.copy(
        it, context.catalinaBase.toPath()
          .resolve(LogbackValve.DEFAULT_CONFIG_FILE)
      )
    }

    LogbackValve().let {
      it.isQuiet = true
      context.pipeline.addValve(it)
    }
  }
}

위 작업을 완료하면 아래 필드들이 수집되는것이 확인가능하다.

TomcatContextPipeline을 추가하여 동작하도록 구현한 방식이라 서비스 영역의 커스텀이 불가한 단점이 존재하지만 특별히 커스텀이 불필요한 서비스의경우 빠르게 작업하기 좋다.

1
2
3
4
5
6
7
8
9
10
11
"@timestamp"
"@version"
"message"
"method"
"protocol"
"status_code"
"requested_url"
"requested_uri"
"remote_host"
"content_length"
"elapsed_time"

참조

https://github.com/logfellow/logstash-logback-encoder

This post is licensed under CC BY 4.0 by the author.

Github action set-output is deprecated

Spring ELK Marker를 활용하여 특정 로그만 Logstash appender로 수집하기