Coverage Summary for Class: Log (net.sf.persism)
Class |
Method, %
|
Line, %
|
Log |
100%
(19/19)
|
77.6%
(45/58)
|
Log$1 |
100%
(1/1)
|
100%
(1/1)
|
Total |
100%
(20/20)
|
78%
(46/59)
|
1 package net.sf.persism;
2
3
4 import net.sf.persism.logging.*;
5
6 import java.util.*;
7 import java.util.concurrent.ConcurrentHashMap;
8
9 /**
10 * Logging wrapper to avoid runtime dependencies.
11 * It will use slf4j if available or log4j if available otherwise it falls back to JUL (java.util.logging).
12 * <p/>
13 * JUL will use the default java logging.properties
14 * log4j will use log4j.properties
15 * slf4j will use logback.xml
16 * <p/>
17 * log4j DEBUG maps to JUL FINE
18 * log4j ERROR maps to JUL SEVERE
19 * <p/>
20 * The class includes an overloaded error method to log stack traces as well as the message.
21 *
22 * @author Dan Howard
23 * @since 4/21/12 6:47 AM
24 */
25 final class Log {
26
27 private AbstractLogger logger;
28
29 private static final Map<String, Log> loggers = new ConcurrentHashMap<String, Log>(12);
30
31 private static final List<String> warnings = new ArrayList<>(32);
32
33 public Log(String logName, LogMode logMode) {
34 switch (logMode) {
35 case SLF4J -> {
36 logger = new Slf4jLogger(logName);
37 }
38 case LOG4J2 -> {
39 logger = new Log4j2Logger(logName);
40 }
41 case LOG4J -> {
42 logger = new Log4jLogger(logName);
43 }
44 case JUL -> {
45 logger = new JulLogger(logName);
46 }
47 }
48 }
49
50 Log(String logName) {
51 try {
52 Class.forName("org.slf4j.Logger");
53 logger = new Slf4jLogger(logName);
54 } catch (ClassNotFoundException e) {
55 try {
56 Class.forName("org.apache.log4j.Logger");
57 logger = new Log4jLogger(logName);
58 } catch (ClassNotFoundException e1) {
59 try {
60 Class.forName("org.apache.logging.log4j.Logger");
61 logger = new Log4j2Logger(logName);
62 } catch (ClassNotFoundException classNotFoundException) {
63 logger = new JulLogger(logName);
64 }
65 }
66 }
67 }
68
69 void warnNoDuplicates(String message) {
70 String additional = "";
71
72 Throwable throwable = new Throwable("");
73 // This finds the stack element for the user's package name - should be the source of the call to include in the message
74 Optional<StackTraceElement> opt = Arrays.stream(throwable.getStackTrace()).
75 filter(e -> !e.getClassName().startsWith("net.sf.persism")).findFirst();
76
77 if (opt.isPresent()) {
78 additional = opt.get().toString().trim();
79 }
80
81 String msg = message + " " + additional;
82 if (!warnings.contains(msg)) {
83 warnings.add(msg);
84 warn(msg);
85 }
86 }
87
88 public static Log getLogger(Class<?> logName) {
89 return getLogger(logName.getName());
90 }
91
92 // for unit tests
93 static Log getLogger(Class<?> logName, LogMode logMode) {
94 if (loggers.containsKey(logName.getName())) {
95 return loggers.get(logName.getName());
96 }
97 Log log = new Log(logName.getName(), logMode);
98 loggers.put(logName.getName(), log);
99 return log;
100 }
101
102 public static Log getLogger(String logName) {
103 if (loggers.containsKey(logName)) {
104 return loggers.get(logName);
105 }
106 Log log = new Log(logName);
107 loggers.put(logName, log);
108 return log;
109 }
110
111 List<String> warnings() {
112 return warnings;
113 }
114
115
116 public boolean isDebugEnabled() {
117 return logger.isDebugEnabled();
118 }
119
120 public void debug(Object message) {
121 logger.debug(message);
122 }
123
124 public void debug(Object message, Object... params) {
125 logger.debug(message, params);
126 }
127
128 public void info(Object message) {
129 logger.info(message);
130 }
131
132 public void info(Object message, Throwable t) {
133 logger.info(message, t);
134 }
135
136 public void warn(Object message) {
137 logger.warn(message);
138 }
139
140 public void warn(Object message, Throwable t) {
141 logger.warn(message, t);
142 }
143
144 public void error(Object message) {
145 logger.error(message);
146 }
147
148 public void error(Object message, Throwable t) {
149 logger.error(message, t);
150 }
151
152 public LogMode getLogMode() {
153 return logger.getLogMode();
154 }
155
156 public String getLogName() {
157 return logger.getLogName();
158 }
159 }