8.1 Log4J

ÀÛ¼ºÀÚ : ÁøÀº¿µ ( 2004-07-29)

[¸ÞÀÎ] [¸ñ·Ï]

¸ñÂ÷

8.1.1 Log4J

¨ç Log4J¶õ
ÇÁ·Î±×·¥À» °³¹ßÇÏ´Â »ç¶÷À̶ó¸é ´©±¸³ª ·Î±×(log)¸¦ ³²±â°Ô ¸¶·ÃÀÌ´Ù. ¾î¶°ÇÑ ÇüÅ·δøÁö ·Î±×¸¦ ³²°Ü¼­ ÀÚ½ÅÀÌ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥ÀÌ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÏ´ÂÁö, ȤÀº ½ÇÇà µµÁß¿¡ ¹®Á¦°¡ »ý°åÀ» ¶§¿¡µµ ·Î±×¸¦ Âü°íÇؼ­ ¾î´À ºÎºÐ¿¡ ¹®Á¦°¡ ÀÖ´ÂÁö ã¾Æº¸°ï ÇÑ´Ù.

°³¹ßÀÚ°¡ ¾Æ´Ñ ½Ã½ºÅÛÀ» °ü¸®ÇÏ´Â °æ¿ì¿¡µµ ·Î±×´Â ¸Å¿ì Áß¿äÇÏ´Ù. º¸¾È ´ã´çÀÚÀÇ °æ¿ì ´©°¡ ½Ã½ºÅÛ¿¡ ºÒ¹ýÀû(?)À¸·Î Á¢±ÙÇÏ´ÂÁö ¸øµÈ Áþ(?)À» ÇÏ´ÂÁö °¨½ÃÇÒ ¶§¿¡µµ ·Î±×°¡ Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ·¸°Ô ´Ù¾çÇÑ »ç¶÷µé°ú ¿ëµµ·Î »ç¿ëÇÏ´Â ·Î±×¸¦ ¿©·¯ºÐÀº ¾î¶»°Ô »ý¼ºÇÏ°í °ü¸®ÇÏ°í ÀÖÀ»±î? System.out.println À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´Ü¼øÇÑ ·Î±×¶ó¸é »ó°ü ¾ø°ÚÁö¸¸ ·Î±×ÀÇ Çüŵµ ´Ù¾çÇÏ°í ¿©·¯ Á¶°ÇÀÌ ÁÖ¾îÁ®¾ß ÇÑ´Ù¸é ÀÌ·± ´Ü¼øÇÑ ¹æ¹ýÀ» »ç¿ëÇؼ­´Â ¿øÇÏ´Â ¸ñÇ¥¸¦ ´Þ¼ºÇϱâ Èûµé °ÍÀÌ´Ù.

·Î±×¸¦ ³²±â´Â ¹æ¹ý¿¡ Á» ´õ ÆíÇÏ°í ´Ù¾çÇÑ ±â´É°ú ¼º´É±îÁö º¸ÀåÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù¸é? ±×·¸´Ù. ¹Ù·Î log4j ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. Log4j´Â ÀÌ·± ½Ã´ëÀÇ ´Ù¾çÇÑ ¿å±¸¸¦ ÃæÁ·½ÃÅ°±â À§ÇØ µîÀåÇÑ °ÍÀÌ´Ù. ÀÌ¹Ì log4j ÇÁ·ÎÁ§Æ®°¡ ½ÃÀÛ µÈÁö ¸î ³âÀÌ Áö³µ°í ±× µ¿¾È ÃæºÐÈ÷ °ËÁõµÇ¾úÀ¸¸ç ¾÷°è¿¡¼­µµ Ç¥ÁØó·³ ±»¾îÁ® À־ ¸¹Àº »ó¿ë Á¦Ç°¿¡µµ Æ÷ÇԵǾî ÀÖ´Ù. JDK 1.4 ¹öÀüºÎÅÍ´Â ÀϺΠ·Î±ë API°¡ Ãß°¡µÇ¾úÁö¸¸ log4j ó·³ ¸·°­ÇÏÁö´Â ¾Ê´Â µí ÇÏ´Ù.

