์๋
! ๊ฐ์๋ฅผ ์์ฑํ ๋ ์ค์ ์์
์์ ์ ๋์ ์ผ๋ก ํ์ํ ํน์ ์ฃผ์ ๊ฐ ์๋์ง ํนํ ๊ฐ์กฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ด๋ณด์ธ์! ์ค๋ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃฐ ์ฃผ์ ๋ ์ฑ์ฉ ์ฒซ๋ ๋ถํฐ ๋ชจ๋ ํ๋ก์ ํธ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ๊ฒ์
๋๋ค. Java ๋ก๊น
์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ์ด ์ฃผ์ ๋ ์ ํ ๋ณต์กํ์ง ์์ต๋๋ค(์ฝ๋ค๊ณ ๋งํ ์๋ ์์ต๋๋ค). ํ์ง๋ง ์ฒซ ์ง์ฅ์์ ๊ฐ์กฐํ ๋ปํ ๋ด์ฉ์ ์ถฉ๋ถํ ์์ ํ
๋ ์ง๊ธ ๋น์ฅ ์ฒ ์ ํ ์ดํดํ๋ ๊ฒ์ด ์ข์ต๋๋ค :) ์, ์์ํ๊ฒ ์ต๋๋ค.
Java ๋ก๊ทธ์ธ์ด๋ ๋ฌด์์ ๋๊น?
๋ก๊น ์ ํ๋ก๊ทธ๋จ ์๋์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ ํ์์ ๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ ์ฅ์๋ฅผ "๋ก๊ทธ"๋ผ๊ณ ํฉ๋๋ค. ๋ ๊ฐ์ง ์ง๋ฌธ์ด ์ฆ์ ๋ฐ์ํฉ๋๋ค. ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ด๋์ ๊ธฐ๋ก๋ฉ๋๊น? "where"๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ๋ค์ํ ์์น์์ ํ๋ก๊ทธ๋จ ์์ ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ณต๋ถํ๋ ๋์ System.out.println()์ฝ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ์ฅ ๊ฐ๋จํ ํ์์ด์ง๋ง ์ค์ ๋ก ๋ก๊น ์ ๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ์ฌ์ฉ์๋ ์ ํ ์ง์ ํ์๊ฒ ๊ทธ๋ค์ง ํธ๋ฆฌํ์ง ์์ต๋๋ค. ๋ถ๋ช ํ ๊ทธ๋ค์ IDE๋ฅผ ์ค์นํ๊ณ ์ฝ์์ ๋ชจ๋ํฐ๋งํ๊ณ ์ถ์ดํ์ง ์์ ๊ฒ์ ๋๋ค :) ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ๋ฐ ๋ ์ผ๋ฐ์ ์ธ ํ์์ธ ํ ์คํธ ํ์ผ์ด ์์ต๋๋ค. ์ธ๊ฐ์ ์ด ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์ด ํจ์ฌ ๋ ํธํ๊ณ ํ์คํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํธ๋ฆฌํฉ๋๋ค! ์ด์ ๋ ๋ฒ์งธ ์ง๋ฌธ: ์ด๋ค ํ๋ก๊ทธ๋จ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํด์ผ ํฉ๋๊น? ๊ทธ๊ฒ์ ์ ์ ์ผ๋ก ๋น์ ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค! Java์ ๋ก๊น ์์คํ ์ ๋งค์ฐ ์ ์ฐํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ํํ๋ ๋ชจ๋ ์์ ์ ๊ธฐ๋กํ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ํํธ์ผ๋ก ์ด๊ฒ์ ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋ฉด์ Facebook์ด๋ Twitter์ ๋ก๊ทธ์ ๋ชจ๋ ๋ด์ฉ์ ๊ธฐ๋กํ๋ค๋ฉด ์ผ๋ง๋ ํฐ ๋ก๊ทธ๊ฐ ๋ ์ง ์์ํด ๋ณด์ญ์์ค. ์ด๋ฌํ ๋๊ธฐ์ ์ ์๋ง๋ ๊ทธ ์ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๋ฅ๋ ฅ์ด ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ 500GB์ ํ ์คํธ ๋ก๊ทธ์์ ํ๋์ ์ค๋ํ ์ค๋ฅ์ ๋ํ ์ ๋ณด๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ธ์ง ์์ํด ๋ณด์ญ์์ค. ๊ทธ๊ฒ์ ๊ฑด์ด ๋๋ฏธ์์ ๋ฐ๋์ ์ฐพ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ Java๋ ์ค๋ฅ ๋ฐ์ดํฐ๋ง ๊ธฐ๋กํ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋๋ ์ฌ๊ฐํ ์ค๋ฅ์ผ ์๋ ์์ต๋๋ค! ์ฆ, Java์ ๊ธฐ๋ณธ ๋ก๊น ์์คํ ์ ๋ํด ๋งํ๋ ๊ฒ์ด ์์ ํ ์ ํํ์ง๋ ์์ต๋๋ค. ์ฌ์ค ํ๋ก๊ทธ๋๋จธ๋ ์ด ๊ธฐ๋ฅ์ด ์ธ์ด์ ์ถ๊ฐ๋๊ธฐ ์ ์ ๋ก๊น ์ด ํ์ํ์ต๋๋ค. Java๊ฐ ์์ฒด ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ์ ๋ ๋ชจ๋๊ฐ ์ด๋ฏธ log4j ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. Java ๋ก๊ทธ์ธ์ ์ญ์ฌ๋ ์ค์ ๋ก ๋งค์ฐ ๊ธธ๊ณ ์ ์ตํฉ๋๋ค. ์์ปจ๋ Java์๋ ์์ฒด ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ง๋ง ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ต๋๋ค :) ๋์ค์ ์ฌ๋ฌ ๋ค๋ฅธ ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ์ฉํ๊ธฐ ์์ํ์ ๋ ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฌ๋๋ค์ด ์๋ก ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง 12๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ถ์ SLF4J ํ๋ ์์ํฌ("Service Logging Facade For Java")๊ฐ ๋ง๋ค์ด์ก์ต๋๋ค. SLF4J ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ํธ์ถํ๋๋ผ๋ ๋ด๋ถ์ ์ผ๋ก๋ log4j, ํ์ค java.util.logging ๋ฑ ์ด์ ์ ๋ชจ๋ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ถ์ํ๋ผ๊ณ ํฉ๋๋ค. ์ด๋ค ์์ ์์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์๋ Log4j์ ํน์ ๊ธฐ๋ฅ์ด ํ์ํ์ง๋ง ํ๋ก์ ํธ๋ฅผ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ง์ ์ฐ๊ฒฐํ๊ณ ์ถ์ง ์๋ค๋ฉด SLF4J๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ทธ๋ฐ ๋ค์ Log4j ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ํฉ๋๋ค. ๋ง์์ด ๋ฐ๋์ด Log4j ๊ธฐ๋ฅ์ด ๋ ์ด์ ํ์ํ์ง ์๋ค๊ณ ๊ฒฐ์ ํ ๊ฒฝ์ฐ "์ฌ๊ธฐ ์ Log4j ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค . ๋ค์์ผ๋ก ์์นด์ด๋ธ์ ์์ถ์ ํ๊ณ IntelliJ IDEA๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค ๊ฒฝ๋ก์ JAR ํ์ผ์ ์ถ๊ฐํฉ๋๋ค. ๋ฉ๋ด ํญ๋ชฉ: ํ์ผ -> ํ๋ก์ ํธ ๊ตฌ์กฐ -> ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ํ JAR ํ์ผ์ ์ ํํ๊ณ ํ๋ก์ ํธ์ ์ถ๊ฐํฉ๋๋ค(๋ค์ด๋ก๋ํ ์์นด์ด๋ธ์๋ ๋ง์ JAR ํ์ผ์ด ํฌํจ๋์ด ์์ต๋๋ค. ํ์ํ ํ์ผ์ ๋ณด๋ ค๋ฉด ๊ทธ๋ฆผ์ ํ์ธํ์ญ์์ค.) ํด๋น ํ์์ ์ํ ์ด ์ง์นจ์ ์ ์ํ์ญ์์ค . Maven ์ฌ์ฉ๋ฒ์ ๋ชจ๋ฅด๋ ์ฌ๋. Maven์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๋ฉด Maven์์ ์์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ์ข์ต๋๋ค(ํจ์ฌ ์ฝ์ต๋๋ค). Maven ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์ ์ข ์์ฑ์ ์ถ๊ฐํฉ๋๋ค.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.14.0</version>
</dependency>
์์ฒญ๋! ์ฐ๋ฆฌ๋ ์ค์ ์ ์์๋์ต๋๋ค :) SLF4J๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ด
์๋ค. ํ๋ก๊ทธ๋จ ์์
์ด ์ด๋๊ฐ์ ๊ธฐ๋ก๋๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ์ด๋ฅผ ์ํด์๋ logger์ appender๋ผ๋ ๋ ๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ๋ก๊ฑฐ๋ ๋ก๊น
์ ์์ ํ ์ ์ดํ ์ ์๋ ๊ฐ์ฒด์
๋๋ค. ๋ก๊ฑฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ์ ์ LoggerFactory.getLogger() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์
์ ์ํํฉ๋๋ค. ๋ฉ์๋ ๋งค๊ฐ ๋ณ์๋ ์์
์ด ๊ธฐ๋ก๋ ํด๋์ค์
๋๋ค. ์ฝ๋๋ฅผ ์คํํด ๋ด
์๋ค:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyTestClass {
public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);
public static void main(String[] args) {
LOGGER.info("Test log entry!!!");
LOGGER.error("An error occurred!");
}
}
์ฝ์ ์ถ๋ ฅ:
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
์ฌ๊ธฐ์ ๋ฌด์์ ๋ณผ ์ ์์ต๋๊น? ๋จผ์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ด๋ ์ด์ ํ์ํ ์ค์ ์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ์ ํฌ ๋ก๊ฑฐ๋ ์ค๋ฅ ๋ฉ์์ง(ERROR)๋ง ์ฝ์์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. logger.info () ๋ฉ์๋๊ฐ ์๋ํ์ง ์์์ต๋๋ค. ํ์ง๋ง logger.error() ๊ฐ ๊ทธ๋ฌ์ต๋๋ค! ์ฝ์์์ ํ์ฌ ๋ ์ง, ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ฐฉ๋ฒ( main), "ERROR"๋ผ๋ ๋จ์ด, ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ๋ฉ์์ง! ERROR๋ ๋ก๊น
์์ค์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ก๊ทธ ํญ๋ชฉ์ "ERROR"๋ผ๋ ๋จ์ด๊ฐ ํ์๋์ด ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ ์ด ์ง์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์
๋๋ค. ํญ๋ชฉ์ "INFO"๋ผ๋ ๋จ์ด๊ฐ ํ์๋ ๊ฒฝ์ฐ ๋ฉ์์ง๋ ๋จ์ํ ํ๋ก๊ทธ๋จ์ ์ ์ ์๋์ ๋ํ ํ์ฌ ์ ๋ณด๋ฅผ ๋ํ๋
๋๋ค. SLF4J ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ๋ก๊น
์ ์ ์ฐํ๊ฒ ๊ตฌ์ฑํ ์ ์๋ ๋ค์ํ ๋ก๊น
์์ค์ด ์์ต๋๋ค. ๋ชจ๋ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ํ์ํ ๋ชจ๋ ๋ก์ง์ด ์ด๋ฏธ Java Logger ํด๋์ค์ ์์ต๋๋ค. ๊ด๋ จ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ผ์์ ์ธ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํ๋ ค๋ฉด logger.info() ๋ฉ์๋๋ฅผ ํธ์ถํ์ญ์์ค. ์ค๋ฅ ๋ฉ์์ง์ ๊ฒฝ์ฐ logger.error() ๋ฅผ ์ฌ์ฉํ์ญ์์ค . ๊ฒฝ๊ณ ์ ๊ฒฝ์ฐ logger.warn()์ ์ฌ์ฉํ์ญ์์ค.
์ด์ appender์ ๋ํด ์ด์ผ๊ธฐ ํด ๋ด ์๋ค.
Appender๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ ๊ณณ์ ๋๋ค. ์ด๋ค ๋ฉด์์๋ ๋ฐ์ดํฐ ์์ค์ ๋ฐ๋, ์ฆ "B ์ง์ "์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ ์ฝ์์ ์ถ๋ ฅ๋ฉ๋๋ค. ์ด์ ์์ ์์๋ ์๋ฌด๊ฒ๋ ๊ตฌ์ฑํ ํ์๊ฐ ์์์ต๋๋ค. ํ ์คํธ๋ ์ฝ์์ ํ์๋๊ณ Log4j ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ก๊ฑฐ๋ ERROR ์์ค ๋ฉ์์ง๋ง ์ฝ์์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ๋ถ๋ช ํ ์ฌ๋๋ค์ด ํ ์คํธ ํ์ผ์์ ๋ก๊ทธ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ด ๋ ํธ๋ฆฌํฉ๋๋ค. ๋ก๊ฑฐ์ ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ๋ ค๋ฉด ํ์ผ ์ถ๊ฐ์๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์์ํ๋ ค๋ฉด src ํด๋์ ์ง์ log4j.xml ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๋น์ ์ ์ด๋ฏธ XML ํ์์ ์ต์ํ ๊ฒ์ ๋๋ค: ์ฐ๋ฆฌ๋ ์ต๊ทผ์ ๊ทธ๊ฒ์ ๋ํ ๊ตํ์ ์ป์์ต๋๋ค :) ๋ค์์ ํ์ผ์ ๋ด์ฉ์ ๋๋ค:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="MyFileAppender"/>
</Root>
</Loggers>
</Configuration>
ํน๋ณํ ํน๋ณํ๊ฑฐ๋ ์ด๋ ค์ด ๋ด์ฉ์ ์์ต๋๋ค :) ๊ทธ๋๋ ์ฝํ
์ธ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
<Configuration status="INFO">
์ด๊ฒ์ ์์ StatusLogger์
๋๋ค. ๋ก๊ฑฐ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ Log4j์ ๋ด๋ถ ํ๋ก์ธ์ค์์ ์ฌ์ฉ๋ฉ๋๋ค. status="INFO" ๋์ status="TRACE"๋ฅผ ์ค์ ํ๋ฉด Log4j์ ๋ด๋ถ ์์
์ ๋ํ ๋ชจ๋ ์ ๋ณด๊ฐ ์ฝ์์ ํ์๋ฉ๋๋ค(StatusLogger๋ ์ดํ๋๊ฐ ํ์ผ์ธ ๊ฒฝ์ฐ์๋ ์ฝ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ํฉ๋๋ค). ์ง๊ธ์ ํ์ํ์ง ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ๋๊ฒ ์ต๋๋ค.
<Appenders>
<File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ appender๋ฅผ ์์ฑํฉ๋๋ค. <File> ํ๊ทธ ๋ ํ์ผ ์ถ๊ฐ์๊ฐ ๋ ๊ฒ์์ ๋ํ๋
๋๋ค. name="MyFileAppender"๋ ์ดํ๋์ ์ด๋ฆ์ ์ค์ ํฉ๋๋ค. fileName="C:\Users\Username\Desktop\testlog.txt"๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋ ๋ก๊ทธ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ํ๋
๋๋ค. append="true"๋ ํ์ผ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋
๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ, ์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ํ ์ผ์
๋๋ค. ๊ฐ์ false๋ก ์ค์ ํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์์๋ ๋๋ง๋ค ๋ก๊ทธ ํ์ผ์ ์ด์ ๋ด์ฉ์ด ์ญ์ ๋ฉ๋๋ค. <PatternLayout ํจํด="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5๋ ๋ฒจ %logger{36} - %msg%n"/>์์ ์ค์ ์ ๋ํ๋
๋๋ค. ์ฌ๊ธฐ์์ ์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์์ ํ
์คํธ ํ์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
<Loggers>
<Root level="INFO">
<AppenderRef ref="MyFileAppender"/>
</Root>
</Loggers>
์ฌ๊ธฐ์๋ ๋ฃจํธ ์์ค์ ๋ํ๋
๋๋ค. "INFO" ์์ค์ ์ค์ ํ์ต๋๋ค. ์ฆ, INFO๋ณด๋ค ๋์ ์์ค์ ๋ชจ๋ ๋ฉ์์ง(์์์ ์ดํด๋ณธ ํ์ ๋ฐ๋ผ)๋ ๊ธฐ๋ก๋์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์๋ 3๊ฐ์ ๋ฉ์์ง๊ฐ ์์ต๋๋ค: ํ๋๋ INFO, ํ๋๋ WARN, ํ๋๋ ERROR์
๋๋ค. ํ์ฌ ๊ตฌ์ฑ์์๋ 3๊ฐ์ ๋ฉ์์ง๊ฐ ๋ชจ๋ ๊ธฐ๋ก๋ฉ๋๋ค. ๋ฃจํธ ์์ค์ ERROR๋ก ๋ณ๊ฒฝํ๋ฉด LOGGER.error() ๋ฉ์๋ ํธ์ถ์ ๋ง์ง๋ง ๋ฉ์์ง๋ง ๋ก๊ทธ์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋ํ appender์ ๋ํ ์ฐธ์กฐ๋ ์ฌ๊ธฐ์ ํ์๋ฉ๋๋ค. ์ด๋ฌํ ์ฐธ์กฐ๋ฅผ ์์ฑํ๋ ค๋ฉด <Root> ํ๊ทธ ์์ <ApprenderRef> ํ๊ทธ๋ฅผ ์์ฑ ํ๊ณ ref='your appender's name' ์์ฑ์ ์ถ๊ฐ ํด์ผ ํฉ๋๋ค . ์์ด๋ฒ๋ฆฐ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ์ฌ๊ธฐ์์ ์ถ๊ฐ์์ ์ด๋ฆ์ ์ค์ ํฉ๋๋ค. <. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ ์ฐ๋ฆฌ์ ์ฝ๋๊ฐ ์์ต๋๋ค!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyTestClass {
public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);
public static void main(String[] args) {
LOGGER.info("The program is starting!!!");
try {
LOGGER.warn("Attention! The program is trying to divide a number by another.
System.out.println(12/0);
} catch (ArithmeticException x) {
LOGGER.error("Error! Division by zero!");
}
}
}
๋ฌผ๋ก ์ฝ๊ฐ ์๋ฑํ์ง๋ง(RuntimeException์ ํฌ์ฐฉํ๋ ๊ฒ์ ์์ฌ์ค๋ฌ์ด ์๊ฐ์
๋๋ค), ์ฐ๋ฆฌ์ ๋ชฉ์ ์๋ ์๋ฒฝํฉ๋๋ค :) main() ๋ฉ์๋๋ฅผ ์ฐ์์ผ๋ก 4๋ฒ ์คํํ๊ณ testlog.txt ํ์ผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ฏธ๋ฆฌ ๋ง๋ค ํ์๋ ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์๋์ผ๋ก ์ด ์์
์ ์ํํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์๋ํ์ต๋๋ค! :) ์ด์ ๊ตฌ์ฑ๋ ๋ก๊ฑฐ๊ฐ ์์ต๋๋ค. ๊ฐ ๋ฉ์๋์ ๋ก๊ฑฐ ํธ์ถ์ ์ถ๊ฐํ์ฌ ์ด์ ํ๋ก๊ทธ๋จ ์ค ์ผ๋ถ๋ฅผ ๊ฐ์ง๊ณ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒฐ๊ณผ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด์ญ์์ค :) ๊น์ด ๋ก๊ทธ์ธ ์ฃผ์ ๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ์์ ์๋ฆฌ์์ ๋ค ์ฝ๊ธฐ๋ ์ด๋ ค์ธ ๊ฒ์
๋๋ค. ์ฆ, ์ ์ฉํ ์ถ๊ฐ ์ ๋ณด๊ฐ ๋ง์ด ํฌํจ๋์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด testlog.txt ํ์ผ์ด ํน์ ํฌ๊ธฐ์ ๋๋ฌํ๋ฉด ์ ํ
์คํธ ํ์ผ์ ์์ฑํ๋๋ก ๋ก๊ฑฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค. :) ์ด๊ฒ์ผ๋ก ์์
์ ๋ง์นฉ๋๋ค! ์ค๋ ๋น์ ์ ๋งค์ฐ ์ค์ํ ์ฃผ์ ์ ์ต์ํด์ก๊ณ ์ด ์ง์์ ๋น์ ์ ๋ฏธ๋ ์์
์ ํ์คํ ๋์์ด ๋ ๊ฒ์
๋๋ค. ๋ค์ ์๊ฐ๊น์ง! :)
GO TO FULL VERSION