์ƒˆ์†Œ์‹

๋ฐ˜์‘ํ˜•
Spring

SLF4J + Log4j2 ์„ค์ •ํ•ด๋ณด๊ธฐ

  • -
๋ฐ˜์‘ํ˜•

โœ…SLF4J

Simple Logging Facade for Java

๐Ÿ’ก๋‹ค์–‘ํ•œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ถ”์ƒํ™”(์ธํ„ฐํŽ˜์ด์Šค) ์—ญํ• 
๐Ÿ’ก๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
๐Ÿ’ก์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฐํฌ์‹œ ์›ํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒ

 

Bridge

  • ๋‹ค๋ฅธ ๋กœ๊น… API๋กœ์˜ Logger ํ˜ธ์ถœ์„ SF4J ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ SLF4J API๊ฐ€ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ผ์ข…์˜ ์–ด๋Œ‘ํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

SLF4J API(์ธํ„ฐํŽ˜์ด์Šค)

  • ๋กœ๊น…์— ๋Œ€ํ•œ ์ถ”์ƒ ๋ ˆ์ด์–ด(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ๋กœ๊น… ๋™์ž‘์— ๋Œ€ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ถ”์ƒํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๋‹จ๋…์ ์œผ๋กœ ์“ฐ์ผ ์ˆ˜ ์—†๋‹ค.

Binding

  • SLF4J ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋กœ๊น… ๊ตฌํ˜„์ฒด์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์–ดํƒญํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
  • SJF4J API๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ Binding์œผ๋กœ ์—ฐ๊ฒฐ๋  Logger API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ API์— ํ•˜๋‚˜์˜ Binding์„ ๋‘์–ด์•ผ ํ•œ๋‹ค.

โœ…Log4j2

๐Ÿ’กlog4j๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ๋‚˜์˜จ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. logback๋ณด๋‹ค๋„ ์ตœ๊ทผ์— ๋‚˜์™”์œผ๋ฉฐ, SLF4J์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ณตํ•œ๋‹ค.
๐Ÿ’กLogback๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž๋™ ๋ฆฌ๋กœ๋“œ ๊ธฐ๋Šฅ๊ณผ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
๐Ÿ’กApache์— ๋”ฐ๋ฅด๋ฉด ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋น„๋™๊ธฐ ๋กœ๊ฑฐ์˜ ๊ฒฝ์šฐ Log4j 1.x ๋ฐ Logback๋ณด๋‹ค ์ฒ˜๋ฆฌ๋Ÿ‰์ด 18๋ฐฐ ๋” ๋†’๊ณ  ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋” ์งง๋‹ค.

โœ…slf4j + log4j2 ์ ์šฉํ•˜๊ธฐ(gradle)

ํ™˜๊ฒฝ

  1. Springboot 2.7
  2. java 11
  3. gradle
  4. lombok

build.gradleํŒŒ์ผ์—์„œ ์ข…์†์„ฑ ์ œ์™ธ

  • spring-boot-starter-web๋‚ด์— ์žˆ๋Š” logback์„ ์ œ์™ธ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋Š” ์˜์กด์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ถฉ๋Œ์„ ๋ฐœ์ƒ์‹œํ‚ฌ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
configurations {
		// ๋‚ด๋ถ€ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ(Logback)์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

application.properties ํŒŒ์ผ์— ๋กœ๊น… ์„ค์ •

# logging slf4j
# ์„ค์ •ํŒŒ์ผ ์œ„์น˜๋Š” log4j2/log4j2-local.xml๋กœ ์ง€์ •
logging:
  config: classpath:log4j2/log4j2-local.xml

resource/log4j2/log4j2-local.xml ์„ค์ •ํŒŒ์ผ ์ƒ์„ฑ

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

	<!--  ํŒŒ์ผ์ •๋ณด -->
    <Properties>
    	<Property name="infoLogNm">./logs/test/api_info.log</Property>
    	<Property name="errorLogNm">./logs/test/api_error.log</Property>
    	<Property name="authLogNm">./logs/test/api_auth.log</Property>
    	<Property name="jsonInfoLogNm">./logs/test/api_json_info.log</Property>
        <Property name="layoutPattern">%style{%d{UTF-8}}{black} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C}{bright,yellow}: %msg%n%throwable</Property>
    </Properties>

	<!-- ์ƒ์„ฑ ํŒŒ์ผ ์ •๋ณด -->
    <Appenders>
        <Console name="Console_Appender" target="SYSTEM_OUT" >
            <PatternLayout pattern="${layoutPattern}"/>
        </Console>
		
        <!-- info level -->
		<File name="File_Info_Appender">
			<fileName>${infoLogNm}</fileName>
			<PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
		</File>
        
		<!-- error level -->
		<File name="File_Error_Appender">
			<fileName>${errorLogNm}</fileName>
			<PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
		</File>
		
		<!-- auth management -->
		<File name="File_Auth_Appender">
			<fileName>${authLogNm}</fileName>
			<PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
		</File>
		
		<!-- json api info -->
		<File name="File_Json_info_Appender">
			<fileName>${jsonInfoLogNm}</fileName>
			<PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
		</File>
    </Appenders>
  
	<!-- ๋กœ๊ทธ ๋ฒ”์œ„  -->
    <Loggers>
		<!-- Spring ๊ด€๋ จ ๋กœ๊ทธ  -->
		<Logger name="org.springframework" additivity="false" level="INFO">
            <AppenderRef ref="Console_Appender" />
            <AppenderRef ref="File_Info_Appender"/>
            <AppenderRef ref="File_Error_Appender"/>
		</Logger>
		
		<!-- ํ”„๋กœ์ ํŠธ ๋กœ๊ทธ -->
		<logger name="com.pacakge.projectname" additivity="false" level="DEBUG">
            <AppenderRef ref="Console_Appender" />
            <AppenderRef ref="File_Info_Appender"/>
            <AppenderRef ref="File_Error_Appender"/>
		</logger>
       
		<!-- AUTH ๊ด€๋ จ ๋กœ๊ทธ  -->
		<logger name="com.pacakge.projectname.common.filter" additivity="false" level="INFO">
           	<AppenderRef ref="Console_Appender" />
           	<AppenderRef ref="File_Info_Appender"/>
           	<AppenderRef ref="File_Error_Appender"/>
		</logger>
		
		<!-- Default ์„ธํŒ… -->
	    <root additivity="false" level="OFF">
           	<AppenderRef ref="Console_Appender" />
		</root>
    </Loggers>
</Configuration>

 

์„ค์ • ์˜ต์…˜ ์„ค๋ช…(๊ณต์‹ ์ž๋ฃŒ, ํ•œ๊ธ€ ์ž๋ฃŒ)

Log4j – Configuring Log4j 2

egovframework:rte3:fdl:์„ค์ •_ํŒŒ์ผ์„_์‚ฌ์šฉํ•˜๋Š”_๋ฐฉ๋ฒ• [eGovFrame]

 

์‹ค์ œ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ

@SpringBootApplication
@EnableJpaAuditing
@Slf4j
public class SpringApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringApplication.class, args);
		log.info("๋กœ๊ทธ์ƒ์„ฑ");
	}

}

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.