¨è Log4J APIÀÇ ±â´É
Log4j ´Â ±âº»ÀûÀ¸·Î ´Ù¼¸°³ÀÇ ¿ì¼±±Ç(ÀÌÇÏ Priority) µî±ÞÀ¸·Î ¸Þ¼¼Áö¸¦ ·Î±ëÇÒ ¼ö ÀÖ´Ù.

  • ¿Ï¼ºµÈ ¾îÇø®ÄÉÀ̼ǿ¡¼­´Â Ãâ·ÂµÇÁö ¾Ê¾Æ¾ß ÇÒ µð¹ö±ë ¸Þ¼¼ÁöµéÀ» ¾²±âÀ§ÇØ debug ¸¦ »ç¿ëÇ϶ó.
  • ¾îÇø®ÄÉÀ̼ÇÀÇ verbose ¸ðµå¿¡¼­ Ãâ·ÂµÉ¸¸ÇÑ ¸Þ¼¼ÁöµéÀ» ·Î±ëÇϱâ À§ÇØ info ¸¦ »ç¿ëÇ϶ó.
  • ¾îÇø®ÄÉÀ̼ÇÀÌ ÀÌ»ó¾øÀÌ °è¼Ó ½ÇÇàµÉ ¼ö ÀÖ´Â Á¤µµÀÇ °æ°í¸Þ¼¼Áö¸¦ ·Î±ëÇϱâ À§ÇØ warn À» »ç¿ëÇ϶ó.
  • ¾îÇø®ÄÉÀ̼ÇÀÌ ±×·°Àú·° µ¹¾Æ°¥¸¸ÇÑ Á¤µµÀÇ ¿¡·¯¸Þ¼¼Áö¸¦ ·Î±ëÇϱâ À§ÇØ error ¸¦ »ç¿ëÇ϶ó.
    ¿¹¸¦µé¾î °ü¸®ÀÚ¿¡ ÀÇÇØ ÁÖ¾îÁø ¼³Á¤ÀÎÀÚ°¡ ¿Ã¹Ù¸£Áö ¾Ê¾Æ ÇϵåÄÚµùµÈ ±âº»°ªÀ» »ç¿ëÇØ¾ß ÇÒ °æ¿ì.
  • ·Î±ëÈÄ¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ºñÁ¤»óÀûÀ¸·Î Á¾·áµÉ Ä¡¸íÀûÀÎ ¸Þ¼¼Áö¸¦ ·Î±ëÇϱâ À§ÇØ fatal À» »ç¿ëÇ϶ó.

ÇÁ·Î±×·¡¸Ó ¼öÁØ¿¡¼­ DEBUG ·¹º§ÀÌ ÇÊ¿äÇÏ´Ù¸é ¿î¿µÀÚ ¼öÁØ¿¡¼­´Â INFO·¹º§ÀÌ ÇÊ¿äÇÏ´Ù.


8.1.2 Log4J ¼³Ä¡

¾Æ·¡ÀÇ À§Ä¡¿¡¼­ ÆÄÀÏÀ» ´Ù¿î·Îµå ¹Þ´Â´Ù.
À§Ä¡ : http://logging.apache.org/site/binindex.cgi ÆÄÀÏ : jakarta-log4j-1.2.8.zip

¿øÇÏ´Â Àå¼Ò¿¡ ¾ÐÃàÀ» Ç®¸é ¾Æ·¡¿Í °°Àº Æú´õ°¡ ³ªÅ¸³­´Ù.

Log4J¸¦ »ç¿ëÇϱâ À§Çؼ­´Â, Ŭ·¡½º Æнº¿¡ log4j-1.2.8À» Æ÷ÇÔÇØ¾ß ÇÑ´Ù. ¾Æ·¡ÀÇ ³»¿ëÀ» È®ÀÎÇϸé Ãß°¡ÇÏ´Â ¹æ¹ýÀ» ¾Ë ¼ö ÀÖ´Ù.



8.1.3 Log4J »ç¿ë

¨ç °£´ÜÇÑ ¿¹Á¦
¿ª½Ã³ª óÀ½ ÇÁ·Î±×·¥À» ½ÃÀÛÇÒ ¶§ ºüÁöÁö ¾Ê´Â ´Ü°ñÀÎ Hello ÇÁ·Î±×·¥À¸·Î ½ÃÀÛÇÏÀÚ.
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;

