본문 바로가기
프로젝트

스프링 로깅 logback, kafka

by 흰색남자 2022. 11. 14.

---------------------- logback.xml // resource 폴더에 정의 --------------------------------------

<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- This is the kafkaAppender -->
    <appender name="kafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <topic>log4</topic>
        <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.NoKeyKeyingStrategy" />
        <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy" />

        <producerConfig>bootstrap.servers=localhost:9092</producerConfig>

        <!-- this is the fallback appender if kafka is not available. -->
        <appender-ref ref="STDOUT" />
    </appender>

    <root level="info">
        <appender-ref ref="kafkaAppender" />
    </root>
</configuration>

 

----

logback.xml 설명

appender 설명하기 전에 \

<root level="info"> </appender-ref ref="kafkaappender" > </root> 

루트에서 발생하는 info 레벨 이상의 모든 로그는 kafkaappender를 사용하여 로그를 관리하겠다는 의미이다.

 

로그의 레벨은 5단계로 분류된다.

TRACE - DEBUG - INFO - WARN - ERROR

이렇게 진행된다.

 

 

 

로그백에서 지원하는 appender는 여러가지가 있다. 파일, fluentd, console, kafka, db 등 여러가지가 있고, 나는 카프카를 선택하였다.

kafka appender 는 지정하는 topic에 로그를 보내여 여러가지 데이터 싱크에 보낼 수 있다.

 

configuration에서 추가할 설정에 appender를 정의한다.

여기에 여러가지 appender를 설정할 수 있다. // 원하는거 넣으면 됨.

이제 로깅되는 패턴을 명시해주어야한다.

<encoder> </encoder> 태그에 명시하여 지정을 해야한다.

Log Pattern

%logger: 패키지 포함 클래스 정보
%logger{0}: 패키지를 제외한 클래스 이름만 출력
%logger{length}: Logger name을 축약할 수 있음. {length}는 최대 자리 수, ex)logger{35}
%-5level: 로그 레벨, -5는 출력의 고정폭 값(5글자), 로깅레벨이i nfo일 경우 빈칸 하나 추가
${PID:-}: 프로세스 아이디
%d: 로그 기록시간 출력
%p: 로깅 레벨 출력
%F: 로깅이 발생한 프로그램 파일명 출력
%M: 로깅일 발생한 메소드의 명 출력
%line: 로깅이 발생한 호출지의 라인
%L: 로깅이 발생한 호출지의 라인
%thread: 현재 Thread 명
%t: 로깅이 발생한 Thread 명
%c: 로깅이 발생한 카테고리
%C: 로깅이 발생한 클래스 명 (%C{2}는 somePackage.SomeClass 가 출력됨)
%m: 로그 메시지
%msg: - 로그 메시지 (=%message)
%n: 줄바꿈(new line)
%%: %를 출력
%r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)
%d{yyyy-MM-dd-HH:mm:ss:sss}: %d는 date를 의미하며 중괄호에 들어간 문자열은 dateformat을 의미. 따라서 [2021-07-12 12:42:78]과 같은 날짜가 로그에 출력됨.
%-4relative: %relative는 초 아래 단위 시간(밀리초)을 나타냄. -4를하면 4칸의 출력폼을 고정으로 가지고 출력. 따라서 숫자에 따라 [2021-07-12 12:42:78:232] 혹은 [2021-07-12 12:42:78:2332]와 같이 표현됨

 

전송할 목표(토픽)을 지정해주고 전송을 위한 클래스 라이브러리 파일을 정의해준다.

이어서 producerConfig를 정해준다.

여기서는 동기/비동기, 배치크기, 전송주기, 버퍼 크기, 브로커 서버 위치 등을 정의해주는데 나는 토픽만 정해주고 나머진 디폴트값으로 놔두었다.

 

 

로그 레벨 별 의미는 다음과 같다.

FATAL

응용 프로그램의 중요한 비즈니스 기능 중 하나가 더 이상 작동하지 않는 상태에 진입했을 때 혹은 전체 프로그램이 비즈니스 기능을 수행하지 않을 때 알려주는 로그 수준이다. 데이터베이스와 같은 중요한 저장소에 연결할 수 없는 경우 이에 해당된다. 

 

ERROR

응용 프로그램이 하나 이상의 기능이 제대로 작동않아 일부 기능이 올바르지 않게 작동하지 않을 때 사용한다.

 

WARN

예기치 않은 일이 발생했음을 나타내는 로그 레벨이지만, 응용 프로그램이 실패했다는 것을 의미하지는 않는다. 예기치 않은 상황에서 사용하지만 기능은 예상대로 작동할 때이다.

INFO

문제가 발생했음을 나타내는 표준 로그 레벨이다. 이 수준으로 기록하는 유용한 정보이여야 한다. 서비스 시작이나 중지 등이 이에 해당한다. 일반 적으로 정상적인 상황에서는 신경쓰지 않는다. 

 

DEBUG

문제 진단 및 문제 해결을 할 때 도움이 되는 정보이다.  이 외에도 모든 것이 올바르게 실행되고 있는지 확인하기 위해 테스트 환경에서 프로그램을 실행할 때 사용된다.

 

TRACE

코드를 추적하고 기능의 부분을 찾을 때 사용하는 정보이다.

 

 

--------------------------------------------- logstash.conf--------------------------------------------------------------------

input {
  kafka {
    bootstrap_servers => "localhost:9092"
    topics => "log4"
  }
}

filter {
 json {
   source => "message"
 }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
    index => "kafka-elk-spring-log-%{+YYYY.MM.dd}"
  }
}

---------------------------------------------------------------------------------------------------------------------------------

 

로그스태시는 볼거 없으니 스킵

 

 

참고 

https://livenow14.tistory.com/64   

https://sdardew-valley.tistory.com/141

'프로젝트' 카테고리의 다른 글

리액트 생명주기 KEY  (0) 2023.10.19
사용 가능한 기술 소개  (0) 2022.09.17
카카오 클라우드 스쿨 VPN 구축 프로젝트  (0) 2022.09.06