egovframework log4j 2 ์ค์ ๐ง
log4j 2๋ ๊ธฐ์กด Properties ํ์ผ ํ์์ ํ๊ฒฝ ์ค์ ์ ์ง์ํ์ง ์์ผ๋ฉฐ, XML(log4j2.xml) ํน์ JSON(log4j2.json or log4j2.jsn) ํ์ผ ํ์์ ํ๊ฒฝ ์ค์ ๋ง ๊ฐ๋ฅํ๋ค.
Log4j2 xml configuration๐ง
Xml ํ์ผ(log4j 2.xml)์ ์์ฑํ๊ณ , WEB-INF/classes ํ์์ ํฌํจ ๋ ์ ์๋๋ก ์์น์ํด
Log4j 2๊ฐ ์ด๊ธฐํ๋ ๋ ์๋์ผ๋ก ์ ์ค์ ํ์ผ์ ์ฝ์.
XML ํ์ผ ์ ์
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!-- Appender, Layout ์ค์ -->
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout/>
</Console>
<!-- ๋ก๊ทธ๋ฅผ ํ์ผ๋ก ๋จ๊น-->
<File name="file" fileName="./logs/file/sample.log" append="false">
<PatternLayout pattern="%d %5p [%c] %m%n"/>
</File>
</Appenders>
<!-- Logger ์ค์ -->
<Loggers>
<Logger name="egovLogger" level="DEBUG" additivity="false">
<AppenderRef ref="console"/>
<AppenderRef ref="file"/>
</Logger>
<Rootlevel="ERROR">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
Logger ์ค์ ๐ฉ๐ฆฐ
Logger๋ ๋ก๊น ์์ ์ ์ํํ๋ Log4j ์ฃผ์ฒด๋ก, Logger ์ค์ ์ ์ ์ธํ ๋ชจ๋ ๋ก๊น ๊ธฐ๋ฅ์ด ์ด Logger๋ฅผ ํตํด ์ฒ๋ฆฌ๋จ.
๊ฐ๋ฐ์๋ ์ดํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ฌ์ฉํ Logger๋ฅผ ์ ์ํด์ผ ํ๋ฉฐ, Log Level๊ณผ Appender ์ค์ ์ ๋ฐ๋ผ ์ถ๋ ฅ ๋์๊ณผ ์์น๊ฐ ๊ฒฐ์ ๋จ
Logger ์ ์ธ๊ณผ ์ ์
Root Logger๋ฅผ ํฌํจํ ๋ชจ๋ Logger๋ ์์ ์์์ธ <Loggers> ์๋์ ์ ์ธํด์ผ ํจ.
<Loggers>
<Logger>...</Logger>
<Root>...</Root>
</Loggers>
Root Logger๋ <Root> ์์๋ก, ์ผ๋ฐ Logger๋ <Logger> ์์๋ก ๋ถ๋ฅํด์ ์ ์ํ๋ค.
Logger๋ ํ๋ ์ด์ ์ ์ํ ์ ์์ผ๋ฉฐ, Root ์์๋ฅผ ๋ฐ๋์ ์ ์ํด์ผํ๋ค.
<Loggers>
<!-- attribute: name(Logger๋ช
), level(Log Level), additivity(์ค๋ณต๋ก๊น
์ฌ๋ถ, true or false) -->
<!-- element: AppenderRef(Appender๋ช
) -->
<Logger name="X.Y" level="INFO" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Logger name="X" level="DEBUG" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Rootlevel="ERROR">
<AppenderRef ref="console"/>
</Root>
</Loggers>
์์์ AppenderRef ์์์ ์ง์ ํ "console" Appender๊ฐ ์๋ ๊ฒฝ์ฐ, ์ ์์ ์ธ ๋ก๊น ์ด ์ํ๋ ์ ์์.
Logger ํธ์ถ
Logger๋ ์ฝ๋ ๋ด์์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํธ์ถํ ์ ์์.
// ์์
package egovframe.sample;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LoggerTest {
// (1) Logger Name์ด "egovframe.sample.LoggerTest"์ธ Logger ์ค์ ์ ๋ฐ๋ฅด๋ Logger ๊ฐ์ฒด ์์ฑ
Logger logger1 = LogManager.getLogger();
// (2) ์์ ๋์ผ
Logger logger2 = LogManager.getLogger(LoggerTest.class);
// (3) Logger Name์ด "X"์ธ Logger์ค์ ์ ๋ฐ๋ฅด๋ Logger ๊ฐ์ฒด ์์ฑ
Logger logger3 = LogManager.getLogger("X");
}
(1), (2)๊ณผ ๊ฐ์ด Logger Name์ ํด๋นํ๋ Logger๊ฐ ์ค์ ํ์ผ(log4j2.xml)์ ์๋ ๊ฒฝ์ฐ, ๋ค์ Logger Hierarchy ๊ท์น์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก (1), (2)์์ ์์ฑ๋ Logger ๊ฐ์ฒด๋ Root Logger ์ค์ ์ ๋ฐ๋ฅธ๋ค.
Logger Hierarchy
์ฌ์ฉ์๊ฐ ํธ์ถํ Logger ๊ฐ์ฒด๊ฐ ์ด๋ค ์ค์ ์ ๋ฐ๋ฅด๋์ง ์ดํดํ๊ธฐ ์ํด์๋ Logger Hierarchy๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค.
๋ด๋ถ์ ์ผ๋ก ์ค์ ํ์ผ์ ์ ์๋ ๊ฐ Logger ์ค์ ์ ๋ฐ๋ผ LoggerConfig ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋๋ฉฐ,
Logger Name์ ๋ฐ๋ผ ์ค๋ธ์ ํธ ๊ฐ ๋ถ๋ชจ-์์ ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ๋ค. ์ฆ ๋ถ๋ชจ Logger์ ์ค์ ์ ์์ Logger๊ฐ ์์๋ฐ๋๋ค.
์๋ฅผ ๋ค์ด “X.Y” Logger์ ๋ถ๋ชจ๋ “X”์ด๊ณ , “X” Logger์ ๋ถ๋ชจ๋ Root Logger(์ต์์)์ด๋ค.
๋ค์์ Hierarchy ๊ท์น๊ณผ ์์์ด๋ค.
1) ํธ์ถํ Logger Name๊ณผ ๋์ผํ Logger๊ฐ ์๋ ๊ฒฝ์ฐ, ํด๋น Logger ์ค์ ์ ๋ฐ๋ฅธ๋ค.
2) ๋์ผํ Logger๋ ์์ง๋ง, Parent Logger๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ, Parent Logger ์ค์ ์ ๋ฐ๋ฅธ๋ค.
3) Parent Logger๋ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ, Root Logger ์ค์ ์ ๋ฐ๋ฅธ๋ค.
log level
Log4j 2๋ FATAL, ERROR, WARN, INFO, DEBUG, TRACE์ Log Level์ ์ ๊ณตํจ.
๊ฐ๊ฐ trace(), debug(), info(), warn(), error(), fatal()๋ผ๋ ๋ก๊น
๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
๋ก๊ทธ ๋ ๋ฒจ์ ๋ค์๊ณผ ๊ฐ๋ค. (FATAL > ERROR > WARN > INFO > DEBUG > TRACE)
์ดํ๋ฆฌ์ผ์ด์ ์ํ ์ค Log Level์ ๋ณ๊ฒฝํ ์๋ ์๋๋ฐ ์ด ๋ Logger Configuration์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ฏ๋ก, Logger ์ค์ ์ ๋ณด๋ฅผ ์ฐธ์กฐํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋๋ก org.apache.logging.log4j.Logger๋ฅผ org.apache.logging.log4j.core.Logger๋ก ์บ์คํ ํด์ผ ํ๋ค.
Log Level ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ณ๊ฒฝํ Level๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก setLevel() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
setLevel() ํธ์ถ ์ดํ๋ถํฐ Log Level์ด ๋ณ๊ฒฝ๋๋ฉฐ, ์ง์ ๋ ๋ก๊ทธ๋ ๋ฒจ ์ดํ์ Log Event๋ ๋ฌด์๋๋ค.
// ์์
package egovframe.sample;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LoggerTest {
Logger logger = LogManager.getLogger(); // Root Logger ์ค์ ์ ๋ฐ๋ฆ, Log Level: ERROR
org.apache.logging.log4j.core.Logger targetLogger = (org.apache.logging.log4j.core.Logger) logger;
targetLogger.debug("๋ณ๊ฒฝ ์ - debug"); // ์ถ๋ ฅ๋จ
targetLogger.error("๋ณ๊ฒฝ ์ - error"); // ์ถ๋ ฅ ์๋จ
targetLogger.setLevel(Level.DEBUG); // DEBUG, INFO, WARN, ERROR, FATAL ์ถ๋ ฅ ๊ฐ๋ฅ
targetLogger.debug("๋ณ๊ฒฝ ํ - debug"); // ์ถ๋ ฅ๋จ
targetLogger.error("๋ณ๊ฒฝ ํ - error"); // ์ถ๋ ฅ๋จ
}
์๋ฐ์์๋ C์ ๊ฐ์ด ์ ์ฒ๋ฆฌ๊ธฐ์ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ #ifdef DEBUG์ ๊ฐ์ ํํ์ ๊ฐ์ด ๋๋ฒ๊น ๋์ ๋ฆด๋ฆฌ์ฆ ๋์ ๋๋ฒ๊น ์ฝ๋๋ฅผ ๊ฐ๊ฐ ๋ณ๋๋ก ์์ฑํ ์๊ฐ ์๋ค. ๋ฐ๋ผ์ Log4j์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ก๊ทธ๊ด๋ฆฌ์ ์์ด์ ์๋นํ ํธ๋ฆฌํ๋ค.
Appender ์ค์ ๐คด
Appender๋ ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋๋ ์์น๋ฅผ ๋ํ๋ธ๋ค.
XXXAppender๋ก ๋๋๋ ํด๋์ค๋ค์ ์ด๋ฆ์ ๋ณด๋ฉด, ์ถ๋ ฅ ์์น๋ฅผ ์ด๋ ์ ๋ ์ง์ํ ์ ์๋ค.
Log4j 2๋ Console, File, RollingFile, Socket, DB ๋ฑ ๋ค์ํ ๋ก๊ทธ ์ถ๋ ฅ ์์น๊ณผ ๋ฐฉ๋ฒ์ ์ง์ํ๋ค.
๊ธฐ์กด Log4j 1.x์ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์ Appender ์ข
๋ฅ๋ฅผ class ์์ฑ๊ฐ์ผ๋ก ๊ตฌ๋ถํ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, Log4j 2์์๋ ํ๊ทธ๋ก ๊ตฌ๋ถํ๋ค.
Appender ์ ์ธ๊ณผ ์ ์
๋ชจ๋ Appender ์์๋ ์์ ์์์ธ <Appenders> ์๋์ ์ ์ธํ๋ค.
<Appenders>
<Console>...</Console>
<File>...</File>
<RollingFile>...</RollingFile>
<JDBC>...</JDBC>
</Appenders>
Appender ์์๋ name ์์ฑ๊ฐ์ ๊ฐ์ง๋ฉฐ, name ์์ฑ์ Appender ์ด๋ฆ์ ์ง์ ํ๋ค. name ์์ฑ๊ฐ์ Logger๊ฐ ๋ก๊ทธ ์ถ๋ ฅ์ ์ฌ์ฉํ Appender๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ๋ํ Appender ์์์ ํ์ ์์๋ก ๋ก๊ทธ ์ถ๋ ฅ ํจํด์ธ Layout์ ์ ์ํ๋ค.
์๋๋ ConsoleAppender์ PatternLayout์ ์ฌ์ฉํ ์ํ์ฝ๋์ด๋ค.
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout /> <!-- ๋ํดํธ ํจํด ์ ์ฉ, %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n -->
</Console>
</Appenders>
<Loggers>
<Logger name="egovLogger" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Rootlevel="ERROR">
<AppenderRef ref="console" />
</Root>
</Loggers>
Appender ์ข ๋ฅ
JDBCAppender
Layout ์ค์ ๐ฒ
Layout์ ๋ฐ์ํ ๋ก๊ทธ ์ด๋ฒคํธ์ ํฌ๋งท์ ์ง์ ํ๊ณ , ์ํ๋ ํ์์ผ๋ก ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
Appenders ์ค์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Log4j 2์์๋ Layout์ class ์์ฑ์ด ์๋ ํ๊ทธ๋ก ๊ตฌ๋ถํ๋ค.
์ถ๋ ฅ ํ์์ ๋ฐ๋ผ Layout์ ์ข ๋ฅ๊ฐ ๋ฌ๋ผ์ง๋ฉฐ, ์๋์ ๊ฐ์ Layouts์ ์ ๊ณตํ๋ค.
PatternLayout ์ ์ธ๊ณผ ์ ์
์ฐธ์กฐ : egovframework:rte3:fdl:logging:log4j_2:์ค์ _ํ์ผ์_์ฌ์ฉํ๋_๋ฐฉ๋ฒ
egovframework:rte3:fdl:logging:log4j_2:์ค์ _ํ์ผ์_์ฌ์ฉํ๋_๋ฐฉ๋ฒ [eGovFrame]
Log4j 2๋ ๊ธฐ์กด Properties ํ์ผ ํ์์ ํ๊ฒฝ ์ค์ ์ ์ง์ํ์ง ์์ผ๋ฉฐ, XML (log4j2.xml) ํน์ JSON (log4j2.json or log4j2.jsn) ํ์ผ ํ์์ ํ๊ฒฝ ์ค์ ๋ง ๊ฐ๋ฅํ๋ค. ์๋๋ XML ํ์ผ์ ์ด์ฉํ ํ๊ฒฝ ์ค์ ์ ๋ํด์๋ง
www.egovframe.go.kr

๋๊ธ