[Spring] logback(로그백 로그사용하기)

Posted by 김성철

Spring - logback(로그백 로그사용하기)

참고 링크

https://hochoon-dev.tistory.com/entry/JAVA-Logback-%EC%82%AC%EC%9A%A9%EB%B2%95  
https://thinkwarelab.wordpress.com/2016/11/18/java%EC%97%90%EC%84%9C-logback%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B9%85logging-%EC%82%AC%EC%9A%A9%EB%B2%95/   ## logback 설정  
로그를 남겨주는 라이브러리, log4j 와 비슷함  
* 스프링 5 버전부터는 web.xml에서 log4j 리스너 설정이 불가능  
* 3버전에서 이미 지원중지한다고 나왔었고, 4버전까지만 지원  

logback 버전 설정

https://www.devkuma.com/docs/logback/  
java 1.8에서는 logback 버전을 1.2.x 버전을 사용  
위 logback 버전과 맞춘 slf4j 버전은 1.7.x 버전  

pom.xml에 라이브러리 추가

=====================================================================  
  
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->  
<dependency>  
	<groupId>ch.qos.logback</groupId>  
	<artifactId>logback-core</artifactId>  
	<version>1.2.12</version>  
</dependency>  
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->  
<dependency>  
	<groupId>ch.qos.logback</groupId>  
	<artifactId>logback-classic</artifactId>  
	<version>1.2.12</version>  
</dependency>  
  
<!-- https://mvnrepository.com/artifact/org.slf4j/jcl-over-slf4j -->  
<dependency>  
	<groupId>org.slf4j</groupId>  
	<artifactId>jcl-over-slf4j</artifactId>  
	<version>1.7.36</version>  
</dependency>  
  
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->  
<dependency>  
	<groupId>org.slf4j</groupId>  
	<artifactId>slf4j-nop</artifactId>  
	<version>1.7.36</version>  
</dependency>  
  
=====================================================================  

pom.xml 에서 기존 라이브러리 제거

logback을 사용하기위해 제거해야 하며 제거하지 않을시에 오류 발생  
  
=====================================================================  
<dependency>  
	<groupId>org.slf4j</groupId>  
	<artifactId>slf4j-api</artifactId>  
	<version>${org.slf4j-version}</version>  
</dependency>  
<dependency>  
	<groupId>org.slf4j</groupId>  
	<artifactId>jcl-over-slf4j</artifactId>  
	<version>${org.slf4j-version}</version>  
	<scope>runtime</scope>  
</dependency>  
<dependency>  
	<groupId>org.slf4j</groupId>  
	<artifactId>slf4j-log4j12</artifactId>  
	<version>${org.slf4j-version}</version>  
	<scope>runtime</scope>  
</dependency>  
<dependency>  
	<groupId>log4j</groupId>  
	<artifactId>log4j</artifactId>  
	<version>1.2.15</version>  
	<exclusions>  
		<exclusion>  
			<groupId>javax.mail</groupId>  
			<artifactId>mail</artifactId>  
		</exclusion>  
		<exclusion>  
			<groupId>javax.jms</groupId>  
			<artifactId>jms</artifactId>  
		</exclusion>  
		<exclusion>  
			<groupId>com.sun.jdmk</groupId>  
			<artifactId>jmxtools</artifactId>  
		</exclusion>  
		<exclusion>  
			<groupId>com.sun.jmx</groupId>  
			<artifactId>jmxri</artifactId>  
		</exclusion>  
	</exclusions>  
	<scope>runtime</scope>  
</dependency>-->  
  
=====================================================================  

logback 설정파일 추가

경로 : src₩main₩resources₩logback.xml  
main/resources 밑에 logback.xml 설정 파일 생성  
- Logback에서 RollingFileAppender를 사용하여 하루마다 새로운 로그 파일을 생성  
  
=====================================================================  
<?xml version="1.0" encoding="UTF-8"?>  
<configuration>  
	<!-- Console Appender -->  
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
		<encoder>  
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>  
		</encoder>  
	</appender>  
  
	<!-- Rolling File Appender -->  
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
		<file>nhn-code-test.log</file>  
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
			<fileNamePattern>nhn-code-test-%d{yyyy-MM-dd}.log</fileNamePattern>  
			<maxHistory>30</maxHistory>  
		</rollingPolicy>  
		<encoder>  
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>  
		</encoder>  
	</appender>  
  
	<!-- Root Logger -->  
	<root level="info">  
		<appender-ref ref="CONSOLE" />  
		<appender-ref ref="FILE" />  
	</root>  
</configuration>  
=====================================================================  
  
위의 예제에서는 FILE Appender를 RollingFileAppender로 변경하였습니다.  
그리고 rollingPolicy 요소를 추가하여 롤링 정책을 설정합니다.  
TimeBasedRollingPolicy는 시간 기반 롤링을 수행하며, fileNamePattern 속성을 사용하여 로그 파일 이름 패턴을 지정합니다.  
위의 예제에서는 logfile-%d{yyyy-MM-dd}.log로 지정하여 날짜별로 로그 파일이 생성되도록 설정하였습니다.  
  
또한, maxHistory 속성을 사용하여 유지할 과거 로그 파일의 최대 개수를 지정할 수 있습니다.  
위의 예제에서는 maxHistory를 30으로 설정하여 최근 30일치의 로그 파일을 유지합니다.  
  
이렇게 설정을 변경하면 매일 새로운 날짜로 시작하는 로그 파일이 생성되며, 과거 로그 파일은 설정한 maxHistory 값에 따라 유지됩니다.  

사용방법

* 추후 기재, 아직 여기는 찾아봐야함  

오류

- 참고 링크  
	https://www.slf4j.org/codes.html##noProviders  
	=====================================================================  
	Placing one (and only one) of the many available providers such as slf4j-nop.jar slf4j-simple.jar, slf4j-reload4j.jar, slf4j-jdk14.jar or logback-classic.jar on the class path should solve the problem.  
	※ 번역  
	slf4j-nop.jar slf4j-simple.jar, slf4j-reload4j.jar, slf4j-jdk14.jar 또는 logback-classic.jar와 같은 사용 가능한 많은 제공자 중 하나만 클래스 경로에 배치하면 문제가 해결됩니다.  
	=====================================================================  
- 오류메시지  
	=====================================================================  
	SLF4J: No SLF4J providers were found.  
	SLF4J: Defaulting to no-operation (NOP) logger implementation  
	SLF4J: See https://www.slf4j.org/codes.html##noProviders for further details.  
	=====================================================================  
  
- 해결  
	slf4j-nop 라이브러리 추가  
	=====================================================================  
	<dependency>  
		<groupId>org.slf4j</groupId>  
		<artifactId>slf4j-nop</artifactId>  
		<version>2.0.7</version>  
	</dependency>  
	=====================================================================