logback-spring.xml 설정방법

공부는 혼자하는 거·2021년 8월 21일
2

Spring Tip

목록 보기
1/52

여러가지 logging 라이브러리가 있는데 Spring Boot 2.0에서는 사진과 같이

Java Util Logging, Log4j 2, Logback 을 기본적으로 사용할 수 있다.

다른 로깅 라이브러리로 갈아타기 편하기 위해 Facade 패턴을 적용한 Slf4j를 사용하기 위해 lombok을 디펜던시에 추가해야한다.

Lombok 이 제공하는 @Slf4j 어노테이션을 적용하면 log.debug() 만으로 쉽게 로그를 확인할 수 있다.

Spring Boot 에서는 logback 이 기본 로깅 프레임워크로, 의존하고 있는 slf4j api 와 bridge 모듈을 함께 포함하고 있어 로그 처리 관련 모듈을 추가하지 않아도 된다.

Springboot 에는 기본적으로 logback 이 포함되어 있습니다. 따라서 Springboot 의 *Application.java 파일의 main()함수를 호출하여 실행할 떄, IDE의 console 창에 나타나는 내용이 그것입니다.

https://linkeverything.github.io/springboot/spring-logging/

logback 관련된 설정을 찾다보면 logback.xml vs logback-spring.xml을 보게 되는데

Web Application이 시작되고 나서 classpath 내의 logback.xml을 뒤져서 환경 설정을 적용한다.

이 때는 Spring이 구동되기 이전이라 application.properties 내에 존재하는 값들을 불러올 수 없다.

logback-spring.xml에서는 Spring이 구동된 후라 application.properties에 있는 값들을 불러올 수 있다.

  • spring-boot-start-web 안에 spring-boot-starter-logging에 구현체가 있습니다.
  • Logback을 이용하여 logging 하기 위해서 필요한 주요 설정 요소로는 Logger, Appender, Encoder의 3가지가 있습니다.

Spring이나 일반 java 프로그램의 경우 logback.xml 파일을 resources 디렉터리에 만들어서 참조하지만 Spring Boot의 경우에는 아래 3가지 중 한 가지 방법을 선택합니다.

  • application.properties에 설정
  • resources/logback-spring.xml에 설정
  • resources/logback.xml에 설정

Log level

TRACE < DEBUG < INFO < WARN < ERROR

https://yjh5369.tistory.com/entry/스프링부트-Spring-Boot-로그-설정-Logback

https://perfectacle.github.io/2018/07/22/spring-boot-2-log/

https://goddaehee.tistory.com/206?category=367461

https://programmer93.tistory.com/46

[ 로깅 패턴 ]

%-5level : 로그 레벨, -5는 출력의 고정폭 값(5글자) (INFO, ERROR, DEBUG , 기타 등등이다.)

%d{날짜 형식 포맷} : 로그 기록시간 %d{yyyy-MM-dd HH:mm:ss} 을 사용하면 된다.

%thread : 현재 Thread 명

%F : 로깅을 발생시킨 파일 명

%M : 로깅을 발생시킨 메소드 명

%logger{length} : Logger name을 축약할 수 있다. length는 최대 자릿수이다 (0 = 무제한)

%line : 로깅이 발생된 라인 넘버%msg : - 로그 메시지

%n : 줄바꿈(new line)

