본문 바로가기
Java/Spring

Spring) Slf4j - 파일로 로그 출력하기

by 박채니 2022. 8. 24.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


PSA (Portable Service Abstraction)

* 스프링은 다른 여러 모듈을 사용함에 있어서 별도의 추상화 레이어 제공

* 예를 들어 JPA를 사용할 때에서 Spring JPA를 사용하여 추상화 하므로 실제 구현에 있어서 Hibernate를 사용하든 EclipseLink를 사용하든 사용자는 이 모듈의 의존 없이 프로그램에 집중가능.

 

Slf4jTest

@Slf4j
public class Slf4jTest {
	//private static final Logger log = LoggerFactory.getLogger(Slf4jTest.class);
	
	public static void main(String[] args) {
//		log.fatal("fatal"); // log4j에 있는 fatal 레벨이 slf4j에는 존재하지 않음!
		log.error("error");
		log.warn("warn");
		log.info("info");
		log.debug("debug");
		log.trace("trace");
	}
}

@콘솔출력값
ERROR: com.ce.spring2.slf4j.Slf4jTest - error
WARN : com.ce.spring2.slf4j.Slf4jTest - warn
INFO : com.ce.spring2.slf4j.Slf4jTest - info
DEBUG: com.ce.spring2.slf4j.Slf4jTest - debug

Log4j에 있는 fatal 레벨은 Slf4j에는 존재하지 않습니다.

 

log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="com.ce.spring2">
		<level value="debug" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

com.ce.spring2의 level이 debug로 설정되어있기 때문에 trace은 출력되지 않은 것을 확인할 수 있습니다.

<root>는 해당하지 않는 로그를 Root Logger에 설정합니다.

 

※ slf4j 관련 포스팅

https://hello-bryan.tistory.com/331

 

[SLF4J] slf4j 알고가기 + Logback

SLF4J Simple Logging Facade For Java SLF4J는 다양한 Logging Framework(java.util.logging, logback, log4j)의 추상화를 제공합니다. SLF4J는 Compile 시 하나의 logging framework와 binding 해줍니다. SLF4J..

hello-bryan.tistory.com

 


파일로 출력

 

서버 더블클릭 - Open launch configuration - Arguments - Dcatalina.base 경로 복사 - 파일탐색기에서 붙여넣기

이곳에 로그들을 (hello-spring.log.2022-08-23) 파일로 모아 관리하려고 합니다.

 

appender

<appender name="fileLogger" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="file" value="${catalina.base}/logs/hello-spring/hello-spring.log" />
    <param name="append" value="true" />
    <param name="dataPattern" value=".yyyy-MM-dd"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p:[%d{yyyy-MM-dd HH:mm:ss}]%F:%L - %m%n">
    </layout>
</appender>

${catalina.base} → 서버에서 복사한 경로와 동일

 

Root Logger 

<!-- Root Logger -->
<root>
    <priority value="warn" />
    <appender-ref ref="console" />
    <appender-ref ref="fileLogger" />
</root>

 

로그들을 남긴 후 파일 경로 확인

hello-spring 폴더가 생긴 것을 확인할 수 있습니다.

 

hello-spring 폴더

log들을 담은 파일이 생성된 것을 확인할 수 있습니다.

 

hello-spring.log

