헤르메스 LIFE

[Spring Boot] 커스텀 로그 설정 logback 스프링 프로파일 사용 본문

Spring Framework

[Spring Boot] 커스텀 로그 설정 logback 스프링 프로파일 사용

헤르메스의날개 2021. 1. 9. 16:54
728x90

Logging 설정에는 많은 방법이 있네요.

이런 방법이 있는 걸 배웠습니다. 이분의 정리 내용도 장난 아니네요.

이분은 logback-spring.xml 설정을 하셨지만, 전 log4j2-spring.xml 을 사용하기로 했습니다.

 

스프링 부트는 Log4j2는 구현체의 설정을 찾기 위해  log4j2-test.xml , log4j2.xml , log4j2-spring.xml 파일을 찾습니다. 

logback-spring.xml과 마찬가지로, log4j2.xml보다 log4j2-spring.xml 파일로 만들게 되면 스프링부트의 설정부분에서 제어가 가능해져 확장성이 커집니다.

 


출처 : wordbe.tistory.com/entry/Spring-Boot-11-%ED%94%84%EB%A1%9C%ED%8C%8C%EC%9D%BC-%EB%A1%9C%EA%B9%85-%EC%84%A4%EC%A0%95?category=1108505

wordbe.tistory.com/entry/Spring-Boot-12-%EC%BB%A4%EC%8A%A4%ED%85%80-%EB%A1%9C%EA%B7%B8-%EC%84%A4%EC%A0%95-Logback

4. Logging

Spring Boot는 Commons Logging 을 사용합니다. 기본 제공 로깅은 Java Util Logging, Log4J2, and Logback 입니다.

로거(logger)는 미리 설정되어서 콘솔 출력으로 사용할 수 있습니다. 옵션으로 파일 출력이 가능합니다.

디폴트로 Starters를 사용하면, Logback이 로깅으로 사용됩니다. 적절한 로그백 라우팅은 의존성있는 라이브러리의 포함을 보장합니다.

Java Util Logging(jul), Commons Logging, Log4J, SLF4J 등의 다양한 로깅은 모두 slf4j로 변환되고, slf4j는 logback으로 전환하도록 도와 로깅이 잘 작동하도록 합니다.

 

4.1 Log 포맷

2019-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2019-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2019-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

  • Date and Time: Millisecond 정밀도, 손쉬운 정렬제공
  • Log Level: ERROR, WARN, INFO, DEBUG, or TRACE.
  • 프로세스 ID
  • --- 뒤에는 실제 에러메시지가 나옵니다.
  • Thread name: [ ] (bracket)으로 둘러쌓여있습니다.
  • Logger name: class name이거나, 줄여져 있습니다.
  • 로그 메시지

logback은 FATAL라는 레벨이 없고 대신 ERROR라고 맵핑이 됩니다.


4.2 Console 출력

기본적으로 레벨별로 로깅이 제공됩니다. 아래와 같이 debug 모드를 활성화 시킬 수 있습니다.

$ java -jar myapp.jar --debug

debug 모드가 활성화 되었을 경우, 코어 로거의 선택은 더 많은 정보를 나오게 설정합니다. 이 때 모든 메시지의 DEBUG 레벨을 출력하는 것은 아닙니다.

다른 방법으로는, trace 모드를 사용할 수 있습니다. (--trace) (또는 application.properties에서 trace=true ) 컨테이서 하이버네이트 스키마 생성, 전체 Spring 포트폴리오가 포함됩니다.

trace로 해본 결과 매우 많은 로깅이 출력됩니다.

4.2.1 컬러 출력

터미널이 ANSI 를 지원한다면, 칼라 출력이 가능합니다.

application.properties

spring.output.ansi.enabled = ALWAYS


4.3 파일 출력

기본적으로 스프링 부트는 console에만 로그를 남기고, 파일에 기록하지 않습니다. 로그 파일을 만들고 싶다면, application.properties에 logging.file.name 또는 logging.file.path 속성을 등록합니다.

logging.file.namelogging.file.pathExampleDescription

(none) (none) Console만 로깅
Specific file (none) my.log my.log파일이 현재경로에 생성됩니다.
(none) Specific directory ./logs/ spring.log 파일이 현재 디렉토리 기준 상대경로(logs 폴더)에 저장됩니다..

 

로그파일은 10MB에 다다르면 회전합니다. ERROR레벨, WARN레벨, INFO레벨 메시지가 기본으로 로깅됩니다. 크기 제한은 logging.file.max-size 설정으로 바꿀 수 있습니다. 최근 일주일간의 회전되는 로그 파일은 기본적으로 유지됩니다. logging.file.max-history 속성으로 주기를 조절할 수 있습니다. 로그 저장소의 전체 크기는 logging.file.total-size-cap으로 설정할 수 있습니다. 이를 넘어가면 백업이 삭제됩니다. 저장소를 모두 지우려면 logging.file.clean-history-on-start 속성을 이용합니다.