public class SimpleLog {

  // Logger Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¹Þ¾Æ¿Â´Ù.
  static Logger logger = Logger.getLogger(SimpleLog.class);

  public SimpleLog() {}

  public static void main(String[] args) {

	/* 
    ÄַܼΠ·Î±× Ãâ·Â À§ÇÑ °£´ÜÇÑ ¼³Á¤,
    ÀÌ ¼³Á¤ÀÌ ¾ø´Ù¸é °æ°í ¸Þ¼¼Áö°¡ Ãâ·ÂµÇ¸é¼­ ½ÇÇàÀÌ ÁߴܵȴÙ.
    */
    BasicConfigurator.configure();

      logger.debug("Hello log4j.");
      logger.info("Hello log4j.");
      logger.warn("Hello log4j.");
      logger.error("Hello log4j.");
      logger.fatal("Hello log4j.");
      //loger.log( Level.DEBUG , "debug") ¿Í µ¿ÀÏÇÏ´Ù.
  }
}
½ÇÇà
---------- java ----------
0 [main] DEBUG SimpleLog - Hello log4j.
10 [main] INFO SimpleLog - Hello log4j.
10 [main] WARN SimpleLog - Hello log4j.
10 [main] ERROR SimpleLog - Hello log4j.
10 [main] FATAL SimpleLog - Hello log4j.
Ãâ·Â ¿Ï·á (1ÃÊ °æ°ú) - Á¤»ó Á¾·á

¸Ç ¾Õ¿¡ µîÀåÇÏ´Â ¼ýÀÚ´Â ·Î±ë È£Ãâ·ÎºÎÅÍ ¾ó¸¶¸¸Å­ÀÇ ½Ã°£ÀÌ Áö³µ´ÂÁö¸¦ ¹Ð¸®¼¼ÄÁµå ´ÜÀ§·Î º¸¿©ÁØ´Ù. ÀÌ Á¤º¸´Â º°·Î À¯¿ëÇÒ °Í °°Áö´Â ¾Ê´Ù. ´ÙÀ½¿¡ º¸ÀÌ´Â [main] Àº È£ÃâÇÑ ¾²·¹µåÀÇ À̸§À» ³ªÅ¸³½´Ù. ´ÙÀ½¿¡ ³ªÅ¸³ª´Â DEBUG , INFO , WARN µîÀº ·Î±× ·¹º§ÀÌ´Ù. ¼Ò½º Äڵ忡¼­ ÁöÁ¤ÇÑ ·¹º§À» ±×´ë·Î Ãâ·ÂÇØÁÖ°í ÀÖ´Ù. ±× µÚ¿¡ ³ª¿À´Â °ÍÀº º¸½Ã´Ù½ÃÇÇ Å¬·¡½ºÀÇ À̸§°ú ½ÇÁ¦ ·Î±× ¸Þ½ÃÁö¸¦ º¸¿©ÁØ´Ù. Ưº°È÷ À¯¿ëÇÑ ¿¹Á¦´Â ¾Æ´ÏÁö¸¸ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ µû¶ó System.out.println º¸´Ù´Â ±×·² µí ÇØ º¸ÀδÙ. ¿¹Á¦¿¡´Â Æ÷ÇԵǾî ÀÖÁö ¾ÊÁö¸¸ ·Î±×¸¦ Ãâ·ÂÇÒÁö¸¦ °áÁ¤ÇÏ´Â Ç÷¡±× °ªÀ» »ç¿ëÇϰųª ·¹º§·Î Á¦ÇÑÀ» Çϵµ·Ï ¼öÁ¤ÇÏ¸é ±Ý»ó÷ȭÀÏ °ÍÀÌ´Ù.


