ํฐ์คํ ๋ฆฌ ๋ทฐ
๐พ 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๋ก๊ทธ"); → ๋ฉ์๋๋ฅผ ์ ๊ณต์น ์์
}
}
โผ
โซ ๋ ๋ฒ ์ฐํ๋ ์ด์ ๋ 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 |