로깅 속성은 실제 로깅 구조에 독립적입니다. 결과적으로 특정 설정 키(logbaack.configurationFile 등)는 spring boot에 의해 관리되지 않습니다.

 

4.4 Log Levels

모든 지원디는 로깅 시스템은 Spirng Environment에 설정된 로거 레벨을 가집니다.

application.properties

logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error

로거 레벨은 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF 중에 하나를 고를 수 있습니다.

4.6 Custom Log 설정

다양한 로깅 시스템은 classpath에 있는 적절한 라이브러리를 포함시켜 활성화시킬 수 있습니다. 루트 classpath 또는 logging.config 위치에 명시하여 적절한 설정을 커스터마이징 할 수 있습니다.

org.springframework.boot.logging.LoggingSystem 에 원하는 시스템을 명시합니다. 그렇게 권장하진 않습니다.

로깅은 ApplicationContext 가 생성되기 전에 초기화됩니다. 따라서 @Configuration 파일의 @PropertySoruce 로부터 로깅을 제어할 수는 없습니다. 로깅 시스템을 제어할 수 있는 유일한 방법은 시스템 property를 통해서 입니다.

 

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

가능하면 -spring 를 이용해 이름을 짓는 것을 추천합니다. 예를 들면 logback-spring.xml 입니다. 표준 설정 위치를 사용하면, Spring은 완전히 로그 초기화를 할 수 없습니다.

logback configuration 검색

logback-spirng.xml

<configuration>
 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
 
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

evel 을 debug 로 설정했고, 출력은 STDOUT (standard output)입니다.

출력을 보면 debug 레벨로 잘 출력되는 것을 볼 수 있습니다.

 

클래스 로딩 이슈가 있으므로 'executable jar'로 실행할 때는 Java Util Logging은 쓰지 않는 것을 권장합니다.

Logback이 성능이 좋고 spring 기본 값이니, Logback 사용을 권장합니다.

Spring 환경에서 설정을 시스템 property에서도 쓸 수 있도록 변환된 폼을 제공합니다.

모든 지원 로깅 시스템은 System property를 참조할 수 있습니다. spring-boot.jar에 있는 기본 설정파일을 봅시다.

Logback을 사용한다면 속성 이름 사이에 : 를 구분자로 사용합니다.

LOG_LEVEL_PATTERN을 오버라이딩해서 MDC와 다른 ad-hoc 내용을 로그 라인에 추가할 수 있습니다.


4.7 Logback Extensions

logback-spring.xml 설정파일에서 확장을 사용하 수 있습니다.

logback.xml 설정 파일은 너무 빨리 로딩되기 때문에, extension을 사용하기 어렵습니다. 그러므로 logback-spring.xml 을 사용하거나 logging.conifg에 정의합니다.

Extension은 logbacks의 configuration scanning을 사용할 수 없습니다.

configuration scanning: logback 설정이 바뀌면, 런타임시에도 애플리케이션을 껏다 킬 필요 없이 바로 적용됩니다.

 

4.7.1 프로파일에 따른 설정

<springProfile> 태그는 활성중인 스프링 프로파일에 있는 설정의 섹션을 선택적으로 포함 또는 배제 할 수 있게 합니다.

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
 
<springProfile name="dev | staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
 
<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

예제)

resources/logback-spring.xml

<configuration>
 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
 
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
 
    <!-- dev env -->
    <springProfile name="dev">
        <logger name="org.springframework.boot" level="WARN" />
        <logger name="org.springframework.web" level="DEBUG" />
    </springProfile>
 
    <!-- prod env -->
    <springProfile name="prod">
        <logger name="org.springframework.*" level="info" />
    </springProfile>
</configuration>

application.properties

  spring.profiles.active = prod
  spring.profiles.active = dev

둘 다 테스트한 대로 잘 나오는 것을 확인할 수 있습니다.

 

4.7.2 Environment Properties

<springProperty>태그는 Logback 안에서 사용을 위해 스프링 Environment 으로부터 속성을 드러나도록(expose) 합니다.

  <springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
  defaultValue="localhost"/>
  <appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
  <remoteHost>${fluentHost}</remoteHost>
  ...
  </appender>

Environment로부터 fluentHost라는 이름으로 context scope에 를 등록합니다.

logback-spring.xml 의 source 는 kebab case (중간에 -를 사용) 로 명시되어야 합니다.


Reference

https://www.youtube.com/watch?v=uVR2iBEb474&list=PLfI752FpVCS8tDT1QEYwcXmkKDz-_6nm3&index=13&t=11s

https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/html/spring-boot-features.html#boot-features-custom-log-configuration

728x90