¨è Log4JÀÇ ÄÄÆ÷³ÍÆ®
Log4J´Â ¾Æ·¡¿Í °°ÀÌ Áß¿äÇÑ ÄÄÆ÷³ÍÆ®°¡ ÀÖ´Ù.

  • logger : ·Î±×ÀÇ ÁÖüÀÌ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÒ ¶§ ·Î±ëÀ» ½ÃÀÛÇϱâ Àü¿¡ ¾î¶² ·Î°Å¸¦ »ç¿ëÇÒÁö¸¦ °áÁ¤ÇÏ´Ù.
    static Logger logger = Logger.getLogger(SimpleLog.class);

  • appender : ·Î±×¸¦ Ãâ·ÂÇÏ´Â À§Ä¡ÀÌ´Ù. Äֿܼ¡ Ãâ·ÂÇÒ ¼ö ÀÖÀ¸¸ç, ÅؽºÆ® ÆÄÀÏ¿¡ ±â·ÏÇÒ ¼öµµ ÀÖ´Ù.
  • layout : ·Î±×¸¦ Ãâ·ÂÇϱâ À§ÇÑ ·¹À̾ƿôÀÌ´Ù. ÀÏÀÚ,½Ã°£,Ŭ·¡½º¸íµî ¿©·¯°¡Áö¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.


¨é Appender
Log4J API¹®¼­¸¦ º¸¸é ±âº»ÀûÀ¸·Î XXXAppender·Î ³¡³ª´Â Ŭ·¡½ºµé ÀÖ´Ù. ¾îÆæ´õ´Â Ŭ·¡½º À̸§¸¸À¸·Î »ç¿ë ¿ëµµ¸¦ ÁýÀÛÇÒ ¼ö ÀÖÀ»¸¸ÇÑ °ÍÀÌ ¸¹´Ù. ¿©±â¿¡¼­´Â ¸î¸î°³¸¸ ´Ù·ïº¸ÀÚ.
¾îÆæ´õÀÇ Ãâ·ÂÆ÷¸ËÀ» °áÁ¤ÇÏ´Â ·¹À̾ƿôÀº DateLayout, HTMLLayout, PatternLayout, SimpleLayout, XMLLayout ÀÇ 5°³°¡ ÀÖ´Ù. ÀϹÝÀûÀ¸·Î PatternLayoutÀ» »ç¿ëÇÏ´Â °ÍÀÌ µð¹ö±ë¿¡´Â °¡Àå ÀûÇÕÇÏ´Ù.
ÀÚ¼¼ÇÑ ÆÐÅÏÀº ¾Æ·¡ÀÇ Å¬·¡½º¸¦ »ìÆ캻´Ù.

import java.io.IOException;

