이번 글에서는 애플리케이션에서 발생한 로그 이벤트를 아파치 카프카를 통하여 Publish 하는 방법에 대하여 다루어본다.
💬 Log4j는 KafkaAppender를 직접 지원한다.
Logback의 경우 오픈소스로 제공되는 logback-kafka-appender를 사용한다.
logback-kafka-appender 사용을 위해서는 Logback version 1.2 이상이 필요합니다.
오픈소스 링크 : https://github.com/danielwegener/logback-kafka-appender
// kafka 관련 설정
implementation 'org.springframework.kafka:spring-kafka'
testImplementation 'org.springframework.kafka:spring-kafka-test'
// logback-kafka-appender 관련 설정
implementation "com.github.danielwegener:logback-kafka-appender:0.1.0"
implementation 'net.logstash.logback:logstash-logback-encoder:5.2'
: 설정 파일
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<!-- <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>-->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
<!-- <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>-->
</layout>
</appender>
<!-- Layout 1 : kafkaAppender -->
<appender name="kafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender">
<encoder class="com.github.danielwegener.logback.kafka.encoding.LayoutKafkaMessageEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
<!-- <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
</layout>
</encoder>
<topic>search_log</topic>
<producerConfig>bootstrap.servers=localhost:9092</producerConfig>
</appender>
<!-- Async 한 KafkaAppender 추가 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="kafkaAppender"/>
</appender>
<!-- logger -->
<logger name="org.apache.kafka" level="ERROR"/>
<logger name="com.minsub.java.logger.kafka" level="DEBUG">
<!-- Layout 1 -->
<appender-ref ref="kafkaAppender"/>
<!-- Layout 2 -->
<!-- <appender-ref ref="logstashKafkaAppender" />-->
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
<root level="info">
<appender-ref ref="ASYNC" />
</root>
</configuration>
appender로 KafkaAppender 지정
encoding 방식으로 PatternLayoutEncoder 사용
KafkaAppender의 구성
카프카 브로커의 bootstrap-server은 필수적인 요소라 꼭 추가해야 함
나머지 설정들은 CONFLUENT Producer Configurations을 참고
KafkaAppender의 appender-ref : produce 과정이 실패했을 때 출력할 appender를 지정
kafkaAppender를 가진 kafkaLogger 만들기
AsyncAppender 생성 : Kafka의 메타데이터의 교환이 일어날 때, 블록킹 방식을 피할 수 있음
zookeeper application과 kafka application을 실행한다.
참고로, 파일은 아래의 링크를 통해 설치하였다.
.\zookeeper-server-start.bat ..\..\config\zookeeper.properties
.\kafka-server-start.bat ..\..\config\server.properties
.\kafka-topics.bat --create --bootstrap-server localhost:9092 --topic 토픽이름
.\kafka-console-producer.bat --broker-list localhost:9092 --topic 토픽이름
.\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic 토픽이름 --from-beginning
@RestController
@RequestMapping("/test")
public class TestController {
private static final Logger kafkaLogger = LoggerFactory.getLogger("kafkaLogger");
@GetMapping("/hello")
public void hello(@RequestParam(value = "name") String name) {
kafkaLogger.info("name:{}", name);
}
}
localhost:8080/test/hello?name=deingvelop
참고자료