ãšã³ããªãŒ
ãã¬ãŒãšã¯äœãããªãå¿ èŠãªã®ãã¯èª°ã«ãç§å¯ã§ã¯ãªããšæããŸãã javaã®ååšäžã«ãå€ãã®ãã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ãäœæãããŸããã æãæåãªãã®ã®äžã«ã¯ïŒ
- JUL-java.util.logging
- log4j
- JCL-ãžã£ã«ã«ã¿ã³ã¢ã³ãºãã®ã³ã°
- ãã°ããã¯
- SLF4J-Javaçšã®ã·ã³ãã«ãªãã®ã³ã°ãã¡ãµãŒã
ãã®èšäºã§ã¯ãäžèšã®åãã¬ãŒã ã¯ãŒã¯ãHello Worldã¬ãã«ã§æ€èšŒããŸãã åºæ¬çãªæ©èœãšæ§æã䜿çšããç°¡åãªäŸã瀺ããŸãã ãã®èšäºã¯ããã¬ãŒãçžäºã«æ¯èŒãããããã®æè¯ã®ãã®ãç¹å®ãããšããç®æšãè¿œæ±ããŠããŸãããèè ã¯èªè ã«ãã®æ©äŒãæ®ããŠããŸãã èšäºã®æåŸã«ãåãã¬ãŒã ã¯ãŒã¯ã®è©³çŽ°æ å ±ãå ¥æã§ãããœãŒã¹ãæäŸãããŸãã ãŸãããã®èšäºãèªãåã«ãJavaã§ã®ãã®ã³ã°ã·ã¹ãã ã®éçºã®æŽå²ã説æããåºçç©ãJava LoggingïŒA History of a Nightmareãã«ç²Ÿéããããšããå§ãããŸãã
System.err.println
ãã®ã³ã°ã®æåã§æãåºæ¬çãªæ¹æ³ã¯ãSystem.err.printlnã¡ãœããã§ããã ã³ã¡ã³ãã¯äžèŠã ãšæããŸãã以äžã®ã³ãŒããã芧ãã ããã
// System.setErr(new PrintStream(new File("log.txt"))); // System.err.println(" 1"); System.err.println(" 2"); // try { throw new Exception(" "); } catch (Exception e) { e.printStackTrace(); }
Java.util.logging
ãã®ãã¬ãŒã ã¯ãŒã¯ã¯æšæºã«å«ãŸããŠãããJDKã«ä»å±ããŠãããããä»ã®ãã®ãããŠã³ããŒããããæ¥ç¶ãããããå¿ èŠã¯ãããŸããã JULã«ã¯ãæé ã§æ¬¡ã®ãã®ã³ã°ã¬ãã«ããããŸãïŒFINESTãFINERãFINEãCONFIGãINFOãWARNINGãSEVEREãããã³ALLãšOFFããã¹ãŠã®ã¬ãã«ããããããªã³ãšãªãã«ããŸãã
ãã¬ãŒã¯ãjava.util.logging.Loggerã¯ã©ã¹ã®éçã¡ãœããã®1ã€ãåŒã³åºãããšã«ãã£ãŠäœæãããŸãã
Logger log = Logger.getLogger(LoggingJul.class.getName());
ãã¬ãŒã¡ãœããã¯ãæååã¡ãã»ãŒãžãã¡ãã»ãŒãžãã³ãã¬ãŒããäŸå€ãããŒã«ã©ã€ãºãããã¡ãã»ãŒãžããã¹ããªãœãŒã¹ãããã³Java 8以éã®æååã¡ãã»ãŒãžãããã€ããŒãåŒæ°ãšããŠäœ¿çšã§ããŸãã
// String stringMessage = ""; // String stringMessageFormat =" {0}"; // Throwable throwable = new Throwable(); // ResourceBundle ResourceBundle resourceBundle = ResourceBundle.getBundle("logging.jul.bundle"); // Supplier<String> stringMessageSupplier = ()->"";
ã¡ãœããã®2ã€ã®ã°ã«ãŒãã¯åºå¥ãããŸãããã®ååã¯ãã°ã¬ãã«ã«å¯Ÿå¿ãããã°ãloggpãlogrbã¡ãœããã¯ãã°ã¬ãã«ãã¿ã€ãLevelã®ãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããŸãã æåã®ã°ã«ãŒãã«ã¯ãæååã¡ãã»ãŒãžã®åä¿¡ãŸãã¯æååã¡ãã»ãŒãžãããã€ããŒã®2çš®é¡ã®ã¡ãœãããå«ãŸããŠããŸãã
log.info(stringMessage); log.info(stringMessageSupplier);
ã¡ãœããã®2çªç®ã®ã°ã«ãŒãã«ã¯ã次ã®ããªãšãŒã·ã§ã³ããããŸãã
// log.log(new LogRecord(Level.INFO, stringMessage)); log.log(Level.INFO, stringMessage); log.log(Level.INFO, stringMessageSupplier); log.log(Level.INFO, stringMessageFormat, args); log.log(Level.INFO, stringMessage, throwable ); log.log(Level.INFO, throwable, stringMessageSupplier); // , log.logp(Level.INFO, "ClassName", "MethodName", stringMessage); log.logp(Level.INFO, "ClassName", "MethodName", stringMessageSupplier); log.logp(Level.INFO, "ClassName", "MethodName", stringMessageFormat, args); log.logp(Level.INFO, "ClassName", "MethodName", stringMessage, throwable); log.logp(Level.INFO, "ClassName", "MethodName", throwable, stringMessageSupplier); // , , // resourceBundle, log.logrb(Level.INFO, "ClassName", "MethodName", resourceBundle, "messageId"); log.logrb(Level.INFO, "ClassName", "MethodName", resourceBundle, "messageId", throwable); // log.throwing("ClassName","MethodName", throwable);
ããã§ããã¬ãŒã ã¯ãŒã¯ã®æ§æãèŠãŠã¿ãŸãããã ããã©ã«ãã§ã¯ãJULã¯ã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžãåºåããŸãããããããã£ãã¡ã€ã«ã§èšå®ãæå®ã§ããŸãã ã¡ãã»ãŒãžã衚瀺ããæ¹æ³ãèšå®ããã«ã¯ããã¬ãŒã䜿çšãããã³ãã©ãŒãæå®ããå¿ èŠããããŸãã 次ã®ãã³ãã©ã¯ã©ã¹ãååšããŸãïŒFileHandlerãConsoleHandlerãStreamHandlerãSocketHandlerãMemoryHandlerã JULã®æ©èœã¯ãç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠã§ã¯ãªããã¯ã©ã¹å šäœã«å¯ŸããŠãã³ãã©ãŒèšå®ãå šäœãšããŠèšå®ãããããšã§ããããã«ãããããšãã°ãç°ãªããã¬ãŒããã®ã¡ãã»ãŒãžãç°ãªããã¡ã€ã«ã«åºåããããç°ãªããã©ãŒãããã§åºåãããããå¿ èŠãããå Žåãããªãã®åé¡ãçºçããå¯èœæ§ããããŸãã æ§æãã¡ã€ã«ã®ç°¡åãªäŸãèããŠã¿ãŸãããã
# handlers =java.util.logging. FileHandler .level=ALL # java.util.logging.FileHandler.level =ALL java.util.logging.FileHandler.formatter =java.util.logging.SimpleFormatter java.util.logging.FileHandler.limit = 1000000 java.util.logging.FileHandler.pattern = log.txt # java.util.logging.ConsoleHandler.level = ALL java.util.logging.ConsoleHandler.pattern = log.log java.util.logging.ConsoleHandler.formatter =java.util.logging.SimpleFormatter
JULããã®æ§æãé©çšããã«ã¯ã-Djava.util.logging.config.file = <path to file>ãã©ã¡ãŒã¿ãŒãæž¡ãããã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ã³ãŒããå®è¡ããå¿ èŠããããŸãã
LogManager.getLogManager().readConfiguration(< >.class.getResourceAsStream("logging.properties"));
Log4j
çŸåšããã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯2çªç®ã®ããŒãžã§ã³ããããŸãããæ®å¿µãªããæåã®ããŒãžã§ã³ãšã¯äºææ§ããããŸããã log4jã®æåã®ããŒãžã§ã³ã¯é·ãéååšããŠããããã®äººæ°ã®é«ããããã€ã³ã¿ãŒãããã«ã¯å€ãã®èšäºããããŸãããä»æ¥ã¯2çªç®ã®ããŒãžã§ã³ãæ€èšããŸãã log4j2ã䜿çšããã«ã¯ã log4j-api-2.xããã³log4j-core-2.xã©ã€ãã©ãªãæ¥ç¶ããå¿ èŠããããŸãã Log4jã«ã¯ãJULãšã¯è¥å¹²ç°ãªããã®ã³ã°ã¬ãã«ã®åœåæ³ããããŸããTRACEãDEBUGãINFOãWARNãERRORãFATALãããã³ALLãšOFFã§ããããããã¹ãŠã®ã¬ãã«ããªã³ãŸãã¯ãªãã«ããŸãã
ãã¬ãŒã¯ãorg.apache.logging.log4j.Loggerã¯ã©ã¹ã®éçã¡ãœãããåŒã³åºãããšã§äœæãããŸãã
Logger log = LogManager.getLogger(LoggingLog4j.class); // Logger log = LogManager.getLogger(ânameâ);
éåžžã®StringãObjectãThrowableã«å ããŠããã¬ãŒã¯MapMessageãšMarkerã®2ã€ã®æ°ããã¿ã€ããåãå ¥ããããšãã§ããŸãã
// ( msg1=" 1â msg2=" 2â) MapMessage mapMessage = new MapMessage(); mapMessage.put("msg1", " 1"); mapMessage.put("msg2", " 2"); // , Marker marker = MarkerManager.getMarker("fileonly"); // String stringMessage = ""; // String stringMessageFormat = " {}, {}"; // Throwable throwable = new Throwable(); // Object object = new Object();
ãã¬ãŒã®ã¯ã©ã·ãã¯ã¹ã¿ã€ã«ã§ã¯ãã¡ãœããã¯2ã€ã®ã¿ã€ãã«åé¡ãããŸããååã«äžèŽãããã°ã¬ãã«ãšããã°ã¬ãã«ããã©ã¡ãŒã¿ãŒãšããŠäœ¿çšãããã°ã¡ãœããã§ãã æåã®ãã®ã¯ïŒ
log.info(mapMessage); log.info(object); log.info(stringMessage); log.info(marker, mapMessage); log.info(marker, object); log.info(marker, stringMessage); log.info(object, throwable); log.info(stringMessage, throwable); log.info(stringMessageFormat, args); log.info(marker, mapMessage, throwable); log.info(marker, object, throwable); log.info(marker, stringMessageFormat, args); log.info(marker, stringMessage, throwable); log.throwing(throwable);
log4j2ã®ãã°ã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
log.log(Level.INFO, mapMessage); log.log(Level.INFO, object); log.log(Level.INFO, stringMessage); log.log(Level.INFO, marker, mapMessage); log.log(Level.INFO, marker, object); log.log(Level.INFO, marker, stringMessage); log.log(Level.INFO, object, throwable); log.log(Level.INFO, stringMessageFormat, args); log.log(Level.INFO, stringMessage, throwable); log.log(Level.INFO, marker, mapMessage, throwable); log.log(Level.INFO, marker, object, throwable); log.log(Level.INFO, marker, stringMessageFormat, args); log.log(Level.INFO, marker, stringMessage, throwable); log.throwing(Level.INFO, throwable);
èšå®ã決å®ããªããšãlog4j2ã®èµ·åæã«ãèšå®ãèšå®ãããŠããªãããšã瀺ãæã£ãã¡ãã»ãŒãžã衚瀺ãããERROR以äžã®ã¬ãã«ã§ã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«åºåãããŸãã log4j2ã®èšå®ã¯ãxmlãjsonãyamlãªã©ã®ããã€ãã®ãªãã·ã§ã³ã«ãã£ãŠèšå®ãããŸãã 2çªç®ã®ããŒãžã§ã³ä»¥éãããããã£ãã¡ã€ã«ããã®æ§æãµããŒãããªãããšã«æ³šæããŠãã ããã æ§æãã¡ã€ã«ã¯ã¯ã©ã¹ãã¹ã«ãã£ãŠèªåçã«æ€çŽ¢ãããlog4j2ãšããååãæã¡ãããã©ã«ãã§ããã±ãŒãžå ã«é 眮ãããŠããå¿ èŠããããŸãã
log4j2ã®æ§æã¯ããã¬ãŒãã¢ãã³ããŒãããã³ãã£ã«ã¿ãŒã®èª¬æã§æ§æãããŸãã ãã詳现ãªèª¿æ»ã«ã€ããŠã¯ãããã¥ã¡ã³ããåç §ããŠãã ããããã ããããã§ã¯ããã€ãã®éèŠãªç¹ã«ã®ã¿æ³šæããŸãã ãŸããããŒã«ãŒãå«ããã£ã«ã¿ãŒåœ¢åŒã®ããŸããŸãªå©ç¹ããããŸãã
- ããŒã¹ããã£ã«ã¿ãŒ
- ã³ã³ããžããã³ã³ããžãã
- DynamicThresholdFilter
- Mapfilter
- ããŒã«ãŒãã£ã«ã¿ãŒ
- æ£èŠè¡šçŸãã£ã«ã¿ãŒ
- StructuredDataFilter
- ThreadContextMapFilter
- ThresholdFilter
- ã¿ã€ã ãã£ã«ã¿ãŒ
第äºã«ãéåæã¢ãã³ããŒãä»ã®ã¢ãã³ããŒã®ã°ã«ãŒããã©ããããã¢ãã³ããŒãªã©ãå¹ åºãã¢ãã³ããŒã¯ã©ã¹ããããŸãã
- Asyncappppender
- ConsoleAppender
- Failoverapppp
- Fileappender
- Flumeappender
- JDBCAppender
- JMSAppender
- JPAAppender
- MemoryMappedFileAppender
- NoSQLAppender
- OutputStreamAppender
- RandomAccessFileAppender
- Rewriteappppender
- RollingFileAppender
- RollingRandomAccessFileAppender
- RoutingAppender
- SMTPAppender
- ãœã±ããã¢ãã³ããŒ
- Syslogappppender
ãŸããlog4jã¯åãã¯ã©ã¹ã®å€ãã®ç°ãªãã¢ãã³ããŒãããšãã°ç°ãªããã¡ã€ã«ã«æžã蟌ãè€æ°ã®ãã¡ã€ã«ã¢ãã³ããŒãäœæã§ããããšã«ã泚æããŠãã ããã
2ã€ã®ãã¬ãŒã宣èšãããæ§æã®äŸãèããŠã¿ãŸãããïŒã«ãŒãããã³ã¯ã©ã¹çšïŒãæåã®ãã¬ãŒã¯log.logãã¡ã€ã«ã«æžã蟌ã¿ã2çªç®ã®ãã¬ãŒã¯ããŒã«ãŒã«ãããã£ã«ã¿ãªã³ã°ã䜿çšããŠlog2.logã«æžã蟌ã¿ãŸãã
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <!-- --> <Appenders> <!-- --> <File name="file" fileName="log.log"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern> </PatternLayout> </File> <!-- --> <File name="file2" fileName="log2.log"> <!-- --> <MarkerFilter marker="fileonly" onMatch="DENY" onMismatch="ACCEPT"/> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern> </PatternLayout> </File> </Appenders> <!-- --> <Loggers> <!-- --> <Root level="trace"> <AppenderRef ref="file" level="DEBUG"/> </Root> <!-- --> <Logger name="logging.log4j.LoggingLog4j" level="info" additivity="false"> <AppenderRef ref="file2" level="INFO"/> </Logger> </Loggers> </Configuration>
ã³ã¢ã³ãºãã®ã³ã°
ããªãå€ããããžã§ã¯ããJULãšlog4jã®ã©ãããŒã§ãããè¿œå ã®æ©èœã¯ãããŸããã JCLãã®ã³ã°ã¬ãã«ã¯log4jãšåãã§ãããJULãšå¯Ÿè©±ããå Žåã次ã®ãããã³ã°ãçºçããŸãã
fatal = Level.SEVERE error = Level.SEVERE warn = Level.WARNING info = Level.INFO debug = Level.FINE trace = Level.FINEST
JCLã䜿çšããã«ã¯ã commons-logging-1.x.jarãæ¥ç¶ããŸãã ãã¡ã¯ããªã¡ãœãããåŒã³åºããŠãã¬ãŒãäœæããŸãã
Log log = LogFactory.getLog(LoggingCl.class); // Log log = LogFactory.getLog("name");
JCLã¡ãœããã¯éåžžã«ã·ã³ãã«ã§ããã®ã³ã°ã¬ãã«ã®ååãšäžèŽãããªããžã§ã¯ããšäŸå€ã®ã¿ãåãå ¥ãã2ã€ã®ããªãšãŒã·ã§ã³ããããŸãã
Object object = ""; Throwable throwable = new Throwable(); log.info(object); log.info(object, throwable);
JCLæ§æã«ã¯ãlog4jãJULãããã³ç¬èªã®å®è£ çšã®åå¥ã®ãããã¯ãå«ãŸããŠããŸãã æ§æãæå®ããªãå Žåãã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžã衚瀺ããSimpleLogãšåŒã°ããç¬èªã®å®è£ ã䜿çšããŸãã æ§æãã¡ã€ã«ã®äŸãèããŠã¿ãŸãããã
#Log4j org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger log4j.configuration=log4j.properties #JUL org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler .level=INFO java.util.logging.FileHandler.pattern=jul.log java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.FileHandler.limit=50000 java.util.logging.FileHandler.count=1 #SimpleLog org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog org.apache.commons.logging.simplelog.defaultlog=fatal org.apache.commons.logging.simplelog.showlogname=true org.apache.commons.logging.simplelog.showShortLogname=true org.apache.commons.logging.simplelog.showdatetime=true
次ã®ããã«JCLæ§æãã¡ã€ã«ãæå®ã§ããŸãã
java -Djava.util.logging.config.file=/absolute/path/to/your/config/file/commons-logging.properties -jar /absolute/path/to/your/jar/file/MyClass.jar
ãã°ããã¯
ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ãåŸã§èª¬æããSLF4Jã©ãããŒãšçµã¿åãããŠã®ã¿äœ¿çšãããŸãã éå§ããã«ã¯ã logback-core-1.x.jarãšlogback-classic-1.xxjar ãããã³slf4j-api-1.xxjarãå¿ èŠã§ãã
SLF4Jã©ãããŒãæäŸããAPIãä»ããŠãã¬ãŒãšå¯Ÿè©±ããŸãã ãã®ã³ã°ã¬ãã«ã¯log4jãšåãã§ãã ãã®å Žåã®ãã¬ãŒã®äœæã¯æ¬¡ã®ããã«ãªããŸãã
org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggingLogback.class); // org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("name");
APIã䜿çšãããšãæååã¡ãã»ãŒãžãæååã¡ãã»ãŒãžãã¿ãŒã³ãäŸå€ã衚瀺ããããããŒã«ãŒã䜿çšãããã§ããŸãã
// String stringMessage = ""; // String stringMessageFormat = " {} {}"; // Throwable throwable = new Throwable(); // Marker marker = MarkerFactory.getMarker("marker");
ã¡ãœããã®ååã¯ãã®ã³ã°ã®ã¬ãã«ãšäžèŽãã圢åŒã¯æ¬¡ã®ãšããã§ãã
log.info(stringMessage); log.info(stringMessageFormat, args); log.info(stringMessage, throwable); log.info(marker, stringMessage); log.info(marker, stringMessage, throwable); log.info(marker,stringMessageFormat, args);
次ã«ããã°ããã¯æ©èœãçŽæ¥èŠãŠã¿ãŸãããã æ§æã¯ã次ã®é åºã§ã¯ã©ã¹ãã¹ã§æ€çŽ¢ãããŸãã
- logback.groovyãèŠã€ããããšããŠããŸã
- ãã以å€ã®å Žåãlogback-test.xmlãèŠã€ããããšããŸã
- ãã以å€ã®å Žåãlogback.xmlãèŠã€ããããšããŸã
- ãã以å€ã®å Žåãåºæ¬æ§æã䜿çšããŸã-ã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžã衚瀺ããŸã
äž»ãªæ§æã¢ã€ãã ã¯ããã¬ãŒãã¢ãã³ããŒãã©ã€ãã¢ãŠãããã£ã«ã¿ãŒã§ãã
次ã®ãã£ã«ã¿ãŒã䜿çšã§ããŸãã
- éåžžã®ãã£ã«ã¿ãŒ
- ã¬ãã«ãã£ã«ã¿ãŒ
- ThresholdFilter
- EvaluatorFilter
- ãããã£ãŒ
- ã¿ãŒããã£ã«ã¿ãŒ
- ã«ãŠã³ããã£ã«ã¿ãŒ
以äžã®ã¢ãã³ããŒãå©çšå¯èœã§ãïŒ
- OutputStreamAppender
- ConsoleAppender
- Fileappender
- RollingFileAppender
- SocketAppenderããã³SSLSocketAppender
- ServerSocketAppenderããã³SSLServerSocketAppender
- SMTPAppender
- Syslogappppender
- ãµãã
- Asyncappppender
ç§ã¯ãlogbackã®ã¬ã€ã¢ãŠããšãšã³ã³ãŒããŒãããã¥ã¡ã³ãã«ããããšã«ã€ããŠèªãããšãææ¡ããä»åºŠã¯logback.xmlãã¡ã€ã«ã®ç°¡åãªäŸã瀺ããŸãã
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- --> <!-- --> <appender name="file" class="ch.qos.logback.core.FileAppender"> <file>log.log</file> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</Pattern> </layout> </appender> <!-- --> <appender name="sout" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern> </layout> </appender> <!-- --> <!-- --> <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter"> <Marker>marker</Marker> <OnMatch>DENY</OnMatch> </turboFilter> <!-- --> <!-- --> <root level="info"> <appender-ref ref="file" /> </root> <!-- --> <logger name="logging.logback.LoggingLogback" level="info" > <appender-ref ref="sout" /> </logger> </configuration>
SLF4J
åè¿°ã®ããã«ãSLF4Jã¯ãJULãlog4jãJCLãããã³ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ãããã¬ãŒãšåæ§ã«ããã°ããã¯ã®ã©ãããŒã§ãã SLF4Jã䜿çšããã«ã¯ãslf4j-api-1.xxjarã©ã€ãã©ãªãšããã¬ãŒã®1ã€ãŸãã¯ã¹ã¿ãã®å®è£ ãå¿ èŠã§ãã ååãšããŠããã¹ãŠã®ãã¬ãŒïŒlogbackãé€ãïŒã®å®è£ ã¯SLF4Jã§æäŸãããslf4j-jcl-1.x.jarãslf4j-log4j12-1.x.jarãslf4j-nop-1.x.jarãªã©ã«é¡äŒŒããååãæã£ãŠããŸãã nã ãã¬ãŒã®å®è£ ïŒãŸãã¯nopã¹ã¿ãïŒãã¯ã©ã¹ãã¹ã«èŠã€ãããªãå ŽåãSLF4Jã¯æã£ãŠåªãããããåäœãæåŠããŸãã ã¯ã©ã¹ãã¹ã«èšå®ãããå®è£ ã«å¿ããŠãæ§æãããã«å¿ããŠæ€çŽ¢ãããŸãã
åã®æ®µèœã§SLF4J APIã«ã€ããŠèª¬æããŸããã®ã§ãå¥ã®ã©ãããŒãªãã·ã§ã³ãèŠãŠã¿ãŸãããã çæ³çãªäžçã§ã¯ãã©ãããŒã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã¡ãã»ãŒãžãåºåããå¿ èŠããããŸããããã®åŸã¯ãã¹ãŠåé¡ãããŸããããå®éã®æ®é ·ãªäžçã§ã¯ãä»ã®ãã¬ãŒã䜿çšããSLF4Jãç¥ããªããµãŒãããŒãã£ã®ã©ã€ãã©ãªãŸãã¯ã³ãŒããšããåãããå¿ èŠãããããšã瀺åããŠããŸãã åãã¬ãŒã«é©å¿ããã®ã§ã¯ãªããSLF4Jã€ã³ã¿ãŒãã§ãŒã¹ã®1ã€ã®å®è£ ãéããŠãã¹ãŠã®ã¡ãã»ãŒãžãèš±å¯ããããã«ãããªããžã³ã°ã䜿çšã§ããŸãã ã©ãããŒãµãã©ã€ã«ã¯ãjcl-over-slf4j.jarãlog4j-over-slf4j.jarãããã³jul-to-slf4j.jarã©ã€ãã©ãªãå«ãŸããŠããŸãããããã®ã©ã€ãã©ãªã¯ã察å¿ãããã¬ãŒã®åäœããªãŒããŒã©ã€ãããã¡ãã»ãŒãžãã©ãããŒã«ãªãã€ã¬ã¯ãããŸãã
äžèšã®å 容ãæ確ã«ãããããäŸãèããŠã¿ãŸãããã 次ã®ãã¬ãŒããããšããŸãã
java.util.logging.Logger julLog = java.util.logging.Logger.getLogger("julLog"); java.util.logging.Logger log4jLog = java.util.logging.Logger.getLogger("log4jLog"); org.slf4j.Logger slf4jLog = org.slf4j.LoggerFactory.getLogger(LoggingSlf4j.class); julLog.info(" jul"); log4jLog.info(" log4j"); slf4jLog.info(" slf4j");
JULããã®ã¡ãã»ãŒãžã1ã€ã®ãã¡ã€ã«ã«ãlog4jããå¥ã®ãã¡ã€ã«ã«ãslf4jããã³ã³ãœãŒã«ã«æžã蟌ãããã«ããŸãã ã©ãããŒã®å®è£ ãšããŠãlogbackã䜿çšããŸãããã®äžåèªã®æ§æã¯æ¬¡ã®ããã«ãªããŸãã
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- --> <!-- JUL --> <appender name="jul" class="ch.qos.logback.core.FileAppender"> <file>log_jul.log</file> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</Pattern> </layout> </appender> <!-- log4j --> <appender name="log4j" class="ch.qos.logback.core.FileAppender"> <file>log_log4j.log</file> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</Pattern> </layout> </appender> <!-- --> <appender name="sout" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern> </layout> </appender> <!-- --> <!-- --> <root level="info" > <appender-ref ref="sout" /> </root> <!-- jul --> <logger name="julLog" additivity="false" > <level value="trace" /> <appender-ref ref="jul" /> </logger> <!-- log4j --> <logger name="log4jLog" additivity="false" > <level value="trace" /> <appender-ref ref="log4j" /> </logger> </configuration>
ããªããžãæ©èœããã«ã¯ã次ã®ã³ãŒããå®è¡ããå¿ èŠããããŸãã
SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install();
ãã£ãšç¥ããã
- JUL- Java LoggingïŒLoggerããã³Java LoggingïŒConfigurationããèªã¿ãã ãã
- Log4j2- Log4j 2ãžãããã
- JCL- Commons Loggingã®äœ¿çšæ¹æ³ãèªã
- Logback- read logbackããã¥ã¢ã«
- SLF4J- SLF4Jã®ããã¥ã¡ã³ããšã¬ã¬ã·ãŒAPIã®ããªããžãèªã
ãããã«
çµè«ãšããŠããã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ã®æçµçãªéžæã¯åžžã«ããªã次第ã§ãããè³¢æã«ããã«ã¢ãããŒãããå¿ èŠãããããšãäŒããããšæããŸãã éžæã¯ãé«æ§èœã䟿å©ãªAPIããã°ã«èšé²ãããããŒã¿ãä¿åããããã«å¿ èŠãªæ¹æ³ã®å¯çšæ§ãããã³ãããžã§ã¯ãã®è©³çŽ°ãªã©ãå€ãã®åºæºã®æºè¶³åºŠã«åºã¥ããŠããå¿ èŠããããŸããããšãã°ã補åãä»ã®ãããžã§ã¯ãã§äœ¿çšãããå ŽåããŠãŒã¶ãŒã䜿çšãããã¬ãŒã決å®ããã¹ãã§ã¯ãããŸããããã®ä»£ããã«ãã©ãããŒãåªå ããŸãã