import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public class DailyLog {
  
  static Logger logger = Logger.getLogger(DailyLog.class);
  
  public static void main(String[] args) {
    String pattern = "[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n";
    PatternLayout layout = new PatternLayout(pattern);
    
    // óÀ½ »ý¼ºµÉ ·Î±× ÆÄÀÏÀÇ À̸§
    String filename = "DailyLog.log";
    
    // ³¯Â¥ ÆÐÅÏ¿¡ µû¶ó Ãß°¡µÉ ÆÄÀÏ À̸§
    String datePattern = ".yyyy-MM-dd";
    
    DailyRollingFileAppender appender = null;
    try {
      appender = new DailyRollingFileAppender(layout, filename, datePattern);
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
    
    logger.addAppender(appender);
    
    logger.debug("Hello log4j.");
  }
}
½ÇÇà
---------- java ----------
Ãâ·Â ¿Ï·á (1ÃÊ °æ°ú) - Á¤»ó Á¾·á

DailyLog.log ÆÄÀÏÀ» ¿­¾îº¸¸é ¾Æ·¡¿Í °°Àº ³»¿ëÀÌ Ãß°¡µÈ°ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
[2004-07-29 17:36:05] DEBUG [DailyLog.main(DailyLog.java:30)] - Hello log4j.

ÆÄÀÏÀÇ ³»¿ëÀº ¼Ò½º Äڵ忡¼­ Á¤ÀÇµÈ ÆÐÅÏÀÎ "[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n" ¿¡ µû¶ó »ý¼ºµÈ °ÍÀÌ´Ù. Ãâ·ÂµÈ °Í°ú ´ëÁ¶Çغ¸¸é ´ëÃæ ¾î¶² ÀǹÌÀÎÁö À¯Ãß°¡ °¡´ÉÇÏ´Ù. ù¹ø° ³»¿ëÀº ³¯Â¥¸¦ ³ªÅ¸³½´Ù. ³¯Â¥¸¦ ³ªÅ¸³»´Â Çüŵµ SimpleDateFormat À» »ç¿ëÇÏ´Â °Íó·³ ¿øÇÏ´Â ÇüÅ·Π°¡´ÉÇÏ´Ù. ´ÙÀ½¿¡ º¸ÀÌ´Â °ÍÀº ·Î±× ·¹º§ÀÌ¸ç ´ÙÀ½¿¡ º¸ÀÌ´Â °ÍÀº [ÆÐÅ°Áö À̸§.Ŭ·¡½º À̸§.¸Þ¼Òµå À̸§(¼Ò½º ÆÄÀÏ À̸§:¼Ò½º ¶óÀÎ ³Ñ¹ö)] ÀÌ´Ù. ±×¸®°í ¸¶Áö¸·À¸·Î ½ÇÁ¦ ·Î±× ³»¿ëÀ» º¸¿©ÁØ´Ù. Ãâ·Â ÆÐÅÏÀº ÀÌ¿Ü¿¡µµ ¸¹Àº °ÍµéÀÌ Àִµ¥ ÀÚ¼¼ÇÑ »çÇ×Àº log4j API ¹®¼­¸¦ Âü°íÇϵµ·Ï ÇÏÀÚ.


¨ê properties ÆÄÀÏ ÀÌ¿ëÇϱâ
¾ÖÇø®ÄÉÀ̼ǿ¡¼­ °¢ Ŭ·¡½º´Â °¢°¢ÀÇ ·Î°Å¸¦ °¡Áö°Å³ª °øÅëÀÇ ·Î°Å¸¦ °¡Áú ¼ö ÀÖ´Ù. Log4j´Â ¸ðµç ·Î°Å°¡ »ó¼ÓÇÒ ¼ö ÀÖ´Â ·çÆ® ·Î°Å¸¦ Á¦°øÇÑ´Ù. log4j.properties¸¦ ¸¸µé¶§µµ ¸Ç À§¿¡ ÇÊ¿äÇÑ °ÍÀÌ ·çÆ®·Î°Å¿¡ ´ëÇÑ ³»¿ëÀÌ´Ù.

#log4j.rootLogger=DEBUG, A1
log4j.rootLogger=OFF, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] - %m%n

¾Æ·¡ ¹®¼­´Â log¸¦ Ãâ·ÂÇÒ ÀÚ¹Ù¹®¼­ÀÌ´Ù.
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogProperty {
  
  static Logger logger = Logger.getLogger(LogProperty.class);
  
  public static void main(String[] args) {
    logger.debug("Hello log4j.");
  }
}
½ÇÇà
---------- java ----------
Ãâ·Â ¿Ï·á (1ÃÊ °æ°ú) - Á¤»ó Á¾·á

È­¸é¿¡ Ãâ·ÂµÇ´Â ·Î±×´Â ¾ø´Ù. ¾Æ·¡¿Í °°ÀÌ º¯°æÇÑ ÈÄ ´Ù½Ã LogProperty¸¦ ½ÇÇàÇÑ´Ù.
log4j.rootLogger=DEBUG, A1
#log4j.rootLogger=OFF, A1

¾Æ·¡¿Í °°ÀÌ °á°ú°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.
---------- java ----------
[2004-07-29 18:10:33] - Hello log4j.
Ãâ·Â ¿Ï·á (3ÃÊ °æ°ú) - Á¤»ó Á¾·á


¶Ç ´Ù¸¥ ¿¹¸¦ µé¾îº¸ÀÚ. log4j.properties ¸¦ ¾Æ·¡¿Í °°ÀÌ ¼öÁ¤ÇÑ´Ù.
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=test.log
log4j.appender.A1.DatePattern='.'yyyy-mm-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n

LogProperty.java ¹®¼­¸¦ ´Ù½Ã ½ÇÇàÇÏ¸é °°Àº Æú´õ¿¡ test.log ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. test.logÆÄÀÏÀ» ¿­¾îº»´Ù.
[2004-07-29 18:17:35] DEBUG [LogProperty.main(LogProperty.java:16)] - Hello log4j.
Âü°í¹®Çå