프로그래밍/스프링 & 스프링 부트

[Spring] 스프링 Logback 설정 및 사용법

밍구몬 2020. 4. 3. 16:39

Logback

Logback은 SLF4J의 API를 사용하며, log4j의 아키텍쳐 기반으로 재작성 되었으고, 성능은 10배 정도 좋다고 합니다.

설명은 아랫분이 엄청 잘해주셔서 링크 남깁니다.

https://beyondj2ee.wordpress.com/2012/11/09/logback-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-reasons-to-prefer-logback-over-log4j/ 

 

pom.xml

Logback을 사용하기 위하여 pom.xml에 slf4j와 logback을 추가해 주면 됩니다.

         <!-- Logback --> 
         <dependency>                                    
                  <groupId>org.slf4j</groupId>                
                  <artifactId>jcl-over-slf4j</artifactId>     
                  <version>${jcloverslf4j.version}</version>  
         </dependency>
         
         <dependency>
                  <groupId>ch.qos.logback</groupId>
                  <artifactId>logback-classic</artifactId>
                  <version>1.2.3</version>
         </dependency>
                  
         <dependency>
                  <groupId>ch.qos.logback</groupId>
                  <artifactId>logback-core</artifactId>
                  <version>1.2.3</version>
         </dependency>

*logj4 관련 dependency는 모두 지워줘야 합니다. 로컬에서 테스트 할 때는 에러도 없었고, 로그도 잘 남았지만, 리눅스 서버에서 테스트 했을 때, 로그가 남지 않았었습니다.

 

logback.xml

src/main/resource에 logback.xml 파일을 만들어 주면 됩니다.

<?xml version="1.0" encoding="UTF-8"?>

<!-- 30초마다 설정 파일의 변경을 확인하고, 파일이 변경되면 다시 로딩 -->
<configuration scan="true" scanPeriod="30 seconds">
	<!-- logback이 정상 종료되도록 -->
	<shutdownHook />

	<!-- console에 로그 -->
	<appender name="STDOUT"
		class="ch.qos.logback.core.ConsoleAppender">
		<layout class="ch.qos.logback.classic.PatternLayout">
			<!-- <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %40logger{0} - %C - %replace(%msg){'[\r\n]+', 
				''} %n</Pattern> -->
			<Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%logger] - %replace(%msg){'[\r\n]+', ''} %n</Pattern>
		</layout>
	</appender>

	<!-- 로그 File에 저장 -->
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- <file>D:\\logs\\catalina.log</file> -->
		<file>./logs/catalina.log</file>
		<rollingPolicy
			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 일별로 로그파일이 생성된다. -->
			<!-- LOCAL -->
			<!-- <fileNamePattern>D:\\logs\\ming-%d{yyyy-MM-dd}.%i.log</fileNamePattern> -->
			<fileNamePattern>./logs/ming-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<!-- 5MB가 넘으면 새로운 로그파일이 생성된다. -->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>5MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<!-- 10건의 파일만 남기고 지난 로그파일은 삭제 된다. -->
			<maxHistory>10</maxHistory>
		</rollingPolicy>
		<encoder>
			<Pattern>
				%d{yyyy-MM-dd HH:mm:ss} %level [%logger] - %msg%n
			</Pattern>
		</encoder>
	</appender>

	<logger name="com.ming9.myPage" additivity="false">
		<level value="DEBUG" />
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
	</logger>

	<logger name="org.springframework">
		<level value="INFO" />
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
	</logger>

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

</configuration>

configuration의 scan을 true로 설정하고 scanperiod를 입력해 주면 서버를 재시작 하지 않아도 파일을 다시 읽어와 서버를 재시작 하지 않아도 되는 장점이 있습니다.

appender Class

ch.qos.logback.core.ConsoleAppender : console에 로그를 찍기 위하여 사용

ch.qos.logback.core.FileAppender : 파일에 로그를 찍기 위하여 시용

ch.qos.logback.core.rolling.RollingFileAppender : 여러개의 파일을 순회하면서 로그를 찍기 위하여 사용

ch.qos.logback.classic.net.SMTPAppender : 로그를 메일에 보내기 위하여 사용

ch.qos.logback.classic.db.DBAppender : 데이터베이스에 로그를 찍기 위하여 사용

Pattern

%d : 로그 기록 시간

%-5level : %level만 사용해도 되며, -5는 5글자 고정으로 출력하기 위함

%logger : logger 이름. %logger{20} 과 같이 사용할 수도 있으며, {20}을 붙이게 되면 최대 20자리로 출력

%replace : replace으로 내용을 변경 할 수 있음

%msg : 메세지 출력 ex) log.info("test") 를 하게 되면 test가 출력됨.

%n : 줄바꿈

<logger>

logger는 name에 대상의 이름을 설정하고, level을 지정해 줍니다.

level은 TRACE > DEBUG > INFO > WARN > ERROR > OFF 가 있으며, 

해당 레벨 이하는 출력하지 않습니다.

예를 들어 level을 INFO 로 설정해주게 되면 INFO, WARN, ERROR 관련 로그만 나오게 되며, TRACE, DEBUG의 로그는 나오지 않습니다.

 

additivity : additivity는 Default로 true이며, false로 설정할 경우 logger에서 설정한 name의 하위 로그는 찍지 나오지 않습니다.

<root>

logger의 에서 설정한 내용에서 한번 더 걸러낸다고 생각하시면 됩니다. logger에서는 DEBUG까지 출력하도록 설정했지만,

root에서 INFO로 설정한다면 INFO 아래의 로그는 나오지 않습니다.