ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

KH

230531 (Log_๋กœ๊ทธ)

ๅๆœˆ 2023. 5. 31. 12:16

๐Ÿ’พ Log (๋กœ๊ทธ)

๋“œ๋ž˜๊ทธ ํ•œ ๋ถ€๋ถ„์ด Log

๏ผ์›ํ•˜๋Š” ํŒŒ์ผ, DB ํ˜น์€ ์ฝ˜์†”์— ์ฐ์„ ์ˆ˜ ์žˆ๋‹ค.

ใ€€๋”ฐ๋ผ์„œ ์ดํ›„ sysout ๋ณด๋‹ค ๋” ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ

๏ผprintln ๋ณด๋‹ค Log๊ฐ€ ๋” ๊ฐ€๋ฒผ์›€

 

// ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์ž์ฃผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์ง€๋งŒ(์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊ทธ์ธ ๋“ฑ), Log๋Š” ์ž์œ 

// ํ•˜์ง€๋งŒ ์˜คํƒ€๋ฅผ ๋นจ๊ฐ„ ์ค„๋กœ ์•Œ๋ ค์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์žก๊ธฐ ํž˜๋“ฆ

 

 

Log๋Š” Spring Legacy Project๋ฅผ ์ฒ˜์Œ ๋งŒ๋“ค ๋•Œ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.

package rose.mary.spring;

// import๋Š” ์ƒ๋žต

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/home.do", method = RequestMethod.GET) // ์•ž์— / ์žˆ์–ด๋„๋˜๊ณ  ์—†์–ด๋„ ๋จ
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home";
	}
	
}

โ–ผ

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

โ‰ซ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์„ ํƒ (ํ•ด๋‹น ์ฝ”๋“œ๋Š” HomeContoller์— ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋„ฃ๋Š” ๊ฒƒ ๋ฟ ์„ ํƒ์€ ์ž์œ )

 

 

Log ๊ด€๋ฆฌํ•˜๋Š” ๊ณณ

 

ํ•ด๋‹น xml ํŒŒ์ผ์„ ์ž์„ธํžˆ ๋œฏ์–ด๋ณด๋ฉด?

<appender>

	<!-- 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>

โ‰ซ <appender>์—์„œ ConsoleAppender๋ฅผ ์ฐธ์กฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ˜์†”์— ์ฐํž˜


ConsoleAppender : ๋กœ๊ทธ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ Appender
JDBCAppender : ๋กœ๊ทธ๋ฅผ DB์— ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ Appender
FileAppender : ๋กœ๊ทธ๋ฅผ ํŒŒ์ผ์— ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ Appender

 

FileAppender ์˜ ์น˜๋ช…์ ์ธ ๋‹จ์ 

๋กœ๊ทธ๋ผ๋Š” ๊ธฐ๋ก์€ ํŒŒ์ผ ์•ˆ์— ๋‹ด๊ธฐ๊ฒŒ ๋˜๋Š”๋ฐ, ์Œ“์ด๋ฉด ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง

๋”ฐ๋ผ์„œ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ณ , ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ์ปดํ“จํ„ฐ์—์„œ ํŒŒ์ผ์„ ๋ชป ์—ด ์ˆ˜ ์žˆ๋‹ค.

โ‰ซ ๋”ฐ๋ผ์„œ RollingFileAppender๋กœ FileAppender์˜ ๋‹จ์ ์„ ๋ณด์™„

 

RollingFileAppender : FileAppender ๋ณด์™„, ์ผ์ • ์กฐ๊ฑด ํ›„ ๊ธฐ์กด ํŒŒ์ผ์„ ๋ฐฑ์—… ํŒŒ์ผ๋กœ ๋ฐ”๊พธ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ณด๊ด€


Layout : ๋กœ๊ทธ๋ฅผ ์–ด๋–ค ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•  ์ง€ ๊ฒฐ์ •

DateLayout, HTMLLayout, PatternLayout(๋””๋ฒ„๊น… ์ ํ•ฉ), SimpleLayout, XMLLayout


%p : debug, info, warn, error, fatal ๋“ฑ์˜ priority ์ถœ๋ ฅ
%m : ๋กœ๊ทธ ๋‚ด์šฉ ์ถœ๋ ฅ
%d : ๋กœ๊ทธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ๊ฐ„ ์ถœ๋ ฅ(ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ๋А๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ)
 ํฌ๋งท์€ SimpleDataFomat์— ๋”ฐ๋ฅธ ํฌ๋งทํŒ…์„ ํ•˜๋ฉด ๋จ
