CORE
HOME > JAVA > J2SE > CORE
2019.05.29 / 24:53

[·Î±ë] logbackÀ» ÀÌ¿ëÇÑ ·Î±ë ó¸®

Źµ¹ÀÌ°³¹ßÀÚ
Ãßõ ¼ö 324

ÀÌ Æ÷½ºÆÃÀº Àڱ⼺ÂûÀÇ »öÀÌ Â£Àº Æ÷½ºÆÃÀÌ´Ù.
´ëÇлýÈ°À» ³¡³»°í Çö¾÷ÀÚÀÇ »ýÈ°·Î Á¢¾îµç Áö±Ý±îÁöµµ ¾ÆÁ÷ ·Î±× 󸮸¦ Àִ°Š°¡Á®´Ù ¾²´Â Á¤µµ·Î ¹Û¿¡ ¸ð¸£°í ÀÖ¾ú´Ù.
System.out.println() ¹Û¿¡ ÇÒ ÁÙ ¸ð¸£´ø ¾ó¸¶ Àü ±îÁöÀÇ ³ª¸¦ Àϱú¿ì´Â Â÷¿ø¿¡¼­, logbackÀÇ ¿ª»ç¿Í ±â¿ø º¸´Ù´Â, »ç¿ë¹ý Ãø¸é¿¡ ÁýÁßÇÏ¿© Æ÷½ºÆà ÇØ º¸µµ·Ï ÇÏ°Ú´Ù.

[¶óÀ̺귯¸® ¼³Á¤]

logbackÀ» »ç¿ëÇϱâ À§Çؼ± logback-classic ¶óÀ̺귯¸®°¡ ÇÊ¿äÇÏ´Ù.
ÀÌ ¶óÀ̺귯¸®¸¦ maven¿¡ Ãß°¡ÇØÁØ´Ù.

<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <scope>compile</scope> </dependency> </dependencies>



[logback ¼³Á¤ÆÄÀÏ ÀÛ¼º]

logback À» »ç¿ëÇϱâ À§Çؼ­´Â classpath ³»ºÎ¿¡ logback ¼³Á¤ÆÄÀÏÀÌ ÇÊ¿äÇÏ´Ù.

¼³Á¤ÆÄÀÏÀº 3°¡Áö ¹æ½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ¹øÈ£ ¼ø¼­´ë·Î ¿ì¼±¼øÀ§¸¦ °®´Â´Ù.
1. logback.groovy
2. logback-test.xml
3. logback.xml



º» ¿¹½Ã¿¡¼­´Â logback.xml À» ÀÛ¼ºÇϵµ·Ï ÇÏ°Ú´Ù.

[src/main/resources/logback.xml]

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <!-- ÄÜ¼Ö Ãâ·Â (stdout) --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <!-- ÀϺ° ÆÄÀÏ·Î ÀúÀå --> <appender name="invalidRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- ÇöÀç ³¯Â¥ÀÇ ÆÄÀÏÀº ¾Æ·¡ °æ·Î¿¡ invalid.log·Î ÀúÀå --> <file>/Users/occidere/Desktop/logs/invalid/invalid.log</file> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> <!-- ¿äÀÏÀÌ ¹Ù²î¸é¼­ °ú°Å ·Î±× ÆÄÀÏ À̸§À¸·Î º¯°æ. ex) invalid.log -> invalid.log.180817 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>/Users/occidere/Desktop/logs/invalid/invalid.%d{yyyyMMdd}.%i.log</fileNamePattern> <!-- 10MB¸¦ ÃÊ°úÇÏ¸é »õ·Î¿î ¹øÈ£¸¦ ºÙ¿©¼­ »õ·Î¿î ·Î±×ÆÄÀÏ »ý¼º. ex) invalid.log.180817.2.log --> <maxFileSize>10MB</maxFileSize> </rollingPolicy> </appender> <!-- ±âº»À¸·Î Àû¿ëµÇ´Â ¼³Á¤ --> <root level="debug"> <appender-ref ref="console"/> </root> <!-- ÃßÈÄ java Äڵ忡¼­ log.invalid ¶õ À̸§À» È£ÃâÇÑ´Ù --> <logger name="log.invalid" level="info" additivity="false"> <!-- À§ÀÇ <appender name='invalidRollingFileAppender .. > ¸¦ È£ÃâÇÑ´Ù --> <appender-ref ref="invalidRollingFileAppender"/> <!-- ÆÄÀÏ ·Î±ë°ú ÇÔ²² ÄÜ¼Ö Ãâ·Âµµ ÇÑ´Ù --> <appender-ref ref="console"/> </logger> </configuration>



[Å×½ºÆ® ÄÚµå ÀÛ¼º]

ÀϹÝÀûÀ¸·Î °£´ÜÇÑ Ãâ·Â¿ë ·Î±×´Â console outputÀ» ÀÌ¿ëÇÏ°í, Exception ÀÌ ¹ß»ýÇßÀ» ¶§, ÇØ´ç ¿¡·¯ ³»¿ëÀ» ±â·ÏÇØ ³õ±â À§ÇÏ¿© FileAppender¸¦ »ç¿ëÇÑ´Ù.

°£´ÜÇÑ Å×½ºÆ® Äڵ带 ÀÛ¼ºÇغ¸¸é ¾Æ·¡¿Í °°´Ù.


[src/main/java/Main.java]

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Main { /* ÄÜ¼Ö Ãâ·Â¿ë ·Î°Å. logback.xmlÀÇ root ¼³Á¤°ªÀÌ Àû¿ëµÈ´Ù. */ public static final Logger consoleLogger = LoggerFactory.getLogger(Main.class); /* ÆÄÀÏ ÀúÀå ¹× ÄÜ¼Ö Ãâ·Â¿ë ·Î°Å. logback.xmlÀÇ log.invalid ¼³Á¤°ªÀÌ Àû¿ëµÈ´Ù. */ public static final Logger invalidFileLogger = LoggerFactory.getLogger("log.invalid"); public static void main(String[] args) { try { consoleLogger.info("Contents : {}", "Logger Test"); double d = 1 / 0; // 0À¸·Î ³ª´©±â -> Exception ¹ß»ý! } catch (Exception e) { invalidFileLogger.warn("INVALID : {}", e); } } }



[½ÇÇà °á°ú]

À§ Äڵ带 ½ÇÇàÇÑ °á°ú´Â ¾Æ·¡¿Í °°´Ù.

consoleAppender·Î ÂïÀº ·Î±× ³»¿ëÀº Á¤»óÀûÀ¸·Î stdoutÀ¸·Î Ãâ·ÂµÈ °ÍÀ» º¼ ¼ö ÀÖ°í, Exception ¹ß»ý ³»¿ëÀ» ·Î±ëÇÑ °ÍÀº ÄÜ¼Ö Ãâ·Â ¹× ÆÄÀÏ ÀúÀå±îÁö ÀÌ·ïÁø °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.




[¸¶¹«¸® ¹× Âü°í]

¿©±â±îÁö Çؼ­ °£´ÜÈ÷ logback »ç¿ë¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù.
System.out Àº ¼Óµµ¸é¿¡¼­ ¸Å¿ì ´À¸®¹Ç·Î À̸¦ ÀÌ¿ëÇÑ Ãâ·ÂÀº Áö¾çÇÏ°í, ¹Ýµå½Ã logger¸¦ »ç¿ëÇÏ´Â ¹æÇâÀ¸·Î °³¹ßÀ» ÁøÇàÇÏ´Â °ÍÀÌ ÁÁ´Ù.