INFO :[2022-08-23 13:54:47]ContextLoader.java:271 - Root WebApplicationContext: initialization started
INFO :[2022-08-23 13:54:48]ContextLoader.java:307 - Root WebApplicationContext initialized in 1641 ms
INFO :[2022-08-23 13:54:48]FrameworkServlet.java:525 - Initializing Servlet 'appServlet'
INFO :[2022-08-23 13:54:49]FrameworkServlet.java:547 - Completed initialization in 908 ms
DEBUG:[2022-08-23 13:54:49]DemoController.java:100 - @ModelAttribute - common 호출!
DEBUG:[2022-08-23 13:54:50]BaseJdbcLogger.java:159 - ==>  Preparing: select * from dev order by no 
DEBUG:[2022-08-23 13:54:51]BaseJdbcLogger.java:159 - ==> Parameters: 
DEBUG:[2022-08-23 13:54:51]BaseJdbcLogger.java:159 - <==      Total: 3
INFO :[2022-08-23 13:54:51]DemoController.java:174 - list = [Dev(no=1, name=박채똥, career=1, email=chaeDdong@gmail.com, gender=M, lang=[Java, Python], createdAt=2022-08-18T12:39:15), Dev(no=4, name=신사동, career=2, email=aaa@abc.com, gender=M, lang=[Python], createdAt=2022-08-18T12:41:18), Dev(no=5, name=유재석, career=1, email=aaa@abc.com, gender=M, lang=[Javascript], createdAt=2022-08-18T12:43:50)]
DEBUG:[2022-08-23 13:54:56]BaseJdbcLogger.java:159 - ==>  Preparing: select * from member where member_id = ? 
DEBUG:[2022-08-23 13:54:56]BaseJdbcLogger.java:159 - ==> Parameters: honggd(String)
DEBUG:[2022-08-23 13:54:56]BaseJdbcLogger.java:159 - <==      Total: 1
INFO :[2022-08-23 13:54:56]HomeController.java:27 - Welcome home! The client locale is ko_KR.
DEBUG:[2022-08-23 13:55:00]DemoController.java:100 - @ModelAttribute - common 호출!
DEBUG:[2022-08-23 13:55:00]BaseJdbcLogger.java:159 - ==>  Preparing: select * from dev order by no 
DEBUG:[2022-08-23 13:55:00]BaseJdbcLogger.java:159 - ==> Parameters: 
DEBUG:[2022-08-23 13:55:00]BaseJdbcLogger.java:159 - <==      Total: 3
INFO :[2022-08-23 13:55:00]DemoController.java:174 - list = [Dev(no=1, name=박채똥, career=1, email=chaeDdong@gmail.com, gender=M, lang=[Java, Python], createdAt=2022-08-18T12:39:15), Dev(no=4, name=신사동, career=2, email=aaa@abc.com, gender=M, lang=[Python], createdAt=2022-08-18T12:41:18), Dev(no=5, name=유재석, career=1, email=aaa@abc.com, gender=M, lang=[Javascript], createdAt=2022-08-18T12:43:50)]
DEBUG:[2022-08-23 13:55:01]DemoController.java:100 - @ModelAttribute - common 호출!
DEBUG:[2022-08-23 13:55:01]BaseJdbcLogger.java:159 - ==>  Preparing: select * from dev where no = ? 
DEBUG:[2022-08-23 13:55:01]BaseJdbcLogger.java:159 - ==> Parameters: 4(Integer)
DEBUG:[2022-08-23 13:55:01]BaseJdbcLogger.java:159 - <==      Total: 1
DEBUG:[2022-08-23 13:55:03]DemoController.java:100 - @ModelAttribute - common 호출!
DEBUG:[2022-08-23 13:55:03]BaseJdbcLogger.java:159 - ==>  Preparing: update dev set name = ?, career = ?, email = ?, gender = ?, lang = ? where no = ? 
DEBUG:[2022-08-23 13:55:03]BaseJdbcLogger.java:159 - ==> Parameters: 신사(String), 2(Integer), aaa@abc.com(String), M(String), Python(String), 4(Integer)
DEBUG:[2022-08-23 13:55:03]BaseJdbcLogger.java:159 - <==    Updates: 1
DEBUG:[2022-08-23 13:55:04]DemoController.java:100 - @ModelAttribute - common 호출!
DEBUG:[2022-08-23 13:55:04]BaseJdbcLogger.java:159 - ==>  Preparing: select * from dev order by no 
DEBUG:[2022-08-23 13:55:04]BaseJdbcLogger.java:159 - ==> Parameters: 
DEBUG:[2022-08-23 13:55:04]BaseJdbcLogger.java:159 - <==      Total: 3
INFO :[2022-08-23 13:55:04]DemoController.java:174 - list = [Dev(no=1, name=박채똥, career=1, email=chaeDdong@gmail.com, gender=M, lang=[Java, Python], createdAt=2022-08-18T12:39:15), Dev(no=4, name=신사, career=2, email=aaa@abc.com, gender=M, lang=[Python], createdAt=2022-08-18T12:41:18), Dev(no=5, name=유재석, career=1, email=aaa@abc.com, gender=M, lang=[Javascript], createdAt=2022-08-18T12:43:50)]

이처럼 로그들이 해당 파일에 모아진 것을 확인할 수 있습니다.

 

※ 설정한 파일 패턴은 추후 확인 가능!