이 외에도 여러 가지가 있다. ( http://logback.qos.ch/manual/layouts.html )

콘솔 색깔

logback-spring.xml 색깔 적용 예시

<!-- 이 속성 안 쓸거임 -->
//	<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){green} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
//	<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-default}"/>

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<withJansi>true</withJansi>

		<encoder>
			
			<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %green(%-5level) %logger{35}  %cyan(%logger{15}) -  %msg  %n</pattern>

		</encoder>
	</appender>

// %green(%-5level) %logger{35}  %cyan(%logger{15}) 요런 식으로 색깔을 줄 수 있다.
  • %highlight를 이용하여 로그 레벨에 따른 색을 줄수 있다.
  • %black%red%green%yellow%blue%magenta%cyan%white%gray%boldRed%boldGreen%boldYellow%boldBlue%boldMagenta%boldCyan%boldWhite를 이용 할 수도 있다.
  • 적용 범위는 ()로 %highlight([%-5level]) 이와 같이 사용 가능하다.

9. JANSI on Windows

While Unix-based operating systems such as Linux and Mac OS X support ANSI color codes by default, on a Windows console, everything will be sadly monochromatic.

Windows can obtain ANSI colors through a library called JANSI.

We should pay attention to the possible class loading drawbacks, though.

We must import and explicitly activate it in the configuration as follows:

Logback:

<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <withJansi>true</withJansi>
        <encoder>
            <pattern>[%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- more stuff -->
</configuration>

https://www.baeldung.com/spring-boot-logging

https://oingdaddy.tistory.com/257

https://hue9010.github.io/etc/logback-설정하기/

log4j2-spring.xml

https://hermeslog.tistory.com/451

Log4JDBC

https://congsong.tistory.com/23

spyLogDelegatorName does not allow to valid 뭐시기

나 같은 경우, log4jdbc.log4j2.properties 파일에 띄어쓰기가 적용되어서 에러가 터졌다.

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

https://hermeslog.tistory.com/454?category=302344

<?xml version="1.0" encoding="UTF-8"?>
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
<configuration scan="true" scanPeriod="60 seconds">

	<!--로그 파일 저장 위치 -->
	<springProfile name="dev">
		<property name="LOGS_PATH" value="./logs" />
	</springProfile>

	<!-- 이 속성 안 쓸거임 -->
	<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){green} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
	<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-default}" />

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<withJansi>true</withJansi>

		<encoder>

			<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %green(%-5level) %logger{35} %cyan(%logger{15}) - %msg %n</pattern>

		</encoder>
	</appender>

	<appender name="DAILY_ROLLING_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOGS_PATH}/logback.log</file>
		<encoder>
			<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level%logger{35} - %msg%n</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOGS_PATH}/logback.%d{yyyy-MM-dd}.%i.log.gz
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- or whenever the file size reaches 100MB -->
				<maxFileSize>5MB</maxFileSize>
				<!-- kb, mb, gb -->
			</timeBasedFileNamingAndTriggeringPolicy>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
	</appender>

	<logger name="net.lunalabs.central" level="INFO">
		<appender-ref ref="DAILY_ROLLING_FILE_APPENDER" />
	</logger>

	<!-- log4jdbc 옵션 설정 -->
	<logger name="jdbc" level="OFF" /> <!-- 커넥션 open close 이벤트를 로그로 남긴다. -->
	<logger name="jdbc.connection" level="OFF" /> <!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
	<logger name="jdbc.sqlonly" level="OFF" /> <!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
	<logger name="jdbc.sqltiming" level="DEBUG" /> <!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. -->
	<logger name="jdbc.audit" level="OFF" /> <!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
	<logger name="jdbc.resultset" level="OFF" /> <!-- SQL 결과 조회된 데이터의 table을 로그로 남긴다. -->
	<logger name="jdbc.resultsettable" level="OFF" />

	<root level="INFO">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

https://exhibitlove.tistory.com/302

logback의 설정 항목

Level TRACE - DEBUG - INFO - WARN - ERROR 순으로 오른쪽으로 갈수록 높은레벨. 출력 레벨 이상의 로그만 출력한다.

Appendar

이벤트마다 로그를 기록하는 기능을 처리하는 객체. 로그의 출력위치, 출력 형식등을 설정한다. logback-core모듈에는 3가지 기본 Appender이 있다.

  1. ConsoleAppender : 로그를 콘솔에 출력
  2. FileAppender : 로그를 지정 파일에 기록
  3. RollingFileAppender : FileAppender을 상속. 날짜와 용량등을 설정해서 패턴에 따라 로그가 각기 다른파일에 기록되게 할 수 있음.
profile
시간대비효율

0개의 댓글