%t : ๋กœ๊ทธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋œ ์“ฐ๋ ˆ๋“œ ์ด๋ฆ„ ์ถœ๋ ฅ
%% : % ์ถœ๋ ฅ
%n : ๊ฐœํ–‰๋ฌธ์ž ์ถœ๋ ฅ
%c : ์นดํ…Œ๊ณ ๋ฆฌ(package) ์ถœ๋ ฅ
%c{n} : n(์ˆซ์ž)๋งŒํผ์˜ pakage๋ฅผ ๊ฐ€์žฅ ํ•˜๋‹จ๋ถ€ํ„ฐ ์—ญ์œผ๋กœ ์ถœ๋ ฅ
์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ a.b.c๋ผ๊ณ  ๋˜์–ด์žˆ๋‹ค๋ฉด %c{2}์ผ ๋•Œ b.c ์ถœ๋ ฅ
%C : ํด๋ž˜์Šค ๋ช… ์ถœ๋ ฅ(์ˆซ์ž ๋ถ™์ผ ์ˆ˜ ์žˆ๊ณ  ํŒจํ‚ค์ง€๊นŒ์ง€ ๊ฐ™์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ) 
%F : ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ ๋ช… ์ถœ๋ ฅ
%l : ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ caller์˜ ์ •๋ณด ์ถœ๋ ฅ
%L : ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ caller์˜ ๋ผ์ธ ์ˆ˜ ์ถœ๋ ฅ
%M : ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฉ”์†Œ๋“œ ๋ช… ์ถœ๋ ฅ
%r : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ํ›„ ๋ถ€ํ„ฐ ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์˜ ์‹œ๊ฐ„ ์ถœ๋ ฅ(๋ฐ€๋ฆฌ์„ธ์ปจ)

 

 

<Application Loggers>

	<!-- Application Loggers -->
	<!-- ๋“ฑ๋ก๋œ ๋กœ๊ทธ๋“ค์„ ๋ฐ›์•„์ฃผ๋Š” ์—ญํ•  -->
	<logger name="rose.mary.spring">
		<level value="info" />
	</logger>

โ‰ซ HomeController ๋˜ํ•œ ํ•ด๋‹น ๋กœ๊ทธ๊ฐ€ ๋ฐ›์Œ

	<!-- 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>

 

๋ ˆ๋ฒจ์˜ 5๊ฐ€์ง€ ๋‹จ๊ณ„

Debug(์ถ”์ ) < Info(์ •๋ณด์„ฑ ๋ฉ”์„ธ์ง€) < Warn(์—๋Ÿฌ๋Š” ์•„๋‹˜) < Error(์—๋Ÿฌ) < Fatal(์‹ฌ๊ฐํ•œ ์—๋Ÿฌ) 

โ‰ซ ์„ค์ •ํ•œ ๋ ˆ๋ฒจ ์ด์ƒ๋งŒ ํ™”๋ฉด์— ๋ณด์—ฌ์คŒ. (๋งŒ์•ฝ Info์ผ ๊ฒฝ์šฐ Debug๋Š” ํ•ด๋‹น ์—†์Œ)

fatal : ์•„์ฃผ ์‹ฌ๊ฐํ•œ ์—๋Ÿฌ (์‚ฌ์šฉ์ž๊ฐ€ ๋“ฑ๋กํ•  ์ˆ˜ ์—†์Œ / ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ)
error : ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘ ๋ฌธ์ œ ๋ฐœ์ƒ
warn : ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ํ—ค๋Š” ๋ฌธ์ œ ์—†์ง€๋งŒ ํ–ฅํ›„ ์‹œ์Šคํ…œ ์—๋Ÿฌ์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๊ณ ์„ฑ ๋ฉ”์„ธ์ง€
info : ์ƒํƒœ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์€ ์ •๋ณด์„ฑ ๋ฉ”์„ธ์ง€
debug : ๋””๋ฒ„๊ทธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„ธ์ง€
trace : ๋””๋ฒ„๊ทธ๊ฐ€ ๋„ˆ๋ฌด ๊ด‘๋ฒ”์œ„ํ•˜๋ฏ€๋กœ ๊ฒฝ๋กœ ์ถ”์ ๊ณผ ๊ฐ™์€ ์ƒ์„ธํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉ

 

 

