Skip to content

Commit e3de32f

Browse files
committed
Internal logging support
Add a logging abstraction over foreign logger backends. The internal logger supports JUL and SLF4J (Logback) loggers in this commit. Parametrized messages are supported via MessageFormat instead of relying on external loggers support. Closes: #194
1 parent b4f1d6d commit e3de32f

9 files changed

+532
-0
lines changed

pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
<junit.jupiter.version>5.4.2</junit.jupiter.version>
1111
<snakeyml.version>1.23</snakeyml.version>
1212
<mockito.version>1.10.19</mockito.version>
13+
<!-- logger dependency versions -->
14+
<sfl4j.version>1.7.26</sfl4j.version>
1315
</properties>
1416
<name>Tarantool Connector for Java</name>
1517
<url>https://github.com/tarantool/tarantool-java</url>
@@ -189,6 +191,12 @@
189191
<version>${snakeyml.version}</version>
190192
<scope>test</scope>
191193
</dependency>
194+
<dependency>
195+
<groupId>org.slf4j</groupId>
196+
<artifactId>slf4j-api</artifactId>
197+
<version>${sfl4j.version}</version>
198+
<scope>provided</scope>
199+
</dependency>
192200
</dependencies>
193201

194202
<parent>
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package org.tarantool.logging;
2+
3+
import java.util.function.Supplier;
4+
5+
abstract class BaseLogger implements Logger {
6+
7+
public abstract void log(Level level, String text, Throwable error, Object... parameters);
8+
9+
public void log(Level level, Throwable error, Supplier<String> message) {
10+
if (!isLoggable(level)) {
11+
return;
12+
}
13+
log(level, message.get(), error);
14+
}
15+
16+
public abstract boolean isLoggable(Level level);
17+
18+
@Override
19+
public void debug(String message) {
20+
log(Level.DEBUG, message, null);
21+
}
22+
23+
@Override
24+
public void debug(String format, Object... params) {
25+
log(Level.DEBUG, format, null, params);
26+
}
27+
28+
@Override
29+
public void debug(String message, Throwable throwable) {
30+
log(Level.DEBUG, message, throwable);
31+
}
32+
33+
@Override
34+
public void debug(Supplier<String> message, Throwable throwable) {
35+
log(Level.DEBUG, throwable, message);
36+
}
37+
38+
@Override
39+
public void error(String message) {
40+
log(Level.ERROR, message, null);
41+
}
42+
43+
@Override
44+
public void error(String format, Object... params) {
45+
log(Level.ERROR, format, null, params);
46+
}
47+
48+
@Override
49+
public void error(String message, Throwable throwable) {
50+
log(Level.ERROR, message, throwable);
51+
}
52+
53+
@Override
54+
public void error(Supplier<String> message, Throwable throwable) {
55+
log(Level.ERROR, throwable, message);
56+
}
57+
58+
@Override
59+
public void info(String message) {
60+
log(Level.INFO, message, null);
61+
}
62+
63+
@Override
64+
public void info(String format, Object... params) {
65+
log(Level.INFO, format, null, params);
66+
}
67+
68+
@Override
69+
public void info(String message, Throwable throwable) {
70+
log(Level.INFO, message, throwable);
71+
}
72+
73+
@Override
74+
public void info(Supplier<String> message, Throwable throwable) {
75+
log(Level.INFO, throwable, message);
76+
}
77+
78+
@Override
79+
public void trace(String message) {
80+
log(Level.TRACE, message, null);
81+
}
82+
83+
@Override
84+
public void trace(String format, Object... params) {
85+
log(Level.TRACE, format, null, params);
86+
}
87+
88+
@Override
89+
public void trace(String message, Throwable throwable) {
90+
log(Level.TRACE, message, throwable);
91+
}
92+
93+
@Override
94+
public void trace(Supplier<String> message, Throwable throwable) {
95+
log(Level.TRACE, throwable, message);
96+
}
97+
98+
@Override
99+
public void warn(String message) {
100+
log(Level.WARN, message, null);
101+
}
102+
103+
@Override
104+
public void warn(String format, Object... params) {
105+
log(Level.WARN, format, null, params);
106+
}
107+
108+
@Override
109+
public void warn(String message, Throwable throwable) {
110+
log(Level.WARN, message, throwable);
111+
}
112+
113+
@Override
114+
public void warn(Supplier<String> message, Throwable throwable) {
115+
log(Level.WARN, throwable, message);
116+
}
117+
118+
@Override
119+
public boolean isDebugEnabled() {
120+
return isLoggable(Level.DEBUG);
121+
}
122+
123+
@Override
124+
public boolean isErrorEnabled() {
125+
return isLoggable(Level.ERROR);
126+
}
127+
128+
@Override
129+
public boolean isInfoEnabled() {
130+
return isLoggable(Level.INFO);
131+
}
132+
133+
@Override
134+
public boolean isTraceEnabled() {
135+
return isLoggable(Level.TRACE);
136+
}
137+
138+
@Override
139+
public boolean isWarnEnabled() {
140+
return isLoggable(Level.WARN);
141+
}
142+
143+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package org.tarantool.logging;
2+
3+
import java.util.logging.LogRecord;
4+
5+
/**
6+
* Adapter to JUL logger backend.
7+
* <p>
8+
* This class is not a part of public API.
9+
*
10+
* @see java.util.logging
11+
*/
12+
class JdkLogger extends BaseLogger {
13+
14+
private final java.util.logging.Logger delegate;
15+
16+
public JdkLogger(String loggerName) {
17+
this.delegate = java.util.logging.Logger.getLogger(loggerName);
18+
}
19+
20+
@Override
21+
public String getName() {
22+
return delegate.getName();
23+
}
24+
25+
@Override
26+
public void log(Level level, String text, Throwable error, Object... parameters) {
27+
if (!isLoggable(level)) {
28+
return;
29+
}
30+
31+
java.util.logging.Level julLevel = translate(level);
32+
LogRecord record = new LogRecord(julLevel, text);
33+
record.setLoggerName(delegate.getName());
34+
record.setResourceBundle(delegate.getResourceBundle());
35+
record.setResourceBundleName(delegate.getResourceBundleName());
36+
if (error != null) {
37+
record.setThrown(error);
38+
}
39+
record.setParameters(parameters);
40+
delegate.log(record);
41+
}
42+
43+
@Override
44+
public boolean isLoggable(Level level) {
45+
return delegate.isLoggable(translate(level));
46+
}
47+
48+
private java.util.logging.Level translate(Level level) {
49+
switch (level) {
50+
case ERROR:
51+
return java.util.logging.Level.SEVERE;
52+
case WARN:
53+
return java.util.logging.Level.WARNING;
54+
case INFO:
55+
return java.util.logging.Level.INFO;
56+
case DEBUG:
57+
return java.util.logging.Level.FINE;
58+
case TRACE:
59+
return java.util.logging.Level.FINEST;
60+
default:
61+
return java.util.logging.Level.ALL;
62+
}
63+
}
64+
65+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.tarantool.logging;
2+
3+
/**
4+
* Delegates a logger creation to JUL logger adapter.
5+
* <p>
6+
* This class is not a part of public API.
7+
*/
8+
public class JdkLoggerProvider implements LoggerProvider {
9+
10+
@Override
11+
public Logger getLogger(String name) {
12+
return new JdkLogger(name);
13+
}
14+
15+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.tarantool.logging;
2+
3+
import java.util.function.Supplier;
4+
5+
/**
6+
* Minimal logger contract to perform internal
7+
* logging.
8+
* <p>
9+
* This class is not a part of public API.
10+
*/
11+
public interface Logger {
12+
13+
enum Level {
14+
ERROR,
15+
WARN,
16+
INFO,
17+
DEBUG,
18+
TRACE
19+
}
20+
21+
String getName();
22+
23+
boolean isErrorEnabled();
24+
25+
void error(final String message);
26+
27+
void error(final String format, final Object... params);
28+
29+
void error(final String message, Throwable throwable);
30+
31+
void error(final Supplier<String> message, Throwable throwable);
32+
33+
boolean isWarnEnabled();
34+
35+
void warn(final String message);
36+
37+
void warn(final String format, final Object... params);
38+
39+
void warn(final String message, Throwable throwable);
40+
41+
void warn(final Supplier<String> message, Throwable throwable);
42+
43+
boolean isInfoEnabled();
44+
45+
void info(final String message);
46+
47+
void info(final String format, final Object... params);
48+
49+
void info(final String message, Throwable throwable);
50+
51+
void info(final Supplier<String> message, Throwable throwable);
52+
53+
boolean isDebugEnabled();
54+
55+
void debug(final String message);
56+
57+
void debug(final String format, final Object... params);
58+
59+
void debug(final String message, Throwable throwable);
60+
61+
void debug(final Supplier<String> message, Throwable throwable);
62+
63+
boolean isTraceEnabled();
64+
65+
void trace(final String message);
66+
67+
void trace(final String format, final Object... params);
68+
69+
void trace(final String message, Throwable throwable);
70+
71+
void trace(final Supplier<String> message, Throwable throwable);
72+
73+
}

0 commit comments

Comments
 (0)