Coverage Summary for Class: Log (net.sf.persism)
| Class | Class, % | Method, % | Line, % |
|---|---|---|---|
| Log | 100% (1/1) | 81.2% (13/16) | 65% (26/40) |
1 package net.sf.persism; 2 3 4 import net.sf.persism.logging.AbstractLogger; 5 import net.sf.persism.logging.LogMode; 6 import net.sf.persism.logging.implementation.JulLogger; 7 import net.sf.persism.logging.implementation.Log4j2Logger; 8 import net.sf.persism.logging.implementation.Log4jLogger; 9 import net.sf.persism.logging.implementation.Slf4jLogger; 10 11 import java.util.ArrayList; 12 import java.util.Arrays; 13 import java.util.List; 14 import java.util.Map; 15 import java.util.concurrent.ConcurrentHashMap; 16 17 /** 18 * Logging wrapper to avoid runtime dependencies. 19 * It will use slf4j if available or log4j if available otherwise it falls back to JUL (java.util.logging). 20 * <p/> 21 * JUL will use the default java logging.properties 22 * log4j will use log4j.properties 23 * slf4j will use logback.xml 24 * <p/> 25 * log4j DEBUG maps to JUL FINE 26 * log4j ERROR maps to JUL SEVERE 27 * <p/> 28 * The class includes an overloaded error method to log stack traces as well as the message. 29 * 30 * @author Dan Howard 31 * @since 4/21/12 6:47 AM 32 */ 33 final class Log { 34 35 private AbstractLogger logger; 36 37 private static final Map<String, Log> loggers = new ConcurrentHashMap<String, Log>(12); 38 39 private static final List<String> warnings = new ArrayList<>(32); 40 41 private Log() { 42 } 43 44 Log(String logName) { 45 try { 46 Class.forName("org.slf4j.Logger"); 47 logger = new Slf4jLogger(logName); 48 } catch (ClassNotFoundException e) { 49 try { 50 Class.forName("org.apache.log4j.Logger"); 51 logger = new Log4jLogger(logName); 52 } catch (ClassNotFoundException e1) { 53 try { 54 Class.forName("org.apache.logging.log4j.Logger"); 55 logger = new Log4j2Logger(logName); 56 } catch (ClassNotFoundException classNotFoundException) { 57 logger = new JulLogger(logName); 58 } 59 } 60 } 61 assert logger != null; 62 } 63 64 void warnNoDuplicates(String message) { 65 //noinspection OptionalGetWithoutIsPresent 66 String additional = Arrays.stream(new Throwable().getStackTrace()).skip(2).findFirst().get().toString().trim(); 67 String msg = message + " " + additional; 68 if (!warnings.contains(msg)) { 69 warnings.add(msg); 70 warn(msg); 71 } 72 } 73 74 public static Log getLogger(Class logName) { 75 return getLogger(logName.getName()); 76 } 77 78 public static Log getLogger(String logName) { 79 if (loggers.containsKey(logName)) { 80 return loggers.get(logName); 81 } 82 Log log = new Log(logName); 83 loggers.put(logName, log); 84 return log; 85 } 86 87 88 public boolean isDebugEnabled() { 89 return logger.isDebugEnabled(); 90 } 91 92 public void debug(Object message, Object... params) { 93 logger.debug(message, params); 94 } 95 96 public void info(Object message) { 97 logger.info(message); 98 } 99 100 public void info(Object message, Throwable t) { 101 logger.info(message, t); 102 } 103 104 public void warn(Object message) { 105 logger.warn(message); 106 } 107 108 public void warn(Object message, Throwable t) { 109 logger.warn(message, t); 110 } 111 112 113 public void error(Object message) { 114 logger.error(message); 115 } 116 117 public void error(Object message, Throwable t) { 118 logger.error(message, t); 119 } 120 121 public LogMode getLogMode() { 122 return logger.getLogMode(); 123 } 124 125 public String getLogName() { 126 return logger.getLogName(); 127 } 128 }