<Root Logger>

	<!-- Root Logger -->
	<!-- ๋ชจ๋“  ์ž์‹ ๋กœ๊ทธ๋“ค์˜ ์ถœ๋ ฅ์ด rootLogger๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง -->
	<!-- ๋ถ€๋ชจ ๋กœ๊ทธ / <logger> = ์œ„์˜ ๋กœ๊ทธ๋“ค์€ ์ž์‹ ๋กœ๊ทธ -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>

โ‰ซ ๋ชจ๋“  ๋กœ๊ทธ๋“ค์€ ๋ฃจํŠธ ๋กœ๊ทธ๋ฅผ ํ•œ ๋ฒˆ ๊ฑฐ์นœ ํ›„, appender-ref๋ฅผ ์ฐธ์กฐํ•ด ์ฝ˜์†”์— ์ฐํž˜


 

์ง์ ‘ ํ•ด ๋ณด๊ธฐ

 

package rose.mary.spring.common.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Log4jTest {
	private Logger logger = LoggerFactory.getLogger(Log4jTest.class);
	
	public static void main(String[] args) {
		new Log4jTest().test();
	}
	
	public void test() {
		logger.trace("trace๋กœ๊ทธ");
		logger.debug("debug๋กœ๊ทธ");
		logger.info("info๋กœ๊ทธ");
		logger.warn("warn๋กœ๊ทธ");
		logger.error("error๋กœ๊ทธ");
//		logger.fatal("fatal๋กœ๊ทธ"); → ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณต์น˜ ์•Š์Œ
	}
}

โ–ผ

level value="debug"์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ด์ƒ๋งŒ ์ฐํž˜

โ‰ซ ๋‘ ๋ฒˆ ์ฐํžˆ๋Š” ์ด์œ ๋Š” appender-ref๋ฅผ ๋‘ ๋ฒˆ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ

 

 

ํ˜„์žฌ ์ƒํ™ฉ

	<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" /> -->
			<param name="ConversionPattern" value="โ™ฌ %-5p : %c โ–ถ %M โ–ถ %m%n" />
		</layout>
	</appender>
    
    <logger name="rose.mary.spring" additivity="false">
		<level value="debug" />
		<appender-ref ref="console"/>
	</logger>
    
    <root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>
    
//   logger์™€ rootLogger์—์„œ ๋‘˜ ๋‹ค appender(console)์„ ์ฐธ์กฐ ์ค‘์ด๋ผ
//   ์ฝ˜์†”์— ๋‘ ๋ฒˆ์”ฉ ๊ฒฐ๊ณผ๊ฐ€ ์ฐํžˆ๊ฒŒ ๋  ์ˆ˜๋ฐ–์— ์—†๋‹ค.
//   โ˜… ๋”ฐ๋ผ์„œ additibity="false" ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ์คŒ.

 

 

rootLogger์—๊ฒŒ ์•ˆ ๊ฐ€๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ• (ํ•œ ๋ฒˆ๋งŒ ์ฐํžˆ๊ฒŒ!)

โ–ผ

 


๋กœ๊ทธ์ธ ํ•  ๋•Œ ์ฐ์–ด๋ณด๊ธฐ

log4j.xml

 

MemberController

 

+

์ธํ„ฐ์…‰ํ„ฐ ๋ถ„๋ฆฌํ•ด๋ณด๊ธฐ

Log4jInterceptor.java

 

log4j.xml

 

member.context.xml

 

โ–ผ

โ‰ซ ์ฝ˜์†”๊ณผ ํŒŒ์ผ์— ์ถœ๋ ฅ๋˜๋Š” ๋กœ๊ทธ๋ฅผ ๋ถ„๋ฆฌํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—

๋” ์ด์ƒ ๋ฉ”๋ชจ์žฅ์— ๋กœ๊ทธ์ธ ์™ธ์˜ ํšŒ์› ๋“ฑ๋ก ํŽ˜์ด์ง€ log๋Š” ์ฐํžˆ์ง€ ์•Š๋Š”๋‹ค.

'KH' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

230605 (SpringBoot)  (0) 2023.06.05
230601 (Spring AOP)  (0) 2023.06.01
230530 (Interceptor)  (0) 2023.05.30
230512 (UML)  (0) 2023.05.12
230511 (Spring + Ajax + JSON + GSON)  (0) 2023.05.11
๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
๊ธ€ ๋ณด๊ด€ํ•จ