¨ç 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·¹º§ÀÌ ÇÊ¿äÇÏ´Ù.
¿øÇÏ´Â Àå¼Ò¿¡ ¾ÐÃàÀ» Ç®¸é ¾Æ·¡¿Í °°Àº Æú´õ°¡ ³ªÅ¸³´Ù.
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·Î ³¡³ª´Â Ŭ·¡½ºµé ÀÖ´Ù.
http://logging.apache.org/log4j/docs/api/index.html
¾îÆæ´õ´Â Ŭ·¡½º À̸§¸¸À¸·Î »ç¿ë ¿ëµµ¸¦ ÁýÀÛÇÒ ¼ö ÀÖÀ»¸¸ÇÑ °ÍÀÌ ¸¹´Ù. ¿©±â¿¡¼´Â ¸î¸î°³¸¸ ´Ù·ïº¸ÀÚ.
¾îÆæ´õÀÇ Ãâ·ÂÆ÷¸ËÀ» °áÁ¤ÇÏ´Â ·¹À̾ƿôÀº 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
log4j.propertiesÀ̸§ÀÇ ÆÄÀÏ¿¡ À§ÀÇ ÇàÀ» Ãß°¡ÇÏ¿© LogProperty.class¿Í °°Àº À§Ä¡¿¡ ÀúÀåÇÑ´Ù.(LogProperty.class(LogProperty.java¸¦ ÄÄÆÄÀÏÇÑ ÈÄ »ý¼ºÆÄÀÏ)
¾Æ·¡ ¹®¼´Â 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ÆÄÀÏÀ» ¿¾îº»´Ù.
==============================================================
Log4j¿¡¼ ¿©·¯ÆÄÀÏ¿¡ ·Î±×¸¦ ³²±â´Â ¹æ¹ý¿¡ ´ëÇؼ Àá½Ã ¾ð±ÞÇÏ°Ú½À´Ï´Ù.
¾Æ·¡ ºÎºÐ¿¡¼´Â Á¸ÄªÀ» »« ´Ü¾î¸¦ »ç¿ëÇÕ´Ï´Ù.
!-----------------------------------------------------------------------------!
! category(logger) ¼³Á¤ !
!-----------------------------------------------------------------------------!
log4j.debug=true
#log4j.disable=INFO
log4j.rootLogger=DEBUG, CONSOL, SYSTEM
!-----------------------------------------------------------------------------!
! appender(log destinations/targets) ¿Í ¿É¼ÇµéÀ» ¼³Á¤ !
!-----------------------------------------------------------------------------!
! FILE¿¡ ·Î±× ¾²±â, ÁöÁ¤ÇÑ Å©±â¸¦ ³Ñ¾î¼¸é ÆÄÀÏÀ» ±³Ã¼
log4j.appender.CONSOL=org.apache.log4j.ConsoleAppender
! ·Î±×¸Þ¼¼ÁöµéÀÌ ÀüÇô ¹öÆÛµÇÁö ¾Ê´Â °ÍÀ» ÀǹÌÇÏ¸ç ´ëºÎºÐÀÇ »óȲ¿¡ Àû´çÇÏ´Ù.
log4j.appender.CONSOL.ImmediateFlush=true
! ÀÌ appender ´Â ¿©±â ¸í½ÃµÈ priority ¿Í °°°Å³ª ³ôÀº ¸Þ¼¼Áö¸¸ ·Î±ëÇÑ´Ù
log4j.appender.CONSOL.Threshold=DEBUG
! Layout Çü½Ä : TTCCLayout, HTMLLayout, XMLLayout, PatternLayout, SimpleLayout
! PatternLayout, SimpleLayout - ÀÚ¹ÙÀÇ Throwable ¿¡·¯µé°ú ¿¹¿Ü¸¦ ¹«½ÃÇÑ´Ù
log4j.appender.CONSOL.layout=org.apache.log4j.PatternLayout
! %l - ¼Ò½ºÄÚµåÀÇ À§Ä¡Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. %C. %M(%F:%L) ÀÇ Ãà¾àÇüÀÌ´Ù
log4j.appender.CONSOL.layout.ConversionPattern=%-5p %l %x =>%m%n
log4j.appender.SYSTEM=org.apache.log4j.DailyRollingFileAppender
log4j.appender.SYSTEM.File=C:/logs/system.html
! ¸ÅÀÏ ÀÚÁ¤¿¡ ·Î±×ÆÄÀÏÀ» ±³Ã¼ÇÏ¸ç ±âÁ¸ÆÄÀÏÀº xx.log_2004.07.12
log4j.appender.SYSTEM.DatePattern='.'yyyy-MM-dd
log4j.appender.SYSTEM.Threshold=DEBUG
! ÀÚ¹ÙÀÇ Throwable ¿¡·¯µé°ú ¿¹¿Ü¸¦ Æ÷ÇÔÇϱâ À§ÇØ HTMLLayoutÀ» »ç¿ëÇÑ´Ù.
log4j.appender.SYSTEM.layout=org.apache.log4j.HTMLLayout
! [%d{yyyy-MM-dd}Çü½ÄÀº ÇÁ·Î±×·¥ÀÇ ½ÇÇà¼Óµµ¸¦ ´À¸®°Ô ÇÔÀ¸·Î SimpleDateFormat Çü½ÄÁöÁ¤ÇÑ´Ù.
log4j.appender.SYSTEM.layout.DateFormat=ISO8601
! [YYYY-MM-DD HH:MM:SS, mm] Çü½ÄÀ» ¶æÇÑ´Ù.
log4j.appender.SYSTEM.layout.TimeZoneID=GMT-8:00
! %l - ¼Ò½ºÄÚµåÀÇ À§Ä¡Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. %C. %M(%F:%L) ÀÇ Ãà¾àÇüÀÌ´Ù
log4j.appender.SYSTEM.layout.ConversionPattern=[%d] %-5p %l - %m%n
! °¢ ¾÷¹« »óÀ§ÆÐÅ°Áö¸¦ ÁöÁ¤ÇÏ¿© logging ¼ÂÆÃÇÑ´Ù.
log4j.logger.rkhwang.biz.protoss=DEBUG, PROTOSS
log4j.logger.rkhwang.biz.teran=DEBUG, TERAN
log4j.logger.rkhwang.biz.zerg=DEBUG, ZERG
log4j.appender.PROTOSS=org.apache.log4j.DailyRollingFileAppender
log4j.appender.PROTOSS.File=C:/logs/protoss.log
log4j.appender.PROTOSS.DatePattern='.'yyyy-MM-dd
log4j.appender.PROTOSS.Threshold=DEBUG
log4j.appender.PROTOSS.layout=org.apache.log4j.PatternLayout
log4j.appender.PROTOSS.layout.DateFormat=ISO8601
log4j.appender.PROTOSS.layout.TimeZoneID=GMT-8:00
log4j.appender.PROTOSS.layout.ConversionPattern=[%d] %-5p %l - %m%n
log4j.appender.TERAN=org.apache.log4j.DailyRollingFileAppender
log4j.appender.TERAN.File=C:/logs/teran.log
log4j.appender.TERAN.DatePattern='.'yyyy-MM-dd
log4j.appender.TERAN.Threshold=DEBUG
log4j.appender.TERAN.layout=org.apache.log4j.PatternLayout
log4j.appender.TERAN.layout.DateFormat=ISO8601
log4j.appender.TERAN.layout.TimeZoneID=GMT-8:00
log4j.appender.TERAN.layout.ConversionPattern=[%d] %-5p %l - %m%n
log4j.appender.ZERG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ZERG.File=C:/logs/zerg.log
log4j.appender.ZERG.DatePattern='.'yyyy-MM-dd
log4j.appender.ZERG.Threshold=DEBUG
log4j.appender.ZERG.layout=org.apache.log4j.PatternLayout
log4j.appender.ZERG.layout.DateFormat=ISO8601
log4j.appender.ZERG.layout.TimeZoneID=GMT-8:00
log4j.appender.ZERG.layout.ConversionPattern=[%d] %-5p %l - %m%n
C:/logs/ ¿¡ ÇØ´ç ÆÐÅ°Áö(¾÷¹«)º°·Î ·Î±×¸¦ µû·Î °ü¸®°¡ ¿ëÀÌÇØ Áø´Ù.
log4j¸¦ »ç¿ëÇÒ °æ¿ì SYSTEM Log°¡ ¸¹ÀÌ ¹ß»ýÇÏ¿© µð¹ö±×, ¿¡·¯ ¸Þ¼¼Áö¸¦ º¸±â°¡ Èûµì´Ï´Ù.
À§¿Í °°ÀÌ ÇÒ °æ¿ì, ÇØ´ç ·Î±×¿¡´Â system¿¡¼ ¹ß»ýÇÏ´Â log´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.
½Ã½ºÅÛ¿¡¼¹ß»ýÇÏ´Â ·Î±×´Â systeml.htmlÆÄÀÏÀ» º¸½Ã¸é µË´Ï´Ù.
TipÀ̶ó°í ÇÒ ¼ö ÀÖÀ» Áö ¸ð¸£Áö¸¸, ¸¹ÀÌ µµ¿òÀ» ¹ÞÀº Àú·Î½á´Â ´Ù¸¥ ºÐµéÀÌ µµ¿òÀÌ µÇ¾úÀ¸¸é ÇÏ´Â ¸¶À½¿¡ ±ÛÀ» ¿Ã¸³´Ï´Ù.
============================================================
¿ªÀÚ: noct ( http://www.noct.pe.kr/ )
¿øº» : http://www.vipan.com/htdocs/log4jhelp.html
System.out.println À» »ç¿ëÇÏÁö ¸»°í Log4j ¸¦ »ç¿ëÇ϶ó.
Log4j¸¦ »ç¿ëÇϱâ À§ÇÑ ºü¸¥ ½ÃÀÛ
- log4j ¼ÒÇÁÆ®¿þ¾î(¾à 2.3MB)¸¦ ´Ù¿î·ÎµåÇؼ log4j.jar (¾à 156KB)¸¦ ÃßÃâÇ϶ó.
logging ¸Þ¼Òµå°¡ ÇÊ¿äÇÑ Å¬·¡½ºµéÀ» ãÀ» ¼ö ÀÖµµ·Ï log4j.jar ÆÄÀÏÀ» ¾îÇø®ÄÉÀ̼ÇÀÇ Å¬·¡½ºÆнº¿¡ Æ÷ÇÔ½ÃÄѶó.
(ÇÊÀÚ´Â log4j.jar ÆÄÀÏÀ» ÀÚ¹Ù ¼³Ä¡ µð·ºÅ丮 ¹ØÀÇ lib/ext µð·ºÅ丮¿¡ Ä«ÇÇÇß´Ù. ¿Ö³ÄÇϸé ÀÚ¹Ù´Â ÀÚµ¿ÀûÀ¸·Î
±× µð·ºÅ丮¿¡¼ ¾ò¾î¿À°í Ŭ·¡½ºÆнº¿¡ Ãß°¡Çϱ⠶§¹®ÀÌ´Ù.)
- ´ÙÀ½ÀÇ ¿¹Á¦Äڵ带 TestLogging.java ·Î ÀúÀåÇØ¿© Ŭ·¡½ºÆнº·Î ÁöÁ¤µÈ µð·ºÅ丮¿¡ À§Ä¡½ÃÅ°¶ó.
import org.apache.log4j.*;
// log4j »ç¿ë¹æ¹ý
public class TestLogging {
// loggin Ä«Å×°í¸®¸¦ ÃʱâÈÇÑ´Ù. ¿©±â¼ THE ROOT CATEGORY ¸¦ ¾ò´Â´Ù
//static Category cat = Category.getRoot();
// ¶Ç´Â »ç¿ëÀÚ Á¤ÀÇ category¸¦ ¾ò´Â´Ù
static Category cat = Category.getInstance(TestLogging.class.getName());
// ¿©±â¼ºÎÅÍ ·Î±ëÇÑ´Ù! ÇØ´ç¸Þ¼Òµåµé: cat.debug(·Î±×¸Þ¼¼Áö¹®ÀÚ¿),
// cat.info(...), cat.warn(...), cat.error(...), cat.fatal(...)
public static void main(String args[]) {
// ¸î°¡Áö ·Î±ë ¸Þ¼Òµåµé.
cat.debug("Start of main()");
cat.info("Just testing a log message with priority set to INFO");
cat.warn("Just testing a log message with priority set to WARN");
cat.error("Just testing a log message with priority set to ERROR");
cat.fatal("Just testing a log message with priority set to FATAL");
// ´ëüÇÒ ¼ö ÀÖÁö¸¸ ºÒÆíÇÑ Çü½Ä
cat.log(Priority.DEBUG, "Calling init()");
new TestLogging().init();
}
public void init() {
java.util.Properties prop = System.getProperties();
java.util.Enumeration enum = prop.propertyNames();
cat.info("***System Environment As Seen By Java***");
cat.debug("***Format: PROPERTY = VALUE***");
while (enum.hasMoreElements()) {
String key = (String) enum.nextElement();
cat.info(key + " = " + System.getProperty(key));
}
}
}
Log4j ´Â ±âº»ÀûÀ¸·Î ´Ù¼¸°³ÀÇ ¿ì¼±±Ç(ÀÌÇÏ Priority) µî±ÞÀ¸·Î ¸Þ¼¼Áö¸¦ ·Î±ëÇÒ ¼ö ÀÖ´Ù.
1. ¿Ï¼ºµÈ ¾îÇø®ÄÉÀ̼ǿ¡¼´Â Ãâ·ÂµÇÁö ¾Ê¾Æ¾ß ÇÒ µð¹ö±ë ¸Þ¼¼ÁöµéÀ» ¾²±âÀ§ÇØ debug ¸¦ »ç¿ëÇ϶ó.
2. ¾îÇø®ÄÉÀ̼ÇÀÇ verbose ¸ðµå¿¡¼ Ãâ·ÂµÉ¸¸ÇÑ ¸Þ¼¼ÁöµéÀ» ·Î±ëÇϱâ À§ÇØ info ¸¦ »ç¿ëÇ϶ó.
3. ¾îÇø®ÄÉÀ̼ÇÀÌ ÀÌ»ó¾øÀÌ °è¼Ó ½ÇÇàµÉ ¼ö ÀÖ´Â Á¤µµÀÇ °æ°í¸Þ¼¼Áö¸¦ ·Î±ëÇϱâ À§ÇØ warn À» »ç¿ëÇ϶ó.
4. ¾îÇø®ÄÉÀ̼ÇÀÌ ±×·°Àú·° µ¹¾Æ°¥¸¸ÇÑ Á¤µµÀÇ ¿¡·¯º£¼¼Áö¸¦ ·Î±ëÇϱâ À§ÇØ error ¸¦ »ç¿ëÇ϶ó.
¿¹¸¦µé¾î °ü¸®ÀÚ¿¡ ÀÇÇØ ÁÖ¾îÁø ¼³Á¤ÀÎÀÚ°¡ ¿Ã¹Ù¸£Áö ¾Ê¾Æ ÇϵåÄÚµùµÈ ±âº»°ªÀ» »ç¿ëÇØ¾ß ÇÒ °æ¿ì.
5. ·Î±ëÈÄ¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ºñÁ¤»óÀûÀ¸·Î Á¾·áµÉ Ä¡¸íÀûÀÎ ¸Þ¼¼Áö¸¦ ·Î±ëÇϱâ À§ÇØ fatal À» »ç¿ëÇ϶ó.
- ´ÙÀ½ÀÇ ¸îÁÙÀ» log4j.properties ¶ó´Â À̸§ÀÇ ÆÄÀÏ·Î ÀúÀåÇÏ°í TestLogging.class ÆÄÀÏ°ú °°Àº µð·ºÅ丮¿¡ ÀúÀåÇ϶ó.
(TestLogging.java ÆÄÀÏÀ» ÄÄÆÄÀÏ ÇÑ ÈÄ¿¡)
Log4j´Â ±âº»ÀûÀ¸·Î getRoot()°¡ È£ÃâµÇ°Å³ª getInstatnce("category_name") ÀÌ ÄÚµå»ó¿¡¼ È£ÃâµÇ¾úÀ» ¶§
¾îÇø®ÄÉÀ̼ÇÀÇ Å¬·¡½ºÆнº¿¡¼ ÀÌ ÆÄÀÏÀ» ÂþÀ» °ÍÀÌ´Ù.
log4j.rootCategory=DEBUG, dest1
log4j.appender.dest1=org.apache.log4j.ConsoleAppender
log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
PatternLayout Àº ±âº»ÀûÀ¸·Î »ç¿ëÀÚ°¡ ÀÛ¼ºÇÏ´Â ¸Þ¼¼Áö¿Í °³ÇàÀ» ÀǹÌÇÏ´Â %m %n ÀÇ ÇüÅÂÀÌ´Ù.
ÀÌ°ÍÀº Log4jÀÇ ¸Þ¼ÒµåµéÀÇ ¿©·¯ ÀåÁ¡Áß¿¡ ¾²±â¿¡ ´õ ª´Ù´Â °ÍÀ» Á¦¿ÜÇÏ°í´Â
JavaÀÇ System.out.println(...) ¸Þ¼Òµå¿Í Á¤È®È÷ µ¿ÀÏÇÏ°Ô Ãâ·ÂµÈ´Ù.
- TestLoggin.java ÆÄÀÏÀ» ÄÄÆÄÀÏ ÇÏ°í ½ÇÇàÇßÀ» ¶§ ´ÙÀ½°ú À¯»çÇÑ Ãâ·ÂÀ» ¾ò°Ô µÉ °ÍÀÌ´Ù.
Start of main()
Just testing a log message with priority set to INFO
Just testing a log message with priority set to WARN
Just testing a log message with priority set to ERROR
Just testing a log message with priority set to FATAL
Calling init()
***System Environment As Seen By Java***
***Format: PROPERTY = VALUE***
java.runtime.name = Java(TM) 2 Runtime Environment, Standard Edition
sun.boot.library.path = c:jdk1.3jrebin
java.vm.version = 1.3.0_02
java.vm.vendor = Sun Microsystems Inc.
... and so on
- ¸¸¾à ¸Þ¼¼Áö ´ÙÀ½¿¡ priority ¸¦ Ãâ·ÂÇÏ°í ½Í´Ù¸é(´ç½ÅÀÌ ÁöÁ¤ÇÑ ¸Þ¼¼Áö¿¡)
´ÙÀ½ ¶óÀÎÀ» log4j.properties ÆÄÀÏ¿¡ Ãß°¡ÇÏ°í ÀúÀåÇÏ¸é µÈ´Ù.
log4j.appender.dest1.layout.ConversionPattern=%-5p: %m%n
±âº»°ªÀÎ %m %n À» ¿À¹ö¶óÀ̵å ÇÑ´Ù. %p ´Â ¸Þ¼¼ÁöÀÇ priority¸¦, %mÀº ¸Þ¼¼Áö ÀÚü¸¦,
%n Àº °³Ç๮ÀÚ¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù.
´ç½ÅÀº ¾î¶² ÀÚ¹ÙÄڵ带 ¹Ù²ÜÇÊ¿äµµ ¾ø°í, TestLogging.java ÆÄÀÏÀ» ÀçÄÄÆÄÀÏ ÇÒ ÇÊ¿äµµ ¾øÀÌ
´ÜÁö properties ÆÄÀϸ¸ ¹Ù²Ù¸é µÈ´Ù.
DEBUG: Start of main()
INFO : Just testing a log message with priority set to INFO
WARN : Just testing a log message with priority set to WARN
ERROR: Just testing a log message with priority set to ERROR
FATAL: Just testing a log message with priority set to FATAL
DEBUG: Calling init()
INFO : ***System Environment As Seen By Java***
DEBUG: ***Format: PROPERTY = VALUE***
INFO : java.runtime.name = Java(TM) 2 Runtime Environment, Standard Edition
INFO : sun.boot.library.path = c:jdk1.3jrebin
INFO : java.vm.version = 1.3.0_02
INFO : java.vm.vendor = Sun Microsystems Inc.
... and so on
¸¸¾à DEBUG ³ª INFO ¸Þ¼¼Áö¿¡ Áú·Á¼ À̰͵éÀÌ Ãâ·ÂµÇÁö ¾Ê±â¸¦ ¿øÇÏ°í, ´Ù¸¥ ¸Þ¼¼ÁöµéÀ» ¿©ÀüÈ÷ Ãâ·ÂµÇ±æ ¿øÇÑ´Ù¸é
(¿¹¸¦ µé¾î, ¾îÇø®ÄÉÀ̼ÇÀÌ »ý»êÀÌ ½ÃÀÛµÉ Áغñ°¡ µÇ¾úÀ» ¶§) log4j.rootCategory=DEBUF, dest1 ÇàÀ»
log4j.rootCategory=WARN, dest1 À¸·Î ¼öÁ¤ÇÏ¸é µÈ´Ù.
À§ÀÇ ÇàÀº WARN º¸´Ù priority°¡ ³·Àº µî±Þ(DEBUG¿Í INFO °°Àº)ÀÇ ¸Þ¼¼ÁöµéÀ» Á¦¿ÜÇÏ´Â °ÍÀÌ´Ù.
¼öÁ¤ÇÏ¸é ´ÙÀ½°ú °°ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù.
WARN : Just testing a log message with priority set to WARN
ERROR: Just testing a log message with priority set to ERROR
FATAL: Just testing a log message with priority set to FATAL
Log4jÀÇ »ó¼¼
- Log4j¿¡´Â ¼¼°³ÀÇ ÁÖ¿äÇÑ ÄÄÆ÷³ÍÆ®°¡ ÀÖ´Ù. À̰͵éÀº Categories, appenders ±×¸®°í layouts ÀÌ´Ù.
- Category¸¦ ÃʱâÈ ½ÃÅ°°í ±× ÈÄ¿¡ ¿©·¯ ·Î±ë¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ·Î±×ÆÄÀÏ·Î ¸Þ¼¼Áö¸¦ º¸³½´Ù.
- ÇϳªÀÇ Category´Â Çϳª ȤÀº ±× ÀÌ»óÀÇ ´ë»ó(¸ñÀûÁö)¿¡ ·Î±×Çϵµ·Ï ¼³Á¤µÈ´Ù.
Log4j ¿¡¼´Â ÀÌ ´ë»óÀ» "appenders" ¶ó°í ºÎ¸¥´Ù. ¿Ö³ÄÇϸé ÀÌ Å¬·¡½ºµéÀº ±âº»ÀûÀ¸·Î ¸Þ¼¼Áö ¹®ÀÚ¿À» ·Î±×ÀÇ ³¡¿¡
´õÇϱâ(append) ¶§¹®ÀÏ °ÍÀÌ´Ù.
Log4j ´Â ÇѹøÀÇ ·Î±ëÀ» È£ÃâÇÔÀ¸·Î ·Î±×¸Þ¼¼Áö¸¦ ÄܼÖ, ÅؽºÆ®ÆÄÀÏ, html ÆÄÀÏ, xml ÆÄÀÏ, ¼ÒÄÏÀ̳ª
½ÉÁö¾î´Â Windows NT Event Log µî ¸ðµç °ÍÀ¸·Î º¸³¾ ¼ö ÀÖ´Ù.
°Å±â´Ù ·Î±×¸Þ¼¼Áö¸¦ À̸ÞÀÏ·Î Àü¼ÛÇÒ ¼öµµ ÀÖ´Ù.(¿¹¸¦ µé¾î Ä¡¸íÀûÀÎ ¿¡·¯°¡ ³¯ °æ¿ì »ç¿ëÇϱâ Àû´çÇÏ´Ù)
- ¸î¸î appender Ŭ·¡½ºµéÀ» ³ª¿ÇÏÀÚ¸é ConsoleAppender, FileAppender, SMTPAppender, SocketAppender,
NTEventLogAppender, SyslogAppender, JMSAppender, AsyncAppender and NullAppender °¡ ÀÖ´Ù.
- appender ´Â ½ÇÁ¦·Î ·Î±×¿¡ ¾²±â Àü¿¡ ¸Þ¼¼Áö Çü½ÄÀ» ¸¸µå´Â layout À» »ç¿ëÇÑ´Ù.
¿¹¸¦µé¾î HTMLLayout Àº ¸ðµç ¸Þ¼¼Áö¸¦ º¸±âÁÁÀº HTML Å×À̺í Çü½ÄÀ¸·Î ¸¸µé°ÍÀÌ´Ù.
- Log4j´Â ³¯Â¥, ½Ã°£, ¸Þ¼¼Áö priority(DEBUG, WARN, FATAL µî), Java Ŭ·¡½º¸í,
¼Ò½ºÄÚµåÀÇ Çà¹øÈ£, ¸Þ¼Òµå¸í, Java ½º·¹µåÀÇ À̸§ µîµîÀ» ´ç½ÅÀÌ º¸³»´Â ·Î±×¸Þ¼¼Áö¿¡ ´õÇÒ ¼ö ÀÖ´Ù.
·Î±×ÇÏ´Â °ÍÀº appender ¿¡ ¼³Á¤µÈ layout ¿¡ ¸í½ÃµÈ´ë·ÎÀÌ´Ù.
- Category ´Â »ç¿ëÀÚ°¡ ÁöÁ¤ÇÏ¸ç ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏ´Â µµÆ®·Î ±¸ºÐµÈ ¹®ÀÚ¿ÀÌ´Ù. ¿ÏÀüÇÑ À̸§ÀÇ Àڹ٠Ŭ·¡½º¸¦ ¾ò°í
±×°ÍÀ» Category À̸§À¸·Î ÁöÁ¤Çϱâ À§ÇØ º¸Åë Ŭ·¡½º¸í.class.getName() À» »ç¿ëÇÑ´Ù.
(°Ô´Ù°¡ runtime ½Ã¿¡ category ¸íÀ» ·Î±ëÇÏ´Â °ÍÀÌ class ¸íÀ» ·Î±ëÇÏ´Â °Íº¸´Ù ÈξÀ ´õ ºü¸£´Ù.
¸¸¾à ºü¸£¸é¼µµ Ŭ·¡½º¸íÀ» ·Î±ëÇÏ°í ½Í´Ù¸é, class¸íÀ» categoryÀÇ À̸§À¸·Î ÁöÁ¤ÇÏ°í, Ä«Å×°í¸® À̸§À» ·Î±ëÇ϶ó!)
- category¸íÀÇ °¢°¢ÀÇ ´Ü¾î´Â ±× ´ÙÀ½ À̾îÁö´Â ´Ü¾îÀÇ ancestor(Á¶»ó)¶ó ÇÏ°í, ¹Ù·Î ´ÙÀ½ ´Ü¾îÀÇ parent(ºÎ¸ð)ÀÌ´Ù.
Log4j ´Â ƯÁ¤ category ¿¡¼ ¿À¹ö¶óÀÌµå µÉ¶§±îÁö ancestor(Á¶»ó)À¸·ÎºÎÅÍ priority¿Í appender ¸¦
»ó¼ÓÇÏ´Â °³³äÀÌ Àֱ⠶§¹®¿¡, ÀÌ´Â ¸Å¿ì Áß¿äÇÏ´Ù.
- XML ¹®¼ÀÇ root ¿Í °°ÀÌ log4j ¿¡´Â ¾ðÁ¦³ª À̸§ÀÌ ¾ø´Â root category °¡ Á¸ÀçÇÑ´Ù.
category ¸¦ ÃʱâÈÇϱâ À§ÇØ Category Ŭ·¡½ºÀÇ static ¸Þ¼Òµå¸¦ »ç¿ëÇÑ´Ù.
Category cat = Category.getRoot();
Category cat2 = Category.getInstance("your.category.name");
ƯÁ¤ category À̸§À» À§ÇØ Category.getInstance(...) ¸Þ¼Òµå´Â Ç×»ó Á¤È®È÷ µ¿ÀÏÇÑ Category °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù.
µû¶ó¼ Category ¸¦ ÃʱâÈÇؼ Â÷·Ê·Î µ¹¸± ÇÊ¿ä°¡ ¾ø´Ù. ´ë½Å
ÇÊ¿äÇÑ ¾î´À°÷À̵ç Category.getInstance("wanted.category.name"); À» ½áÁÖ¸é µÈ´Ù.
- "com.comp"¶ó´Â ÆÐÅ°ÁöÀÇ "TestApp" ¶ó´Â À̸§ÀÇ Å¬·¡½º·Î Category¸¦ ÀνºÅϽºÈ ÇÏ´Â ÀüÇüÀûÀÎ ¹æ¹ýÀº
static Category cat = Category.getInstance(TestApp.class.getName());
TestApp ´Â Ŭ·¡½ºÀ̸§ ÀÚüÀÌÁö ÀνºÅϽº°¡ ¾Æ´Ï¶ó´Â °ÍÀ» ¸í½ÉÇ϶ó. ¶ÇÇÑ TestApp.class ±¸¹®Àº TestApp Ŭ·¡½ºÀÇ
»õ·Î¿î ÀνºÅϽº¸¦ »ý¼ºÇÏÁö ¾Ê´Â´Ù.
- Priority Ŭ·¡½ºÀÇ ´Ù¼¸°³ priority(¿ì¼±±Ç) »ó¼ö´Â ¿ì¼±±ÇÀÌ °¨¼ÒÇÏ´Â Â÷·Ê·Î FATAL, ERROR, WRAN, INFO, DEBUG ÀÌ´Ù.
¿øÇÑ´Ù¸é (Priority Ŭ·¡½º¸¦) »ó¼Ó¹ÞÀ½À¸·Î½á ±× ÀÌ»óÀÇ priority¸¦ ¸¸µé ¼ö ÀÖ´Ù.
- category µé¿¡°Ô priority ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖÁö¸¸ ²À ±×·² ÇÊ¿ä´Â ¾ø´Ù.
¸¸¾à priority ¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é log4j ´Â »ó¼Ó°ü°èÀÇ °èÃþ±¸Á¶¸¦ µû¶ó¼ °¡Àå ¸ÕÀú ÇÒ´çµÈ °ÍÀ» ã¾Æ »ç¿ëÇÑ´Ù.
root category´Â Ç×»ó ÁöÁ¤µÈ priority°¡ ÀÖ´Ù.(±âº»°ªÀº Priority.DEBUG),
µû¶ó¼ ¸ðµç category µéÀº Ç×»ó priority¸¦ °®µµ·Ï º¸ÀåµÇ¾î ÀÖ´Ù.
- Category Ŭ·¡½ºÀÇ logging ¸Þ¼ÒµåÀÇ »ç¿ë
// ÀϹÝÀûÀÎ ·Î±ë ¸Þ¼Òµå (ºÒÆíÇÔ)
public void log(Priority p, Object message);
// Æí¸®ÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â ÀϹÝÀûÀÎ ·Î±ë ¸Þ¼Òµå
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);
- log4j´Â categoryÀÇ log(...) ¸Þ¼Òµå°¡ ÁöÁ¤ÇÑ priority°¡ category°¡ ÇÒ´çµÇ°Å³ª »ó¼Ó¹ÞÀº priority¿Í
°°°Å³ª ´õ ³ôÀ» ¶§¿¡¸¸ ·Î±ëÇÑ´Ù.
Category cat = Category.getRoot();
cat.setPriority(Priority.ERROR);
// Later...
//cat.info("Started processing..."); //Will not log
cat.error("User input is erroneous!"); //Will log
cat.fatal("Cannot process user input. Program terminated!"); //Will log
Log4j ¼³Á¤
- ·Î±ëÀÌ °¡´ÉÇØÁö±â Àü¿¡, ù°·Î log4j ¸¦ ¼³Á¤ÇؾßÇÑ´Ù. Log4j ¸¦ ¼³Á¤ÇÑ´Ù´Â °ÍÀº category(loggers) µé¿¡
appender (¸ñÀûÁö/´ë»ó/Çڵ鷯)µéÀ» ´õÇÏ°í °¢°¢ÀÇ appender ¿¡°Ô layout(Àüü±¸¼º)À» ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù.
- category µéÀº ¾î¶² ¼ø¼·Îµç »ý¼ºµÇ°í ¼³Á¤µÉ ¼ö ÀÖ´Ù. ƯÈ÷ category ´Â ±×°ÍÀÇ decendants(ÀÚ¼Õµé)À» ã¾Æ
¿¬°áÇÒ ¼ö ÀÖ°í, ½ÉÁö¾î ±×°Íµéº¸´Ù ³ªÁß¿¡ ÀνºÅϽºÈ µÉ ¼ö ÀÖ´Ù.
- ÀϹÝÀûÀ¸·Î Log4j ´Â ¾îÇø®ÄÉÀ̼ÇÀÌ ÃʱâȵǴ µ¿¾È º¸Åë ¼³Á¤ÆÄÀÏÀ» Àоîµé¿© Çѹø¸¸ ¼³Á¤µÈ´Ù.
- ¶ÇÇÑ category °´Ã¼ÀÇ addAppender() ¸Þ¼Òµå¸¦ »ç¿ëÇÔÀ¸·Î½á ƯÁ¤ appender ¿¡ ·Î±×Çϵµ·Ï ÇÁ·Î±×·¡¹ÖÀûÀ¸·Î
category¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¿øÇÏ´Â ¸¸Å ´õÇÒ ¼ö ÀÖ´Ù(¿øÇÏÁö ¾Ê´Â´Ù¸é ÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù)
ÀÌ ¸Þ¼Òµå´Â º¸Åë ÃßõÇÏÁö ¾Ê´Â´Ù ¿Ö³Ä ÇÏ¸é ¼Ò½ºÆÄÀÏÀ» ¼öÁ¤ÇÏ¿© ´Ù½Ã ÄÄÆÄÀÏ ÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù.
java ÇÁ·ÎÆÛƼ ÆÄÀÏÀ̳ª XML ÆÄÀÏ °°Àº ¿ÜºÎ ¼³Á¤ÆÄÀÏÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ ´õ ÁÁÀº ¹æ¹ýÀÌ´Ù.
- appender µéÀº singleton ÀÌ ¾Æ´Ï¶ó Ãß°¡µÈ´Ù´Â °ÍÀ» ÁÖÀÇÇ϶ó.
category ´Â ±âº»ÀûÀ¸·Î ±×°ÍÀÇ Á¶»ó¿¡¼ ºÎÅÍÀÇ ¸ðµç appender µéÀ» ¹°·Á¹Þ´Â´Ù.
¸¸¾à appender ¸¦ category¿¡ ´õÇÏ°í ±×°ÍÀÇ ±â¹ÝÀÌ µÇ´Â µ¿ÀÏÇÑ ½ºÆ®¸²¿¡ ¾´´Ù¸é(ÄܼÖ, °°Àº ÆÄÀÏ µî)
°°Àº ·Î±×¸Þ¼¼Áö°¡ µÎ¹ø ÀÌ»ó ·Î±×µÉ °ÍÀÌ´Ù.
°Ô´Ù°¡ ¸¸¾à °èÃþ±¸Á¶ÀÇ µÎ°³ÀÇ category µéÀÌ °°Àº appender À̸§À» »ç¿ëÇÑ´Ù¸é,
Log4j ´Â ±× appender µé¿¡ µÎ¹ø ¾µ °ÍÀÌ´Ù.
appender ·ÎºÎÅÍ ¹°·Á¹Þ´Â °ÍÀ» ºÒ°¡´ÉÇÏ°Ô Çϱâ À§ÇØ categoryÀÇ cat.setAdditivity(false) ¸Þ¼Òµå¸¦ »ç¿ëÇ϶ó.
±×·¯¸é ·Î±× ¸Þ¼¼Áö´Â ÇØ´ç category¿¡ Ưº°È÷ ¼³Á¤µÈ appender ·Î¸¸ º¸³»Áú °ÍÀÌ´Ù.
- Á¤Àû ¸Þ¼ÒµåÀÎ BasicConfigurator.configure() ¸Þ¼Òµå´Â System.out.println(...) ±¸¹®ÀÌ ±×·¯Çϵí Äֿܼ¡ ·Î±ëÇÑ´Ù.
ÀÌ ¸Þ¼Òµå´Â ·çÆ® category ¿¡ ConsoleAppender ¸¦ ºÙ¿© Äֿܼ¡ ÇÁ¸°Æ® ÇÏ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Ù.
Ãâ·ÂÀº %-4r [%t] %-5p %c %x - %m%n À¸·Î ¼¼ÆÃµÈ PatternLayout À» »ç¿ëÇÏ¿© ±¸¼ºµÈ´Ù.
ÀÌ ¸Þ¼Òµå´Â log4j.properties ÆÄÀÏÀ» »ç¿ëÇÏ´Â °ÍÀÌ ´õ °£´ÜÇÏ°í À¯¿¬Çϱ⠶§¹®¿¡ ±×´ÙÁö ÇÊ¿äÇÏÁö ¾Ê´Ù.
- log4j ¸¦ ¼³Á¤ÇÏ´Â ±âº» ÆÄÀÏÀº log4j.properties ÀÌ´Ù.
ÀÌ ÆÄÀÏÀ» ¾îÇø®ÄÉÀ̼ÇÀÇ Å¬·¡½ºÆнº¿¡ ÁöÁ¤µÈ ¾î´À°÷À̵ç À§Ä¡½ÃŲ´Ù.
- Java ÇÁ·ÎÆÛƼ ÆÄÀÏ¿¡¼ ¼³Á¤ Á¤º¸¸¦ Àоî¿À·Á¸é Á¤Àû¸Þ¼Òµå Áß ÇϳªÀÎ PropertyConfigurator.configure(...)
¸Þ¼Òµå¸¦ »ç¿ëÇ϶ó. ÀÌ¹Ì ¼³Á¤µÇ¾î ÀÖ´Â ¼³Á¤Àº Áö¿öÁöÁöµµ Àç¼³Á¤µÇÁöµµ ¾Ê´Â´Ù. ÀÌ ¸Þ¼Òµå¸¦ »ç¿ëÇÏ·Á¸é
Á¤Àû¸Þ¼ÒµåÀÎ BasicConfigurator.resetConfiguration() ¸Þ¼Òµå¸¦ ¸ÕÀú È£ÃâÇ϶ó. ÀÌ ¸Þ¼Òµå »ç¿ëÀº Äڵ带 ±æ°í
º¹ÀâÇÏ°Ô ÇÒ ¼öµµ ÀÖ´Ù. Ãʺ¸ÀÚ´Â °¢°¢ÀÇ ¾îÇø®ÄÉÀ̼ÇÀÇ ·çÆ®µð·ºÅ丮¿¡ log4j.properties ÆÄÀÏ Çϳª¸¸ À§Ä¡½ÃÄѶó.
- log4j ¿¹Á¦ ¼³Á¤ ÆÄÀÏ
# root categoryÀÇ priority ¸¦ to DEBUG ·Î ¼³Á¤ÇÏ°í appender ¸¦ A1 À¸·Î ÁöÁ¤ÇÑ´Ù.
log4j.rootCategory=DEBUG, A1
# A1 À» ConsoleAppender ·Î ÁöÁ¤(½Ã½ºÅÛ Äֿܼ¡ Ãâ·ÂÇÏ´Â).
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 À» PatternLayout À» »ç¿ëÇϵµ·Ï.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
ÀÌ ¿¹Á¦ ÆÄÀÏÀº BasicConfigurator.configure() ¸Þ¼Òµå¸¦ »ç¿ëÇÑ°Í°ú ¿ÏÀüÈ÷ °°ÀÌ log4j¸¦ ¼³Á¤ÇÑ´Ù. ±×·¯³ª À̹æ¹ýÀ¸·Î Çϸé
³ªÁß¿¡ ¼³Á¤À» ¼öÁ¤ÇÒ ¶§¿¡, ¿¹¸¦µé¾î DEBUG ¸¦ FATAL·Î ÇÁ·ÎÆÛƼ ÆÄÀÏÀ» °íÄ¡°í ¾î¶² ÀÚ¹ÙÆÄÀϵµ ÀçÄÄÆÄÀÏ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
- ´õ º¹ÀâÇÑ log4j ¼³Á¤ÆÄÀÏ
#### µÎ°³ÀÇ appender¸¦ »ç¿ëÇϸç, Çϳª´Â Äֿܼ¡ ·Î±ëÇÏ°í ´Ù¸¥ Çϳª´Â ÆÄÀÏ¿¡ ·Î±ëÇÑ´Ù.
log4j.rootCategory=debug, stdout, R
# priority°¡ WARN º¸´Ù °°°Å³ª ´õ ³ôÀº ¸Þ¼¼Áö¸¸ Ãâ·ÂÇÑ´Ù.
log4j.category.your.category.name=WARN
# Specifically inherit the priority level
#log4j.category.your.category.name=INHERITED
#### ù¹ø° appender´Â Äֿܼ¡ ¾´´Ù.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# È£ÃâÇÏ´Â ÆÄÀϸí°ú ¶óÀγѹö¸¦ Ãâ·ÂÇÏ´Â Pattern
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
#### µÎ¹ø° appender ´Â ÆÄÀÏ¿¡ ¾´´Ù.
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
# ÃÖ´ë·Î±×ÆÄÀÏ Å©±â¸¦ Á¶Àý
log4j.appender.R.MaxFileSize=100KB
# ÁýÀûÇÏ´Â ·Î±×ÆÄÀÏÀÇ ¼ö (¿©±â¼´Â ÇϳªÀÇ ¹é¾÷ÆÄÀÏ)
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
ÀÌÁ¦ Ãâ·ÂÀº example.log ¶ó´Â ÆÄÀÏ¿¡ µ¡ºÙ¿©Áú °ÍÀÌ°í, ÀÌ ÆÄÀÏÀº Å©±â°¡ 100KB °¡ µÉ¶§ ·Ñ¿À¹ö µÉ°ÍÀÌ´Ù.
·Ñ¿À¹ö°¡ ÀϾ ¶§ ±¸¹öÀüÀÇ example.log ÆÄÀÏÀº ÀÚµ¿À¸·Î example.log.1 ÆÄÀÏ·Î ¹Ù²ï´Ù.
DailyRollingFileAppender ¸¦ »ç¿ëÇÏ¿© ÆÄÀÏÀ» ¸ÅºÐ, ¸Å½Ã°£, ¸ÅÀÏ, ¸ÅÁÖ, ¸Å´Þ ¶Ç´Â ÇÏ·ç 2ȸ¾¿ ·Ñ¿À¹öµÇ°Ô ÇÒ ¼ö ÀÖ´Ù.
- ¼¹ö °°ÀÌ ¿À·§µ¿¾È ½ÇÇàµÇ´Â ÇÁ·Î±×·¥¿¡¼´Â Java ÇÁ·ÎÆÛƼ ÆÄÀÏÀ» ÀÌ¿ëÇÏ¿© ȯ°æ¼³Á¤À» Çϱâ À§ÇØ
configureAndWatch(String configFilename, long delay_in_milliseconds)¸¦ »ç¿ëÇÑ´Ù.
Log4j ´Â ¸î ¹Ð¸®¼¼ÄÁµå ¸¶´Ù ÇÁ·ÎÆÛƼ ÆÄÀÏÀÌ º¯ÇÏ´ÂÁö¸¦ °è¼Ó ¸ð´ÏÅ͸µ ÇÏ´Ù°¡
ÇÁ·ÎÆÛƼ ÆÄÀÏÀÌ º¯ÇÏ¸é ¼³Á¤À» ¾÷µ¥ÀÌÆ®ÇÒ°ÍÀÌ´Ù.
- ÇÁ·Î±×·¥ Ãâ½Ã´Ü°è°¡ µÇ¸é ºü¸¥ ¼º´ÉÀ» À§ÇØ °èÃþ±¸Á¶ÀÇ ¸ðµç category¿¡¼ ƯÁ¤ priority ÀÌÇÏÀÇ ¸ðµç ¸Þ¼¼Áö¸¦
·Î±ëÇÏÁö ¾Êµµ·Ï ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ¾Æ¹«°Íµµ ·Î±ëÇÏÁö ¾ÊÀ¸·Á¸é, log.diable=FATAL À»
¼³Á¤ÆÄÀÏ(propertyÆÄÀÏ)¿¡ ¸í½ÃÇØÁÖ¸é µÈ´Ù.
´Ü log.disableOverride ÇÁ·ÎÆÛƼ°¡ false ·Î ¼¼ÆõǾî ÀÖÁö ¾Ê´Ù¸é ¿¹¿Ü°¡ ÀϾÙ.
µû¶ó¼ ½Ã½ºÅÛ °ü¸®ÀÚ´Â log.disableÀ» ¿À¹ö¶óÀ̵å ÇÒ ¼ö ÀÖµµ·Ï ȯ°æ¼³Á¤ ÆÄÀÏ¿¡
log.disableOverride=true ¸¦ (ÀϽÃÀûÀ¸·Î)¸í½ÃÇÏ°í ¸ðµç ¸Þ¼¼Áö¸¦ ·Î±×Çؼ »ý±â´Â ¹®Á¦¸¦ Á¶»çÇغÁ¾ß ÇÑ´Ù.
À¯¿ëÇÑ Layout µé
- ¸î°¡Áö layout Ŭ·¡½ºµéÀ» µéÀÚ¸é TTCCLayout, HTMLLayout, PatternLayout, SimpleLayout ±×¸®°í XMLLayoutÀÌ ÀÖ´Ù.
- SimpleLayout °ú PatternLayout Ŭ·¡½ºµéÀº ÀÚ¹ÙÀÇ Throwable ¿¡·¯µé°ú ¿¹¿Ü¸¦ ¹«½ÃÇÑ´Ù.
HTMLLayout°ú XMLLAyout Àº ±×°ÍµéÀ» ´Ù·é´Ù.
- SimpleLayout Àº ·Î±× ±¸¹®ÀÇ property ¿¡ À̾î "-" À̳ª¿À°í ·Î±×¸Þ¼¼Áö°¡ ³ª¿À´Â ±¸¼ºÀÌ´Ù. ¿¹¸¦ µé¾î
DEBUG - Hello world
- PatternLayout Àº C¾ð¾îÀÇ printf ÇÔ¼ö¿Í À¯»çÇÑ º¯È¯ ÆÐÅÏ¿¡ µû¶ó Ãâ·ÂÀ» Çü½ÄÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.
PatternLayout ÀÇ º¯È¯ Çü½ÄÀ» %r [%t] %-5p %c - %m%n ·Î ÇÏ¸é ´ÙÀ½°ú °°ÀÌ Ãâ·ÂµÈ´Ù.
176 [main] INFO org.foo.Bar - Located nearest gas station
- °¡Àå ù Çʵå´Â ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÈ ÈķκÎÅÍ °æ°úµÈ ½Ã°£ÀÇ ¹Ð¸®¼¼ÄÁµå °ªÀÌ´Ù.
- µÎ¹ø° Çʵå´Â ·Î±× ¿äûÀ» ¸¸µç ½º·¹µåÀÌ´Ù.
- ¼¼¹ø° Çʵå´Â ·Î±× ±¸¹®ÀÇ priority ÀÌ´Ù.
- ³×¹ø° Çʵå´Â ·Î±×¿äû¿¡ °ü·ÃµÈ categoryÀÇ À̸§ÀÌ´Ù.
- "-" µÚÀÇ ¹®ÀÚ¿Àº ·Î±ë¸Þ¼¼ÁöÀÌ´Ù.
- º¯È¯ Çü½Ä¿¡ ¾î¶² ¹®ÀÚµµ »ðÀ﵃ ¼ö ÀÖ´Ù.
- º¯È¯ ¹®ÀÚµéÀº ´ÙÀ½°ú °°´Ù.
- %m : ´ç½ÅÀÌ ÁöÁ¤ÇÑ ¸Þ¼¼Áö¸¦ Ãâ·Â
- %p : ·Î±ë À̺¥Æ®ÀÇ priority ¸¦ Ãâ·Â
- %r : ¾îÇø®ÄÉÀ̼ÇÀÌ ½ÃÀÛµÇ¾î ·Î±ëÀ̺¥Æ®°¡ ÀϾ¶§±îÁöÀÇ °æ°ú½Ã°£À» ¹Ð¸®¼¼ÄÁµå °ªÀ¸·Î Ãâ·Â
- %c : ·Î±ëÀ̺¥Æ®ÀÇ category¸¦ Ãâ·ÂÇÑ´Ù. ¿¹¸¦ µé¾î category À̸§ÀÌ "a.b.c" À϶§ %c{2} ´Â "b.c"¸¦ Ãâ·ÂÇϸç {2}´Â
µµÆ®(.)·Î ±¸ºÐµÈ category À̸§ÀÇ ¸¶Áö¸· µÎ°³ÀÇ ÄÄÆ÷³ÍÆ®¸¦ ÀǹÌÇÑ´Ù.
{n} ÀÌ ¾øÀ¸¸é ±âº»ÀûÀ¸·Î Ä«Å×°í¸®ÀÇ À̸§À» ¸ðµÎ Ãâ·ÂÇÑ´Ù.
- %t : ·Î±ë À̺¥Æ®¸¦ »ý¼ºÇÑ ½º·¹µå À̸§À» Ãâ·Â
- %x : ·Î±ëÀ̺¥Æ®¸¦ ¹ß»ý½ÃŲ ½º·¹µå¿¡ °ü·ÃµÈ ³»Æ÷°Ë»çÇ׸ñ(Nested Diagnostic Context : NDC)À» Ãâ·ÂÇÑ´Ù.
Java Servlet °ú °°ÀÌ ´Ù¼öÀÇ Å¬¶óÀ̾ðÆ®°¡ ºÐ»êµÈ ½º·¹µå¿¡ ÀÇÇØ ´Ù·ç¾î Áú ¶§ À¯¿ëÇÏ´Ù.
- %n : Ç÷§Æû µ¶¸³ÀûÀÎ °³Ç๮ÀÚ¸¦ Ãâ·ÂÇÑ´Ù. "n" ¶Ç´Â "nr" µîÀÌ ÁöÁ¤µÉ ¼ö ÀÖ´Ù.
- %% : ÇϳªÀÇ % ±âÈ£¸¦ Ãâ·ÂÇÑ´Ù.
- °æ°í : ¾Æ·¡ÀÇ Çü½ÄÀº ÇÁ·Î±×·¥ÀÇ ½ÇÇà¼Óµµ¸¦ ´À¸®°Ô ÇÑ´Ù. ½ÇÇà¼Óµµ°¡ Áß¿äÇÏÁö ¾ÊÀº °ÍÀÌ ¾Æ´Ï¶ó¸é »ç¿ëÀ» ÇÇÇϵµ·Ï ÇÑ´Ù.
- %d : ·Î±ëÀ̺¥Æ®°¡ ÀÏ¾î³ ³¯ÀÚ(date)À» Ãâ·ÂÇÑ´Ù.
date º¯È¯ ÁöÁ¤ÀÚ´Â ³¯Â¥Çü½Ä ÁöÁ¤ÀÚ µÚ¿¡ ÀÌ¾î ³ª¿À´Â brace({..}) »çÀÌ¿¡ µÑ·¯½×¿© ³ª¿Â´Ù.
¿¹: %d{HH:mm:ss,SSS} ¶Ç´Â %d{dd MMM yyyy HH:mm:ss,SSS}
¸¸¾à ³¯ÀÚ Çü½Ä ÁöÁ¤ÀÚ°¡ ÁÖ¾îÁ®ÀÖÁö ¾Ê´Ù¸é ISO8601 Çü½ÄÀ¸·Î ³ªÅ¸³´Ù. ³¯Â¥Çü½Ä ÁöÁ¤ÀÚ´Â ÀÚ¹ÙÀÇ ¼Óµµ°¡ ´À¸°
SimpleDateFormat Ŭ·¡½ºÀÇ ½Ã°£Çü½Ä ¹®ÀÚ¿°ú °°Àº ¹®¹ýÀ» ¼ö¿ëÇß´Ù.
´õ ºü¸¥ ¼º´ÉÀ» À§ÇØ %d{ISO8601}, %d{ABSOLUTE}, %{RELATIVE}(ÇÁ·Î±×·¥ ½ÃÀÛ ÈÄ °æ°ú½Ã°£ÀÇ ¹Ð¸®¼¼ÄÁµå°ªÀ» ³ªÅ¸³»¸ç
°¡Àå ºü¸£´Ù) ¶Ç´Â %d{DATE} ¸¦ »ç¿ëÇÏ¸ç °¢°¢Àº
log4jÀÇ ISO8601DateFormat, AbsoluteTimeDateFormat, RelativeTimeDateFormat, DateTimeDateFormat ³¯ÀÚÇü½ÄÀ» »ç¿ëÇÑ´Ù.
- %l : ¼Ò½ºÄÚµåÀÇ À§Ä¡Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. %C. %M(%F:%L) ÀÇ Ãà¾àÇüÀÌ´Ù.
- %C : ·Î±ë¿äûÀ» ÀÏÀ¸Å² È£ÃâÀÚÀÇ ¿ÏÀüÇÑ Å¬·¡½ºÀ̸§À» Ãâ·ÂÇÑ´Ù.
¿¹¸¦µé¾î "org.apache.xyz.SomeClass"¶ó´Â Ŭ·¡½º À̸§ÀÌ ÀÖÀ»¶§, %C{1} Àº "SomeClass"¸¦ Ãâ·ÂÇÑ´Ù.
{1} ´Â "¿ÏÀüÇÑ Å¬·¡½ºÀ̸§ÀÇ ¸¶Áö¸· ÇϳªÀÇ ±¸¼º¿ä¼Ò¸¦ Ãâ·ÂÇ϶ó" ´Â ¶æÀÌ´Ù. ¸¸¾à {n} ÀÌ ¾ø´Ù¸é
±âº»ÀûÀ¸·Î ¿ÏÀüÇÑ Å¬·¡½º À̸§À» Ãâ·ÂÇÑ´Ù.
- %M : ·Î±ë¿äûÀ» ÀÏÀ¸Å² ¸Þ¼Òµå¸¦ Ãâ·ÂÇÑ´Ù.
- %F : ·Î±ë¿äûÀ» ÀÏÀ¸Å² ÆÄÀÏ À̸§À» Ãâ·ÂÇÑ´Ù.
- %L : ·Î±ë¿äûÀ» ÀÏÀ¸Å² °÷ÀÇ Çà¹øÈ£¸¦ Ãâ·ÂÇÑ´Ù.
- ¼±ÅÃÀûÀ¸·Î ÆÛ¼¾Æ® ±âÈ£¿Í º¯È¯ ¹®ÀÚ »çÀÌ¿¡ Çü½Ä¼öÁ¤ÀÚ(format modifier)¸¦ »ç¿ëÇÏ¿© ÃÖ¼Ò Çʵå³ÐÀ̸¦ ¹Ù²Ù°í,
ÃÖ´ë ÇÊµå ³ÐÀÌ¿Í ÇÊµå ¾È¿¡¼ÀÇ ¹®ÀÚÀÇ Á¤·ÄÀ» ¹Ù²Ü ¼ö ÀÖ´Ù.
- ÇÊµå ¾È¿¡¼ ¿ÏÂÊ Á¤·ÄÀ» ÇϱâÀ§ÇØ ¸¶À̳ʽº ±âÈ£(-)¸¦ »ç¿ëÇÑ´Ù. ±âº»ÀûÀ¸·Î´Â ¿À¸¥ÂÊ Á¤·ÄÀÌ´Ù(¿ÞÂÊ¿¡ ¿©¹éÀ» µÒ)
- ÃÖ¼Ò ÇÊµå ³ÐÀ̸¦ ¸í½ÃÇϱâ À§ÇØ ¾çÀÇ Á¤¼ö¸¦ »ç¿ëÇÑ´Ù. ¸¸¾à µ¥ÀÌŸ Ç׸ñÀÌ ´õ ÀûÀº ¹®ÀÚ¸¦ °¡Áö°í ÀÖÀ¸¸é ÃÖ¼Ò³ÐÀÌ¿¡
µµ´ÞÇÒ ¶§±îÁö ¿À¸¥ÂÊ ¶ÈÀº ¿ÞÂÊ¿¡ °ø¹éÀÌ »ý±ä´Ù. ¸¸¾à µ¥ÀÌÅÍ Ç׸ñÀÇ ±æÀÌ°¡ ÃÖ¼Ò ÇʵåÆø º¸´Ù Å©¸é
Çʵå³ÐÀÌ°¡ µ¥ÀÌÅÍ¿¡ ¸Â°Ô È®ÀåµÈ´Ù.
- ¸¶Ä§Ç¥ µÚ¿¡ ³ª¿À´Â ¾çÀÇ Á¤¼ö´Â ÃÖ´ë ÇʵåÆøÀ» ÁöÁ¤ÇÑ´Ù. ¸¸¾à µ¥ÀÌÅÍÇ׸ñÀÌ ÃÖ´ëÇʵåÆøº¸´Ù ±æ¸é ³ª¸ÓÁö ¹®ÀÚµéÀº
µ¥ÀÌÅÍÇ׸ñÀÇ ³¡ÀÌ ¾Æ´Ï¶ó ½ÃÀÛ¿¡¼ºÎÅÍ Áö¿öÁø´Ù.¿¹¸¦ µé¾î ÃÖ´ëÇʵåÆøÀÌ 8ÀÌ°í µ¥ÀÌÅÍ Ç׸ñÀÇ ±æÀÌ°¡ 10°³¹®ÀÚ¶ó¸é,
µ¥ÀÌÅÍ Ç׸ñ óÀ½ µÎ°³ÀÇ ¹®ÀÚ´Â Áö¿öÁø´Ù. ÀÌ·± µ¿ÀÛÀº ³¡¿¡¼ºÎÅÍ À߶󳻴 C¾ð¾îÀÇ printf ÇÔ¼ö¿Í Â÷ÀÌ°¡ ³´Ù.
- ¿¹ :
- %20c : ÃÖ¼Ò 20¹®ÀÚ °ø°£¿¡¼ category À̸§À» (±âº»ÀûÀÎ)¿À¸¥ÂÊ Á¤·Ä
- %-20c : ÃÖ¼Ò 20¹®ÀÚ °ø°£¿¡¼ category À̸§À» ¿ÞÂÊ Á¤·Ä
- %.30c : ¸¸¾à category À̸§ÀÌ 30¹®ÀÚº¸´Ù ±æ¸é (¾Õ¿¡¼ºÎÅÍ)ÀÚ¸¥´Ù.
ÃÖ¼ÒÆøÀÌ ¾øÀ¸¹Ç·Î 30¹®ÀÚº¸´Ù ª´Ù°í Çصµ ¿©¹é°ø°£Àº ¾ø´Ù.
- %20.30c : category À̸§ÀÌ 20¹®ÀÚº¸´Ù ªÀ¸¸é ¿À¸¥ÂÊ Á¤·ÄÀ» ÇÏ°í, 30ÀÚº¸´Ù ±æ¸é ½ÃÀÛºÎÅÍ ÀÚ¸¥´Ù.
- %-20.30c : category À̸§ÀÌ 20ÀÚº¸´Ù ªÀ¸¸é ¿ÞÂÊ Á¤·ÄÀ» ÇÏ°í, 30ÀÚº¸´Ù ±æ¸é ½ÃÀÛ¿¡¼ºÎÅÍ ÀÚ¸¥´Ù.
- %r [%t] %-5p %c %x - %mn : ÀÌ Çü½ÄÀÌ º»·¡ TTCCLayout ÀÌ´Ù.
- %-6r [%15.15t] %-5p %30.30c %x - %mn : TTCCLayout°ú ´ÙÀ½ÀÇ Çü½ÄÀ» Á¦¿ÜÇÏ°í À¯»çÇÏ´Ù.
»ó´ë½Ã°£ÀÌ 6ÀÚ°¡ ¾ÈµÉ¶§¿¡ ¿À¸¥ÂÊ¿¡ ¿©¹éÀ» µÎ°í, ½º·¹µå¸íÀÌ 15ÀÚ°¡ ¾ÈµÉ¶§¿¡
¿À¸¥ÂÊ¿¡ ¿©¹éÀ» µÎ°í, ´õ ±æ¶§¿¡´Â ÀÚ¸£¸ç, category¸íÀÌ 30ÀÚ°¡ ¾ÈµÉ¶§´Â ¿À¸¥ÂÊ¿¡ ¿©¹éÀ» µÎ°í ´õ ±æ¶§´Â ÀÚ¸¥´Ù.
- °í±Þ : ´ÜÁö log·Î ¹®ÀÚ¿¸¸À» ³Ñ±æ ÇÊ¿ä´Â ¾ø´Ù. °´Ã¼µµ ·Î±×¸Þ¼¼Áö¿¡ ³Ñ±æ ¼ö ÀÖ´Ù.
ObjectRenderer ¸¦ implement ÇÏ¸é °´Ã¼¸¦ ¹®ÀÚ¿·Î Ç¥½ÃÇÏ¿© appender ¿¡ ·Î±ëÇÑ´Ù.
Log4j ¿¡¼ Appender¿Í Layout ¿É¼ÇÀÇ Property keys
log4j ÀÇ Àüü ¿É¼Çµé
- log4j.configuration=app_config.properties : Category.getRoot() ³ª Category.getInstance(...) ¸Þ¼Òµå¸¦ óÀ½À¸·Î È£ÃâÇÏ¿©
Log4j ÀÇ ÃʱâÈ °úÁ¤À» ¸¶Ä£´Ù.("log4j.debug=true" ·Î ÁöÁ¤ÇÏ¿© ÃʱâÈ°¡ ÀϾ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù)
ÃʱâȵǴ µ¿¾È Log4j ´Â ¾îÇø®ÄÉÀ̼ÇÀÇ Å¬·¡½ºÆнº¿¡¼ "log4j.properties" ÆÄÀÏÀ̳ª
property key¸¦ ÅëÇØ ÁöÁ¤ÇÑ ÆÄÀÏÀ» ã´Â´Ù. ±×·¯³ª ÀÌ°Í(¼³Á¤ÆÄÀÏÀ» ÁöÁ¤Çϱâ À§ÇØ ¼³Á¤ÇÑ property key)À» ½Ã½ºÅÛ property·Î
¼³Á¤ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ÇÁ·Î±×·¥À» ±¸µ¿ÇÑ´Ù.
java -Dlog4j.configuration=app_config.properties ...
¿Ö³ÄÇÏ¸é ¸¸¾à ¼³Á¤ÆÄÀÏ¿¡ ¼¼ÆÃÇß´Ù¸é ³Ê¹« ´Ê±â ¶§¹®ÀÌ´Ù.
Log4j ´Â ±âº» ¼³Á¤ÆÄÀÏÀÎ log4j.properties ÆÄÀÏÀ» Àбâ À§ÇØ ÀÌ¹Ì ½ÃÀÛÇßÀ» °ÍÀÌ´Ù.
- log4j.debug=true : ±âº»°ªÀº false. log4j ¸¦ ¼³Á¤ÇÏ´Â »ó¼¼ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.
- log4j.disable=INFO : ¸ðµç category¿¡¼ ¿©±â ÁöÁ¤ÇÑ priority º¸´Ù °°°Å³ª ³·Àº priority ¸Þ¼¼Áö´Â ·Î±ëÇÏÁö ¾Ê´Â´Ù.
log4j.disableOverride ÇÁ·ÎÆÛƼ°¡ ±âº»°ªÀÎ false À϶§¿¡¸¸ µ¿ÀÛÇÑ´Ù.
- log4j.additivity.your.category.name=false : ±âº»°ªÀº true. appender¸¦ ancestor(Á¶»ó)À¸·ÎºÎÅÍ ½×ÀÌ°Ô ÇÒÁö(true)
±×·¸°Ô ÇÏÁö ¾ÊÀ»Áö(false)¸¦ ÁöÁ¤ÇÑ´Ù.
- log4j.defaultInitOverride=false : Category.getRoot() ³ª Category.getInstance(...) ¸Þ¼Òµå¸¦ óÀ½À¸·Î È£ÃâÇÏ¿©
Log4j ÀÇ ÃʱâÈ °úÁ¤À» ¸¶Ä£´Ù.("log4j.debug=true" ·Î ÁöÁ¤ÇÏ¿© ÃʱâÈ°¡ ÀϾ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù)
ÃʱâȵǴ µ¿¾È Log4j ´Â ¾îÇø®ÄÉÀ̼ÇÀÇ Å¬·¡½ºÆнº¿¡¼ "log4j.properties" ÆÄÀÏÀ̳ª
"log4j.configuration=app_config.properties" ÇÁ·ÎÆÛƼ¸¦ ÅëÇØ ÁöÁ¤ÇÑ ÆÄÀÏÀ» ã´Â´Ù.
¸¸¾à ÀÌ°Í(ÇÁ·ÎÆÛƼ¸¦ ÅëÇØ ÁöÁ¤ÇÑ È¯°æÆÄÀÏÀ» ã´Â °Í)À» ¿øÇÏÁö ¾Ê´Â´Ù¸é ÀÌ ÇÁ·ÎÆÛƼ¸¦ true ·Î ¼¼ÆÃÇ϶ó.
±×·¯³ª ÀÌ°ÍÀ» ½Ã½ºÅÛ property·Î ¼³Á¤ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ÇÁ·Î±×·¥À» ±¸µ¿ÇÑ´Ù.
java -Dlog4j.defaultInitOverride=true ...
¿Ö³ÄÇÏ¸é ¼³Á¤ÆÄÀÏ¿¡ ¼¼ÆÃÇß´Ù¸é ÀÌ¹Ì ³Ê¹« ´Ê±â ¶§¹®ÀÌ´Ù.Log4j´Â ÀÌ¹Ì ±× ÆÄÀÏÀ» ÀбâÀ§ÇØ ½ÃÀ۵ǾúÀ» °ÍÀÌ´Ù.
- log4j.disableOverride=false: ±âº»°ªÀº false. °¡²û true·Î ¼³Á¤ÇÏ¿© log.disable ÇÁ·ÎÆÛƼ¸¦ ¹«½ÃÇÒ ¼ö ÀÖ´Ù.
ConsoleAppender ¿É¼Çµé
- Threadhold=WARN: ÀÌ appender´Â categoryÀÇ priority°¡ ´õ ³·°Ô ÁöÁ¤µÇ¾î ÀÖ´Ù°í ÇÒÁö¶óµµ ¿©±â ¸í½ÃµÈ priorityº¸´Ù
³·Àº¸Þ¼¼ÁöµéÀ» ·Î±ëÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ°ÍÀº Äֿܼ¡ ¸ðµç ¸Þ¼¼Áö°¡ ³ªÅ¸³ª´Â µ¿¾È ÆÄÀÏ¿¡ ·Î±ëµÇ´Â °æ¿ì¿Í °°ÀÌ
¸Þ¼¼ÁöÀÇ ¼ýÀÚ¸¦ ÁÙÀ̴µ¥ À¯¿ëÇÏ´Ù.
- ImmediateFlush=true: ±âº»°ªÀº true. ·Î±×¸Þ¼¼ÁöµéÀÌ ÀüÇô ¹öÆÛµÇÁö ¾Ê´Â °ÍÀ» ÀǹÌÇÏ¸ç ´ëºÎºÐÀÇ »óȲ¿¡ Àû´çÇÏ´Ù.
- Target=System.err: ±âº»°ªÀº System.out
FileAppender ¿É¼Çµé
- Threadhold=WARN: ÀÌ appender´Â categoryÀÇ priority°¡ ´õ ³·°Ô ÁöÁ¤µÇ¾î ÀÖ´Ù°í ÇÒÁö¶óµµ ¿©±â ¸í½ÃµÈ priorityº¸´Ù
³·Àº¸Þ¼¼ÁöµéÀ» ·Î±ëÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ°ÍÀº Äֿܼ¡ ¸ðµç ¸Þ¼¼Áö°¡ ³ªÅ¸³ª´Â µ¿¾È ÆÄÀÏ¿¡ ·Î±ëµÇ´Â °æ¿ì¿Í °°ÀÌ
¸Þ¼¼ÁöÀÇ ¼ýÀÚ¸¦ ÁÙÀ̴µ¥ À¯¿ëÇÏ´Ù.
- ImmediateFlush=true: ±âº»°ªÀº true. ·Î±×¸Þ¼¼ÁöµéÀÌ ÀüÇô ¹öÆÛµÇÁö ¾Ê´Â °ÍÀ» ÀǹÌÇÏ¸ç ´ëºÎºÐÀÇ »óȲ¿¡ Àû´çÇÏ´Ù.
- File=mylog.txt : ·Î±ëÇÒ ÆÄÀϸí. ¾ÕºÎºÐ¿¡ °æ·Î¸¦ ³ªÅ¸³»±â À§ÇØ ${some_property_key}
(¿¹¸¦ µé¾î java.home ¶Ç´Â user.home °ú °°Àº ½Ã½ºÅÛ ÇÁ·ÎÆÛƼ)¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. »ç½Ç ¸ðµç ¿É¼ÇµéÀÇ ÇÁ·ÎÆÛƼ۵éÀº
ÀÌ·± Á¾·ùÀÇ °ªÀ» ¼³Á¤ °¡´ÉÇÏ´Ù.
- Append=false : ±âº»°ªÀº trueÀ̸ç ÆÄÀÏ ³¡¿¡ Ãß°¡ÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù.
false ´Â °¢°¢ÀÇ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§ ÆÄÀÏ¿¡ µ¤¾î¾º¿î´Ù.
RollingFileAppender ¿É¼Çµé
- Threadhold=WARN: ÀÌ appender´Â categoryÀÇ priority°¡ ´õ ³·°Ô ÁöÁ¤µÇ¾î ÀÖ´Ù°í ÇÒÁö¶óµµ ¿©±â ¸í½ÃµÈ priorityº¸´Ù
³·Àº¸Þ¼¼ÁöµéÀ» ·Î±ëÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ°ÍÀº Äֿܼ¡ ¸ðµç ¸Þ¼¼Áö°¡ ³ªÅ¸³ª´Â µ¿¾È ÆÄÀÏ¿¡ ·Î±ëµÇ´Â °æ¿ì¿Í °°ÀÌ
¸Þ¼¼ÁöÀÇ ¼ýÀÚ¸¦ ÁÙÀ̴µ¥ À¯¿ëÇÏ´Ù.
- ImmediateFlush=true: ±âº»°ªÀº true. ·Î±×¸Þ¼¼ÁöµéÀÌ ÀüÇô ¹öÆÛµÇÁö ¾Ê´Â °ÍÀ» ÀǹÌÇÏ¸ç ´ëºÎºÐÀÇ »óȲ¿¡ Àû´çÇÏ´Ù.
- File=mylog.txt : ·Î±ëÇÒ ÆÄÀϸí. ¾ÕºÎºÐ¿¡ °æ·Î¸¦ ³ªÅ¸³»±â À§ÇØ ${some_property_key}
(¿¹¸¦ µé¾î java.home ¶Ç´Â user.home °ú °°Àº ½Ã½ºÅÛ ÇÁ·ÎÆÛƼ)¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. »ç½Ç ¸ðµç ¿É¼ÇµéÀÇ ÇÁ·ÎÆÛƼ۵éÀº
ÀÌ·± Á¾·ùÀÇ °ªÀ» ¼³Á¤ °¡´ÉÇÏ´Ù.
- Append=false : ±âº»°ªÀº trueÀ̸ç ÆÄÀÏ ³¡¿¡ Ãß°¡ÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù.
false ´Â °¢°¢ÀÇ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§ ÆÄÀÏ¿¡ µ¤¾î¾º¿î´Ù.
- MaxFileSize=100KB : ³¡¿¡ KB, MB ¶Ç´Â GB¸¦ ºÙÀδÙ. ÁöÁ¤ÇÑ Å©±â¿¡ µµ´ÞÇÏ¸é ·Î±×ÆÄÀÏÀ» ±³Ã¼ÇÑ´Ù(roll).
- MaxBackupIndex=2 : ÃÖ´ë 2°³(¿¹)ÀÇ ¹é¾÷ ÆÄÀϵéÀ» À¯Áö½ÃŲ´Ù. ¿À·¡µÈ ÆÄÀϵéÀº »èÁ¦ÇÑ´Ù. 0 Àº ¹é¾÷ÆÄÀÏÀ» ¸¸µéÁö ¾Ê´Â´Ù.
DailyRollingFileAppender ¿É¼Çµé
- Threadhold=WARN: ÀÌ appender´Â categoryÀÇ priority°¡ ´õ ³·°Ô ÁöÁ¤µÇ¾î ÀÖ´Ù°í ÇÒÁö¶óµµ ¿©±â ¸í½ÃµÈ priorityº¸´Ù
³·Àº¸Þ¼¼ÁöµéÀ» ·Î±ëÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ°ÍÀº Äֿܼ¡ ¸ðµç ¸Þ¼¼Áö°¡ ³ªÅ¸³ª´Â µ¿¾È ÆÄÀÏ¿¡ ·Î±ëµÇ´Â °æ¿ì¿Í °°ÀÌ
¸Þ¼¼ÁöÀÇ ¼ýÀÚ¸¦ ÁÙÀ̴µ¥ À¯¿ëÇÏ´Ù.
- ImmediateFlush=true: ±âº»°ªÀº true. ·Î±×¸Þ¼¼ÁöµéÀÌ ÀüÇô ¹öÆÛµÇÁö ¾Ê´Â °ÍÀ» ÀǹÌÇÏ¸ç ´ëºÎºÐÀÇ »óȲ¿¡ Àû´çÇÏ´Ù.
- File=mylog.txt : ·Î±ëÇÒ ÆÄÀϸí. ¾ÕºÎºÐ¿¡ °æ·Î¸¦ ³ªÅ¸³»±â À§ÇØ ${some_property_key}
(¿¹¸¦ µé¾î java.home ¶Ç´Â user.home °ú °°Àº ½Ã½ºÅÛ ÇÁ·ÎÆÛƼ)¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. »ç½Ç ¸ðµç ¿É¼ÇµéÀÇ ÇÁ·ÎÆÛƼ۵éÀº
ÀÌ·± Á¾·ùÀÇ °ªÀ» ¼³Á¤ °¡´ÉÇÏ´Ù.
- Append=false : ±âº»°ªÀº trueÀ̸ç ÆÄÀÏ ³¡¿¡ Ãß°¡ÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù.
false ´Â °¢°¢ÀÇ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ¶§ ÆÄÀÏ¿¡ µ¤¾î¾º¿î´Ù.
- DatePattern='.'yyyy-ww : ¸ÅÁÖ¸¶´Ù ÆÄÀÏÀ» ±³Ã¼(roll)ÇÑ´Ù. ±³Ã¼Áֱ⸦ ¿ù, ÁÖ, ÀÏ, ÇÏ·ç 2ȸ, ½Ã°£, ºÐ º°·Î Á¤ÇÒ¼ö ÀÖ´Ù.
ÀÌ °ªÀº ±³Ã¼Áֱ⸦ ¼³Á¤ÇÒ »Ó¸¸ ¾Æ´Ï¶ó ¹é¾÷ÆÄÀÏÀÇ ºÙ´Â ¹®ÀÚ¿µµ Á¤ÇÑ´Ù. ÄÝ·Ð(:) ¹®ÀÚ¸¦ °ªÀÇ ¾îµð¿¡µµ »ç¿ëÇÏÁö ¸»¶ó.
±×°Í ¸»°í´Â ÀÚ¹ÙÀÇ SimpleDateFormat ÀÇ ¾î¶² Çü½Ä ¹®ÀÚ¿À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ƯÈ÷ ÇѽÖÀÇ ÀÛÀºµû¿ÈÇ¥(single quote) ¾È¿¡ ÀÖ´Â ¹®ÀÚ¸¦ ¹Ýµå½Ã Á¦¾îÇØÁÖ¾î¾ß ÇÑ´Ù.(¿¹ÀÇ '.' ¿Í °°ÀÌ)
- '.'yyyy-MM: ¸Å´ÞÀÇ Ã¹³¯¿¡ ·Î±×ÆÄÀÏÀ» ±³Ã¼ÇÑ´Ù.
- '.'yyyy-ww: ¸ÅÁÖÀÇ Ã¹³¯¿¡ ·Î±×ÆÄÀÏÀ» ±³Ã¼ÇÑ´Ù.
- '.'yyyy-MM-dd: ¸ÅÀÏ ÀÚÁ¤¿¡ ·Î±×ÆÄÀÏÀ» ±³Ã¼ÇÑ´Ù.
- '.'yyyy-MM-dd-a: ¸ÅÀÏ ÀÚÁ¤°ú Á¤¿À¿¡ ·Î±×ÆÄÀÏÀ» ±³Ã¼ÇÑ´Ù.
- '.'yyyy-MM-dd-HH: ½Ã°£¸¶´Ù(½Ã°£ÀÌ ½ÃÀÛÇÒ¶§) ·Î±×ÆÄÀÏÀ» ±³Ã¼ÇÑ´Ù.
- '.'yyyy-MM-dd-HH-mm: ºÐ¸¶´Ù(ºÐÀÌ ½ÃÀÛÇÒ¶§) ·Î±×ÆÄÀÏÀ» ±³Ã¼ÇÑ´Ù.
PatternLayout ¿É¼Çµé
- ConversionPattern=%m%n : °¢°¢ÀÇ ·Î±×¸Þ¼¼ÁöÀÇ Çü½ÄÀ» ³ªÅ¸³»´Â ¹æ¹ý(Æ÷ÇÔÇÏ´Â Á¤º¸)
HTMLLayout ¿É¼Çµé
- LocatoinInfo=true: ±âº»°ªÀº false. ÀÚ¹ÙÆÄÀϸí°ú Çà¹øÈ£¸¦ Ãâ·ÂÇÑ´Ù.
- Title=My app title : ±âº»°ªÀº Log4j Log Message. HTMLÀÇ <title>ű׿¡ ÁÖ¾îÁø´Ù
XMLLayout ¿É¼Çµé
- LocatoinInfo=true: ±âº»°ªÀº false. ÀÚ¹ÙÆÄÀϸí°ú Çà¹øÈ£¸¦ Ãâ·ÂÇÑ´Ù.
TTCCLayout ¿É¼Çµé(ÀÌ°Í ´ë½Å ´õ À¯¿¬ÇÑ PatternLayoutÀ» »ç¿ëÇ϶ó)
- DateFormat=ISO8601: ÀÚ¹ÙÀÇ SimpleDateFormat ÀÇ »ý¼ºÀÚÀ̰ųª NULL, RELATIVE, ABSOLUTE, DATE, ISO8601 Áß Çϳª.
- TimeZoneID=GMT-8:00: TimeZone.getTimeZone(java.lang.String) ¸Þ¼Òµå¿¡ ÀÇÇØ ³ª¿Ã¸¸ÇÑ Çü½ÄÀÇ ¹®ÀÚ¿
- CategoryPrefixing=false: ±âº»°ªÀº true. category À̸§À» Ãâ·ÂÇÑ´Ù.
- ContextPrinting=false: ±âº»°ªÀº true. ÇöÀç ½º·¹µå¿¡ ¼ÓÇÏ´Â ³»Æ÷°Ë»çÇ׸ñ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.
- ThreadPrinting=false: ±âº»°ªÀº true. ½º·¹µå¸íÀ» Ãâ·ÂÇÑ´Ù.
Á¾ÇÕÀûÀÎ Log4j ¼³Á¤ ÇÁ·ÎÆÛƼ ÆÄÀÏ
#log4j.debug=true
#log4j.disable=fatal
#log4j.additivity.TestLogging=false
log4j.rootCategory=, dest1
log4j.category.TestLogging=DEBUG, dest1
log4j.appender.dest1=org.apache.log4j.ConsoleAppender
#log4j.appender.dest1.layout=org.apache.log4j.SimpleLayout
log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
#log4j.appender.dest1.layout.ConversionPattern=%-5p %l %x: %m%n
!----------------------####### END OF PROPERTIES #######----------------------!
###############################################################################
# ¹ØÀ¸·Î log4j ¼³Á¤ÆÄÀÏÀ» ¾î¶»°Ô ½á¾ßÇÏ´ÂÁö ´õ ÀÚ¼¼È÷ ±â·ÏÇسõ¾Ò´Ù. #
# #À¸·Î ½ÃÀÛÇÏ´Â ÇàÀ» ¼±ÅÃÀûÀ¸·Î º¹»çÇؼ ÁÖ¼®À» Á¦°ÅÇÏ°í ºÙ¿©¶ó. #
###############################################################################
!-----------------------------------------------------------------------------!
! ÀÌ ÆÄÀÏÀ» Ŭ·¡½ºÆнº°¡ ÁöÁ¤µÈ ¾î´À°÷À̵ç À§Ä¡½ÃÄѶó. !
! Appender µéÀº ±âº»ÀûÀ¸·Î Ãß°¡µÈ´Ù. !
! ÇÁ·ÎÆÛƼµéÀº category°¡ ¿À¹ö¶óÀÌµå µÉ¶§±îÁö »ó¼ÓµÈ´Ù. !
! ${property_key} ¿¡¼ Å°ÀÇ °ªÀº ½Ã½ºÅÛ ÇÁ·ÎÆÛƼ³ª ÆÄÀÏ ÀÚü¿¡¼ Á¤ÀÇµÉ ¼ö !
! ÀÖ´Ù. ½Ã½ºÅÛ ÇÁ·ÎÆÛƼµéÀº ÀÌ ÆÄÀϺ¸´Ù ¸ÕÀú °Ë»öµÈ´Ù. !
!-----------------------------------------------------------------------------!
!-----------------------------------------------------------------------------!
! log4jÀÇ »óÀ§ ¼öÁØ¿¡¼ÀÇ µ¿ÀÛÀ» ¼³Á¤ÇÑ´Ù. !
!-----------------------------------------------------------------------------!
! log4j°¡ ÀÌÆÄÀÏÀ» ÆĽÌÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù.
#log4j.debug=true
! ÀÌ°ÍÀ» false·Î ÁöÁ¤ÇÏ¸é ½ÇÁ¦ÀûÀ¸·Î log4j.disable ÇÁ·ÎÆÛƼ¸¦ µû¸£°ÔµÈ´Ù.
#log4j.disableOverride=false
! ÁÖ¾îÁø priority º¸´Ù °°°Å³ª ³·Àº priority ¸¦ °¡Áø ¸Þ¼¼ÁöÀÇ ·Î±ëÀ»
! ¸ðµç category¿¡¼ ºÒ°¡´É ÇÏ°Ô ÇÑ´Ù.
#log4j.disable=INFO
!-----------------------------------------------------------------------------!
! category(logger) ¼³Á¤ !
!-----------------------------------------------------------------------------!
! ROOT CATEGORY (º¸Åë À̰͸¸ ¼¼ÆÃÇÏ´Â °ÍÀ¸·Î ÃæºÐÇÏ´Ù)
! ¿©±â¼´Â priority°¡ DEBUG(±âº»°ª) ÀÌ»óµÇ´Â ¸Þ¼¼Áö¸¦ ·Î±ëÇÑ´Ù.
#log4j.rootCategory=, dest1
! ¶Ç´Â,
#log4j.rootCategory=debug, dest1, dest2
! ´ç½ÅÀÌ ¼³Á¤ÇÏ´Â CATEGORYµé
! (Ŭ·¡½º/ÆÐÅ°Áö/ÇÁ·ÎÁ§Æ®/±âŸ º°·Î ·Î±ëÀ» »ç¿ëÀÚ¼³Á¤ÇÑ´Ù)
! Á¶»óÀÇ priority¸¦ ¿À¹ö¶óÀ̵å ÇÏ°í, ÀÌ Ä«Å×°í¸®¿¡¼ WARN ¶Ç´Â ±×º¸´Ù ³ô°Ô¼³Á¤
#log4j.category.TestLogging=WARN, dest3
! ¶Ç´Â,
#log4j.category.TestLogging=DEBUG, dest3
!--------´ÙÀ½À» ÇÏÁö¸¶¶ó!! APPENDERµéÀº ±âº»ÀûÀ¸·Î Ãß°¡µÈ´Ù!!!----------------!
! °°Àº ·Î±× ¸Þ¼¼ÁöµéÀ» dest1¿¡ µÎ¹ø ÀÌ»ó ¾µ°ÍÀÌ´Ù. ÇѹøÀº root, !
! ±×¸®°í´Â ÀÌ category ·Î !
!#log4j.category.TestLogging=DEBUG, dest1, dest3 !
! ¸¸¾à ÀÌ category¿¡¼ Ãß°¡(additive)µÇ±â¸¦ ¿øÇÏÁö ¾ÊÀ¸·Á¸é ´ÙÀ½°ú °°ÀÌ Ç϶ó !
!#log4j.additivity.TestLogging=false !
!-----------------------------------------------------------------------------!
!-----------------------------------------------------------------------------!
! appender(log destinations/targets) ¿Í ¿É¼ÇµéÀ» ¼³Á¤ !
!-----------------------------------------------------------------------------!
! CONSOLE¿¡ ¾²±â (stdout ¶Ç´Â stderr)
#log4j.appender.dest1=org.apache.log4j.ConsoleAppender
#log4j.appender.dest1.ImmediateFlush=true
! FILE¿¡ ·Î±× ¾²±â, ÁöÁ¤ÇÑ Å©±â¸¦ ³Ñ¾î¼¸é ÆÄÀÏÀ» ±³Ã¼
#log4j.appender.dest2=org.apache.log4j.RollingFileAppender
! ÀÌ appender ´Â ¿©±â ¸í½ÃµÈ priority ¿Í °°°Å³ª ³ôÀº ¸Þ¼¼Áö¸¸ ·Î±ëÇÑ´Ù.
#log4j.appender.dest2.Threshold=ERROR
! ÆÄÀϸíÀ» ¸í½ÃÇÑ´Ù (${property_key} ´Â ´ë½Å »ç¿ë°¡´ÉÇÑ °ªÀ» ¾ò¾î¿Â´Ù)
#log4j.appender.dest2.File=${java.home}/log4j.log
! Ãß°¡ÇÏÁö ¾Ê°í, µ¤¾î¾º¿î´Ù.
#log4j.appender.dest2.Append=false
! ÃÖ´ë ÆÄÀÏÅ©±â¸¦ Á¶Àý
#log4j.appender.dest2.MaxFileSize=100KB
! ¹é¾÷ÆÄÀÏ °¹¼ö ÁöÁ¤ (¹é¾÷ ÆÄÀÏÀº ÆÄÀÏÀ̸§.1, .2 µîÀ¸·Î »ý¼ºµÈ´Ù)
#log4j.appender.dest2.MaxBackupIndex=2
! ÆÄÀÏ¿¡ ·Î±×¸¦ ¾²°í, ¸ÅÁÖ ±³Ã¼µÈ´Ù.
#log4j.appender.dest3=org.apache.log4j.DailyRollingFileAppender
! ÆÄÀϸíÀ» ¸í½Ã.
#log4j.appender.dest3.File=log4TestLogging2.html
! ÃÖ´ë ÆÄÀÏÅ©±â¸¦ Á¶Àý
#log4j.appender.dest3.MaxFileSize=300KB
! °¢ ÁÖ¸¦ ½ÃÀÛÇÏ¸ç ·Î±×ÆÄÀÏÀ» ±³Ã¼
#log4j.appender.dest3.DatePattern='.'yyyy-ww
!-----------------------------------------------------------------------------!
! appenderÀÇ layout(log Çü½Ä, ±¸¼º) °ú ¿É¼ÇµéÀ» ¼³Á¤ !
!-----------------------------------------------------------------------------!
! °£´ÜÇÑ ·Î±× Çü½ÄÀ» »ç¿ë (¿¹ INFO - your log message)
#log4j.appender.dest1.layout=org.apache.log4j.SimpleLayout
! ·Î±× ¸Þ¼¼Áö ±¸¼ºÀ» CÀÇ printf ½ºÅ¸ÀÏÀÇ Çü½ÄÀ» »ç¿ë
#log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
! pattern layout ¿¡¼ ÆÐÅÏÀ» ÁöÁ¤ (±âº»°ªÀº %m%n ÀÌ¸ç °¡Àå ºü¸£´Ù)
#log4j.appender.dest1.layout.ConversionPattern=%-5p: %m%n
! ¶Ç´Â,
#log4j.appender.dest1.layout.ConversionPattern=%-5p %6.10r[%t]%x(%F:%L) - %m%n
#log4j.appender.dest2.layout=org.apache.log4j.PatternLayout
#log4j.appender.dest2.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x(%F:%L) - %m%n
! ¶Ç´Â, (¾Æ·¡ÀÇ Çü½ÄÀº ¾îÇø®ÄÉÀ̼ÇÀ» ´À¸®°Ô ÇÒ °ÍÀÌ´Ù)
#log4j.appender.dest2.layout.ConversionPattern=[%d{yyyy-mm-dd hh:mm},%6.6r]%-5p[%t]%x(%F:%L) - %m%n
! HTML Å×À̺í ÇüÅ·Π·Î±×¸Þ¼¼Áö¸¦ ±¸¼º
#log4j.appender.dest3.layout=org.apache.log4j.HTMLLayout
! ÀÚ¹Ù file¸í°ú Çà¹øÈ£¸¦ Ãâ·Â (±âº»°ªÀº false)
#log4j.appender.dest3.layout.LocationInfo=true
! <title>ÅÂ±× ¼³Á¤ (±âº»°ª: Log4J Log Messages)
#log4j.appender.dest3.layout.Title=My App Log
!-----------------------------------------------------------------------------!
! PATTERN Çü½Ä ¿ë¾îµé !
!-----------------------------------------------------------------------------!
! %n - °³Çà !
! %m - ·Î±× ¸Þ¼¼Áö !
! %p - ¸Þ¼¼Áö priority (FATAL, ERROR, WARN, INFO, DEBUG ¶Ç´Â »ç¿ëÀÚÁ¤ÀÇ) !
! %r - ÇÁ·Î±×·¥ ±¸µ¿ÀÌ ½ÃÀÛÇÑ ÀÌÈÄ °æ°ú½Ã°£ÀÇ ¹Ð¸®¼¼ÄÁµå°ª !
! %% - ÆÛ¼¾Æ® ±âÈ£ Ãâ·Â !
! !
!----------------------- ·Î±×¿¡¼ÀÇ ¸î°¡Áö Ãß°¡¿ä¼Òµé--------------------------!
! %c - category(logger)À̸§, %c{2}´Â ¸¶Áö¸· µÎ°³ÀÇ ¿ä¼Ò¸¦ Ãâ·ÂÇÑ´Ù. !
! %t - ÇöÀç ½º·¹µå À̸§ !
! %x - ³»Æ÷°Ë»çÇ׸ñ (NDC) !
! !
!------------------------- ¼º´É ÀúÇϽÃÅ°´Â Çü½Äµé ----------------------------!
! %d - ³¯ÀÚ¿Í ½Ã°£, ¶ÇÇÑ %d{ISO8601}, %d{DATE}, %d{ABSOLUTE}, !
! %d{HH:mm:ss,SSS}, %d{dd MMM yyyy HH:mm:ss,SSS} µî !
! %l - %F%L%C%M ÀÇ Ãà¾àÇü !
! %F - ÀÚ¹Ù ¼Ò½º ÆÄÀϸí !
! %L - ÀÚ¹Ù ¼Ò½ºÀÇ Çà¹øÈ£ !
! %C - Àڹ٠Ŭ·¡½º À̸§, %C{1} ¸¶Áö¸· ÇϳªÀÇ ¿ä¼Ò¸¦ Ãâ·Â !
! %M - ÀÚ¹Ù ¸Þ¼Òµå À̸§ !
! !
!------------------------------ Çü½Ä º¯°æÀÚ -------------------------------!
! %-¾î¶²Çü½Ä¹®ÀÚ - ÃÖ¼ÒÆø ÀÌÇÏ¿¡¼ ¿ÞÂÊÁ¤·Ä (±âº»°ªÀº ¿À¸¥ÂÊ Á¤·Ä) !
! %20¾î¶²Çü½Ä¹®ÀÚ - 20 ±ÛÀÚ ÃÖ¼ÒÆø (°¡´ÉÇÒ ¶§¿¡´Â ¿ÞÂÊ¿¡ ¿©¹éÀÌ °¡´É) !
! %.30¾î¶²Çü½Ä¹®ÀÚ - ÃÖ´ë 30±ÛÀÚ (ÇÊ¿äÇÏ¸é ¾Õ¿¡¼ºÎÅÍ À߸°´Ù) !
! %-10.10r - ¿¹. °æ°ú½Ã°£ÀÌ 10°³¹®ÀÚ ÀÌÇÏÀÇ ³ÐÀÌÀÌ¸é ¿ÞÂÊÁ¤·Ä !
! 10°³¹®ÀÚ ÀÌ»óÀÇ ±æÀÌÀÌ¸é ¾Õ¿¡¼ ºÎÅÍ À߸°´Ù. !
!-----------------------------------------------------------------------------!
!-----------------------------------------------------------------------------!
! OPTIONS GLOSSARY !
!-----------------------------------------------------------------------------!
!-------------------------OVERALL OPTIONS FOR log4j---------------------------!
! Ä¿¸Çµå ¶óÀÎ optionÀ¸·Î ¸í½Ã: -Dlog4j.defaultInitOverride=false
! Ä¿¸Çµå ¶óÀÎ optionÀ¸·Î ¸í½Ã: -Dlog4j.configuration=app_config.properties
!#log4j.debug=true
!#log4j.disable=INFO
!#log4j.disableOverride=false
!#log4j.additivity.your.category.name=false
!
!----------------------------NullAppender OPTIONS-----------------------------!
!#log4j.appender.dest1.Threshold=INFO
!
!---------------------------ConsoleAppender OPTIONS---------------------------!
!#log4j.appender.dest1.Threshold=INFO
!#log4j.appender.dest1.ImmediateFlush=true
!#log4j.appender.dest1.Target=System.err
!
!-----------------------------FileAppender OPTIONS----------------------------!
!#log4j.appender.dest2.Threshold=INFO
!#log4j.appender.dest2.ImmediateFlush=true
!#log4j.appender.dest2.File=mylog.txt
!#log4j.appender.dest2.Append=false
!
!-------------------------RollingFileAppender OPTIONS-------------------------!
!#log4j.appender.dest2.Threshold=INFO
!#log4j.appender.dest2.ImmediateFlush=true
!#log4j.appender.dest2.File=mylog.txt
!#log4j.appender.dest2.Append=false
!#log4j.appender.dest2.MaxFileSize=100KB
!#log4j.appender.dest2.MaxBackupIndex=2
!
!-----------------------DailyRollingFileAppender OPTIONS----------------------!
!#log4j.appender.dest2.Threshold=INFO
!#log4j.appender.dest2.ImmediateFlush=true
!#log4j.appender.dest2.File=mylog.txt
!#log4j.appender.dest2.Append=false
!#log4j.appender.dest2.DatePattern='.'yyyy-ww
!
!-----------------------------SimpleLayout OPTIONS----------------------------!
!**None**
!
!-------------TTCCLayout OPTIONS (PatternLayout is more flexible)-------------!
!#log4j.appender.dest1.layout.DateFormat=ISO8601
!#log4j.appender.dest1.layout.TimeZoneID=GMT-8:00
!#log4j.appender.dest1.layout.CategoryPrefixing=false
!#log4j.appender.dest1.layout.ThreadPrinting=false
!#log4j.appender.dest1.layout.ContextPrinting=false
!
!-----------------------------PatternLayout OPTIONS---------------------------!
!#log4j.appender.dest1.layout.ConversionPattern=%m%n
!
!-------------------------------HTMLLayout OPTIONS----------------------------!
!#log4j.appender.dest3.layout.LocationInfo=true
!#log4j.appender.dest3.layout.Title=My app title
!
!--------------------------------XMLLayout OPTIONS----------------------------!
!#log4j.appender.dest3.layout.LocationInfo=true
!-----------------------------------------------------------------------------!
- ÄÚµå»ó¿¡¼ ¼º´ÉÀÌ ¸Å¿ì Áß¿äÇÑ °÷¿¡¼´Â ·Î±ë¸Þ¼ÒµåÀÇ ÆĶó¹ÌÅ͸¦ ¸¸µå´Â ½Ã°£À» Àý¾àÇϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù.
if (cat.isDebugEnabled() {
cat.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
- SimpleLayoutÀ» »ç¿ëÇÏ¿´°Å³ª %p, %m, %nÀÇ ÆÐÅϸ¸ »ç¿ëÇÏ¿© ¼³Á¤ÇÑ °æ¿ì System.out.println(...) ¸¸Å ¼º´ÉÀÌ
ºü¸£´Ù°í Å×½ºÆ®µÆ´Ù.
- ³»Æ÷°Ë»çÇ׸ñ(NDC)¸¦ »ç¿ëÇÑ´Ù : °¡²û ¼ºí¸´Ã³·³ ÇϳªÀÇ Äڵ尡 °¢°¢ÀÇ Å¬¶óÀ̾ðÆ®¸¦ ¼ºñ½º ÇϱâÀ§ÇØ
¿©·¯°³ÀÇ ½º·¹µå·Î ÀνºÅϽºÈ µÇ¾î ¸¹Àº Ŭ¶óÀ̾ðÆ®¸¦ ¼ºñ½ºÇÑ´Ù.
À̶§ ´Ù¸¥ Ŭ¶óÀ̾ðÆ®·Î ºÎÅÍÀÇ ·Î±ë ¿äûÀ» Â÷º°ÈÇϱâ À§Çؼ ³»Æ÷°Ë»çÇ׸ñ(NDC)¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÇÒ ¼ö ÀÖ´Â °ÍÀº ·Î±ëÇϱâ Àü¿¡ Ŭ¶óÀ̾ðÆ®ÀÇ °íÀ¯ÇÑ Á¤º¸¸¦ NDC·Î ³Ö´Â´Ù. °íÀ¯ÇÑ Á¤º¸´Â Ŭ¶óÀ̾ðÆ®ÀÇ IPÁÖ¼Ò,
È£½ºÆ®À̸§ ¶Ç´Â ¿äû°ú °ü·ÃµÈ ¾î¶² °Íµµ µÉ ¼ö ÀÖ´Ù. %x¸¦ layout ÆÐÅÏ¿¡ ¸í½ÃÇÏ¸é ¿äûÇÑ ·Î±× ¸Þ¼¼Áö¿¡
±× ¹®ÀÚ¿(°íÀ¯ÇÑ Á¤º¸)À» Âï´Â´Ù.
import org.apache.log4j.*;
public class TestNDC {
// !log4j.properties ÆÄÀÏÀÌ Å¬·¡½ºÆнº »ó¿¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇ϶ó.
static Category cat = Category.getInstance(TestNDC.class.getName());
public static void main(String[] args) {
// ³»Æ÷°Ë»ç ¼³Á¤Àº ¼ºí¸´°ú °°ÀÌ ¸ÖƼ½º·¹µå·Î ÀÌ·ç¾îÁø Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûµéÀ» ±¸º°ÇÑ´Ù.
NDC.push("Client #45890");
cat.info("Testing Nested Diagnostic Context (NDC).");
cat.info("Make sure %x is in layout pattern!");
cat.info("Client #45890 should appear in this log message.");
switchNDC();
cat.info("Finished.");
}
static void switchNDC() {
NDC.push("Client #99999");
cat.debug("Client #99999 should appear nested in this log message.");
NDC.pop();
}
}