]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.cms/src/org/argeo/api/cms/CmsLog.java
1 package org
.argeo
.api
.cms
;
3 import java
.lang
.System
.Logger
;
4 import java
.text
.MessageFormat
;
5 import java
.util
.Objects
;
6 import java
.util
.function
.Supplier
;
9 * A Commons Logging / SLF4J style logging utilities usually wrapping a standard
10 * Java platform {@link Logger}, but which can fallback to other mechanism, if a
11 * system logger is not available.
13 public interface CmsLog
{
15 * SYSTEM LOGGER STYLE METHODS
17 boolean isLoggable(Level level
);
19 void log(Level level
, Supplier
<String
> msgSupplier
, Throwable thrown
);
21 void log(Level level
, String msg
, Throwable thrown
);
23 void log(Level level
, String format
, Object
... params
);
25 default void log(Level level
, String msg
) {
26 log(level
, msg
, (Throwable
) null);
29 default void log(Level level
, Supplier
<String
> msgSupplier
) {
30 log(level
, msgSupplier
, (Throwable
) null);
33 default void log(Level level
, Object obj
) {
34 Objects
.requireNonNull(obj
);
35 log(level
, obj
.toString());
39 * SLF4j / COMMONS LOGGING STYLE METHODS
44 default boolean isDebugEnabled() {
45 return getLogger().isLoggable(Level
.DEBUG
);
48 default boolean isErrorEnabled() {
49 return getLogger().isLoggable(Level
.ERROR
);
52 default boolean isInfoEnabled() {
53 return getLogger().isLoggable(Level
.INFO
);
56 default boolean isTraceEnabled() {
57 return getLogger().isLoggable(Level
.TRACE
);
60 default boolean isWarnEnabled() {
61 return getLogger().isLoggable(Level
.WARNING
);
68 default void trace(String message
) {
69 getLogger().log(Level
.TRACE
, message
);
72 default void trace(Supplier
<String
> message
) {
73 getLogger().log(Level
.TRACE
, message
);
76 default void trace(Object message
) {
77 getLogger().log(Level
.TRACE
, Objects
.requireNonNull(message
));
80 default void trace(String message
, Throwable t
) {
81 getLogger().log(Level
.TRACE
, message
, t
);
84 default void trace(Object message
, Throwable t
) {
85 trace(Objects
.requireNonNull(message
).toString(), t
);
88 default void trace(String format
, Object
... arguments
) {
89 getLogger().log(Level
.TRACE
, format
, arguments
);
96 default void debug(String message
) {
97 getLogger().log(Level
.DEBUG
, message
);
100 default void debug(Supplier
<String
> message
) {
101 getLogger().log(Level
.DEBUG
, message
);
104 default void debug(Object message
) {
105 getLogger().log(Level
.DEBUG
, message
);
108 default void debug(String message
, Throwable t
) {
109 getLogger().log(Level
.DEBUG
, message
, t
);
112 default void debug(Object message
, Throwable t
) {
113 debug(Objects
.requireNonNull(message
).toString(), t
);
116 default void debug(String format
, Object
... arguments
) {
117 getLogger().log(Level
.DEBUG
, format
, arguments
);
124 default void info(String message
) {
125 getLogger().log(Level
.INFO
, message
);
128 default void info(Supplier
<String
> message
) {
129 getLogger().log(Level
.INFO
, message
);
132 default void info(Object message
) {
133 getLogger().log(Level
.INFO
, message
);
136 default void info(String message
, Throwable t
) {
137 getLogger().log(Level
.INFO
, message
, t
);
140 default void info(Object message
, Throwable t
) {
141 info(Objects
.requireNonNull(message
).toString(), t
);
144 default void info(String format
, Object
... arguments
) {
145 getLogger().log(Level
.INFO
, format
, arguments
);
152 default void warn(String message
) {
153 getLogger().log(Level
.WARNING
, message
);
156 default void warn(Supplier
<String
> message
) {
157 getLogger().log(Level
.WARNING
, message
);
160 default void warn(Object message
) {
161 getLogger().log(Level
.WARNING
, message
);
164 default void warn(String message
, Throwable t
) {
165 getLogger().log(Level
.WARNING
, message
, t
);
168 default void warn(Object message
, Throwable t
) {
169 warn(Objects
.requireNonNull(message
).toString(), t
);
172 default void warn(String format
, Object
... arguments
) {
173 getLogger().log(Level
.WARNING
, format
, arguments
);
180 default void error(String message
) {
181 getLogger().log(Level
.ERROR
, message
);
184 default void error(Supplier
<String
> message
) {
185 getLogger().log(Level
.ERROR
, message
);
188 default void error(Object message
) {
189 getLogger().log(Level
.ERROR
, message
);
192 default void error(String message
, Throwable t
) {
193 getLogger().log(Level
.ERROR
, message
, t
);
196 default void error(Object message
, Throwable t
) {
197 error(Objects
.requireNonNull(message
).toString(), t
);
200 default void error(String format
, Object
... arguments
) {
201 getLogger().log(Level
.ERROR
, format
, arguments
);
205 * Exact mapping of ${java.lang.System.Logger.Level}, in case it is not
208 public static enum Level
{
209 ALL(Integer
.MIN_VALUE
), //
215 OFF(Integer
.MAX_VALUE
); //
219 private Level(int severity
) {
220 this.severity
= severity
;
223 public final int getSeverity() {
232 static CmsLog
getLog(Class
<?
> clss
) {
233 return getLog(Objects
.requireNonNull(clss
).getName());
236 static CmsLog
getLog(String name
) {
237 if (isSystemLoggerAvailable
) {
238 return new SystemCmsLog(name
);
239 } else { // typically Android
240 return new FallBackCmsLog();
244 static final boolean isSystemLoggerAvailable
= isSystemLoggerAvailable();
246 static boolean isSystemLoggerAvailable() {
248 Logger logger
= System
.getLogger(CmsLog
.class.getName());
249 logger
.log(java
.lang
.System
.Logger
.Level
.TRACE
, () -> "System logger is available.");
251 } catch (NoSuchMethodError
| NoClassDefFoundError e
) {// Android
258 * Uses {@link System.Logger}, should be used on proper implementations of the
261 class SystemCmsLog
implements CmsLog
{
262 private final Logger logger
;
264 SystemCmsLog(String name
) {
265 logger
= System
.getLogger(name
);
269 public boolean isLoggable(Level level
) {
270 return logger
.isLoggable(convertSystemLevel(level
));
274 public void log(Level level
, Supplier
<String
> msgSupplier
, Throwable thrown
) {
275 logger
.log(convertSystemLevel(level
), msgSupplier
, thrown
);
279 public void log(Level level
, String msg
, Throwable thrown
) {
280 logger
.log(convertSystemLevel(level
), msg
, thrown
);
283 java
.lang
.System
.Logger
.Level
convertSystemLevel(Level level
) {
284 switch (level
.severity
) {
285 case Integer
.MIN_VALUE
:
286 return java
.lang
.System
.Logger
.Level
.ALL
;
288 return java
.lang
.System
.Logger
.Level
.TRACE
;
290 return java
.lang
.System
.Logger
.Level
.DEBUG
;
292 return java
.lang
.System
.Logger
.Level
.INFO
;
294 return java
.lang
.System
.Logger
.Level
.WARNING
;
296 return java
.lang
.System
.Logger
.Level
.ERROR
;
297 case Integer
.MAX_VALUE
:
298 return java
.lang
.System
.Logger
.Level
.OFF
;
300 throw new IllegalArgumentException("Unexpected value: " + level
.severity
);
305 public void log(Level level
, String format
, Object
... params
) {
306 logger
.log(convertSystemLevel(level
), format
, params
);
310 public CmsLog
getLogger() {
315 /** Dummy fallback for non-standard platforms such as Android. */
316 class FallBackCmsLog
implements CmsLog
{
318 public boolean isLoggable(Level level
) {
319 return level
.getSeverity() >= 800;// INFO and higher
323 public void log(Level level
, Supplier
<String
> msgSupplier
, Throwable thrown
) {
324 if (isLoggable(level
))
325 if (thrown
!= null || level
.getSeverity() >= 900) {
326 System
.err
.println(msgSupplier
.get());
327 thrown
.printStackTrace();
329 System
.out
.println(msgSupplier
.get());
334 public void log(Level level
, String msg
, Throwable thrown
) {
335 if (isLoggable(level
))
336 if (thrown
!= null || level
.getSeverity() >= 900) {
337 System
.err
.println(msg
);
338 thrown
.printStackTrace();
340 System
.out
.println(msg
);
345 public void log(Level level
, String format
, Object
... params
) {
348 String msg
= MessageFormat
.format(format
, params
);
353 public CmsLog
getLogger() {