Skip to content

Commit fa48d8a

Browse files
committed
SLF4J-256: Allow use of lambda to construct build event
- Rename current LoggingEventBuilder to FluentApiStub to better describe its responsibility - New interface of LoggingEventBuilder to act only as Fluent Builder of LoggingEvent, which is used by the lambda
1 parent bef8028 commit fa48d8a

File tree

8 files changed

+201
-57
lines changed

8 files changed

+201
-57
lines changed

slf4j-api/src/main/java/org/slf4j/Logger.java

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@
3838

3939
import org.slf4j.event.Level;
4040
import org.slf4j.spi.DefaultLoggingEventBuilder;
41+
import org.slf4j.spi.FluentLogApiStub;
4142
import org.slf4j.spi.LoggingEventBuilder;
4243
import org.slf4j.spi.NOPLoggingEventBuilder;
4344

45+
import java.util.function.Consumer;
46+
4447
/**
4548
* The org.slf4j.Logger interface is the main user entry point of SLF4J API.
4649
* It is expected that logging takes place through concrete implementations
@@ -96,7 +99,7 @@ public interface Logger {
9699
public String getName();
97100

98101
/**
99-
* Make a new {@link LoggingEventBuilder} instance as appropriate for this logger and the
102+
* Make a new {@link FluentLogApiStub} instance as appropriate for this logger and the
100103
* desired {@link Level} passed as parameter. If this Logger is disabled for the given Level, then
101104
* a {@link NOPLoggingEventBuilder} is returned.
102105
*
@@ -105,21 +108,34 @@ public interface Logger {
105108
* @return a new {@link LoggingEventBuilder} instance as appropriate for this logger
106109
* @since 2.0
107110
*/
108-
default public LoggingEventBuilder makeLoggingEventBuilder(Level level) {
111+
default public FluentLogApiStub makeLoggingEventBuilder(Level level) {
109112
if (isEnabledForLevel(level)) {
110113
return new DefaultLoggingEventBuilder(this, level);
111114
} else {
112115
return NOPLoggingEventBuilder.singleton();
113116
}
114117
}
115118

119+
default public FluentLogApiStub atLevel(Level level) {
120+
return makeLoggingEventBuilder(level);
121+
}
122+
123+
116124
/**
117-
* A convenient alias for {@link #makeLoggingEventBuilder}.
118-
*
125+
* Use provided LoggingEventBuilder consumer to construct the logging event, and log at provided level.
126+
*
127+
* <code>
128+
* logger.atDebug(log->log.message("Temperature rise from {} to {}")
129+
* </code>
130+
*
119131
* @since 2.0
120132
*/
121-
default public LoggingEventBuilder atLevel(Level level) {
122-
return makeLoggingEventBuilder(level);
133+
default public void atLevel(Level level, Consumer<LoggingEventBuilder> eventBuilderConsumer) {
134+
if (isEnabledForLevel(level)) {
135+
DefaultLoggingEventBuilder eventBuilder= new DefaultLoggingEventBuilder(this, level);
136+
eventBuilderConsumer.accept(eventBuilder);
137+
eventBuilder.log();
138+
}
123139
}
124140

125141

@@ -233,16 +249,19 @@ default public boolean isEnabledForLevel(Level level) {
233249
/**
234250
* Entry point for fluent-logging for {@link org.slf4j.event.Level#TRACE} level.
235251
*
236-
* @return LoggingEventBuilder instance as appropriate for level TRACE
252+
* @return FluentLogApiStub instance as appropriate for level TRACE
237253
* @since 2.0
238254
*/
239-
default public LoggingEventBuilder atTrace() {
255+
default public FluentLogApiStub atTrace() {
240256
if (isTraceEnabled()) {
241257
return makeLoggingEventBuilder(TRACE);
242258
} else {
243259
return NOPLoggingEventBuilder.singleton();
244260
}
245261
}
262+
default public void atTrace(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
263+
this.atLevel(TRACE, eventBuilderConsumer);
264+
}
246265

247266
/**
248267
* Log a message with the specific Marker at the TRACE level.
@@ -429,17 +448,21 @@ default public LoggingEventBuilder atTrace() {
429448
/**
430449
* Entry point for fluent-logging for {@link org.slf4j.event.Level#DEBUG} level.
431450
*
432-
* @return LoggingEventBuilder instance as appropriate for level DEBUG
451+
* @return FluentLogApiStub instance as appropriate for level DEBUG
433452
* @since 2.0
434453
*/
435-
default public LoggingEventBuilder atDebug() {
454+
default public FluentLogApiStub atDebug() {
436455
if (isDebugEnabled()) {
437456
return makeLoggingEventBuilder(DEBUG);
438457
} else {
439458
return NOPLoggingEventBuilder.singleton();
440459
}
441460
}
442461

462+
default public void atDebug(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
463+
this.atLevel(DEBUG, eventBuilderConsumer);
464+
}
465+
443466
/**
444467
* Is the logger instance enabled for the INFO level?
445468
*
@@ -568,16 +591,19 @@ default public LoggingEventBuilder atDebug() {
568591
/**
569592
* Entry point for fluent-logging for {@link org.slf4j.event.Level#INFO} level.
570593
*
571-
* @return LoggingEventBuilder instance as appropriate for level INFO
594+
* @return FluentLogApiStub instance as appropriate for level INFO
572595
* @since 2.0
573596
*/
574-
default public LoggingEventBuilder atInfo() {
597+
default public FluentLogApiStub atInfo() {
575598
if (isInfoEnabled()) {
576599
return makeLoggingEventBuilder(INFO);
577600
} else {
578601
return NOPLoggingEventBuilder.singleton();
579602
}
580603
}
604+
default public void atInfo(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
605+
this.atLevel(INFO, eventBuilderConsumer);
606+
}
581607

582608
/**
583609
* Is the logger instance enabled for the WARN level?
@@ -708,16 +734,19 @@ default public LoggingEventBuilder atInfo() {
708734
/**
709735
* Entry point for fluent-logging for {@link org.slf4j.event.Level#WARN} level.
710736
*
711-
* @return LoggingEventBuilder instance as appropriate for level WARN
737+
* @return FluentLogApiStub instance as appropriate for level WARN
712738
* @since 2.0
713739
*/
714-
default public LoggingEventBuilder atWarn() {
740+
default public FluentLogApiStub atWarn() {
715741
if (isWarnEnabled()) {
716742
return makeLoggingEventBuilder(WARN);
717743
} else {
718744
return NOPLoggingEventBuilder.singleton();
719745
}
720746
}
747+
default public void atWarn(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
748+
this.atLevel(WARN, eventBuilderConsumer);
749+
}
721750

722751
/**
723752
* Is the logger instance enabled for the ERROR level?
@@ -849,15 +878,21 @@ default public LoggingEventBuilder atWarn() {
849878
/**
850879
* Entry point for fluent-logging for {@link org.slf4j.event.Level#ERROR} level.
851880
*
852-
* @return LoggingEventBuilder instance as appropriate for level ERROR
881+
* @return FluentLogApiStub instance as appropriate for level ERROR
853882
* @since 2.0
854883
*/
855-
default public LoggingEventBuilder atError() {
884+
default public FluentLogApiStub atError() {
856885
if (isErrorEnabled()) {
857886
return makeLoggingEventBuilder(ERROR);
858887
} else {
859888
return NOPLoggingEventBuilder.singleton();
860889
}
861890
}
862891

892+
default public void atError(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
893+
this.atLevel(ERROR, eventBuilderConsumer);
894+
}
895+
896+
897+
863898
}

slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@
2727
import java.lang.reflect.InvocationTargetException;
2828
import java.lang.reflect.Method;
2929
import java.util.Queue;
30+
import java.util.function.Consumer;
3031

3132
import org.slf4j.Logger;
3233
import org.slf4j.Marker;
3334
import org.slf4j.event.EventRecodingLogger;
3435
import org.slf4j.event.Level;
3536
import org.slf4j.event.LoggingEvent;
3637
import org.slf4j.event.SubstituteLoggingEvent;
38+
import org.slf4j.spi.FluentLogApiStub;
3739
import org.slf4j.spi.LoggingEventBuilder;
3840

3941
/**
@@ -69,15 +71,21 @@ public String getName() {
6971
}
7072

7173
@Override
72-
public LoggingEventBuilder makeLoggingEventBuilder(Level level) {
74+
public FluentLogApiStub makeLoggingEventBuilder(Level level) {
7375
return delegate().makeLoggingEventBuilder(level);
7476
}
7577

7678
@Override
77-
public LoggingEventBuilder atLevel(Level level) {
79+
public FluentLogApiStub atLevel(Level level) {
7880
return delegate().atLevel(level);
7981
}
80-
82+
83+
@Override
84+
public void atLevel(Level level, Consumer<LoggingEventBuilder> eventBuilderConsumer) {
85+
delegate().atLevel(level, eventBuilderConsumer);
86+
}
87+
88+
8189
@Override
8290
public boolean isEnabledForLevel(Level level) {
8391
return delegate().isEnabledForLevel(level);
@@ -142,10 +150,15 @@ public void trace(Marker marker, String msg, Throwable t) {
142150
}
143151

144152
@Override
145-
public LoggingEventBuilder atTrace() {
153+
public FluentLogApiStub atTrace() {
146154
return delegate().atTrace();
147155
}
148-
156+
157+
@Override
158+
public void atTrace(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
159+
delegate().atTrace(eventBuilderConsumer);
160+
}
161+
149162
@Override
150163
public boolean isDebugEnabled() {
151164
return delegate().isDebugEnabled();
@@ -207,10 +220,15 @@ public void debug(Marker marker, String msg, Throwable t) {
207220
}
208221

209222
@Override
210-
public LoggingEventBuilder atDebug() {
223+
public FluentLogApiStub atDebug() {
211224
return delegate().atDebug();
212225
}
213-
226+
227+
@Override
228+
public void atDebug(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
229+
delegate().atDebug(eventBuilderConsumer);
230+
}
231+
214232
@Override
215233
public boolean isInfoEnabled() {
216234
return delegate().isInfoEnabled();
@@ -273,11 +291,15 @@ public void info(Marker marker, String msg, Throwable t) {
273291
}
274292

275293
@Override
276-
public LoggingEventBuilder atInfo() {
294+
public FluentLogApiStub atInfo() {
277295
return delegate().atInfo();
278296
}
279297

280-
298+
@Override
299+
public void atInfo(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
300+
delegate().atInfo(eventBuilderConsumer);
301+
}
302+
281303
@Override
282304
public boolean isWarnEnabled() {
283305
return delegate().isWarnEnabled();
@@ -338,11 +360,15 @@ public void warn(Marker marker, String msg, Throwable t) {
338360
}
339361

340362
@Override
341-
public LoggingEventBuilder atWarn() {
363+
public FluentLogApiStub atWarn() {
342364
return delegate().atWarn();
343365
}
344366

345-
367+
@Override
368+
public void atWarn(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
369+
delegate().atWarn(eventBuilderConsumer);
370+
}
371+
346372

347373
@Override
348374
public boolean isErrorEnabled() {
@@ -405,10 +431,15 @@ public void error(Marker marker, String msg, Throwable t) {
405431
}
406432

407433
@Override
408-
public LoggingEventBuilder atError() {
434+
public FluentLogApiStub atError() {
409435
return delegate().atError();
410436
}
411-
437+
438+
@Override
439+
public void atError(Consumer<LoggingEventBuilder> eventBuilderConsumer) {
440+
delegate().atError(eventBuilderConsumer);
441+
}
442+
412443
@Override
413444
public boolean equals(Object o) {
414445
if (this == o)

slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.slf4j.event.Level;
1010
import org.slf4j.event.LoggingEvent;
1111

12-
public class DefaultLoggingEventBuilder implements LoggingEventBuilder, CallerBoundaryAware {
12+
public class DefaultLoggingEventBuilder implements FluentLogApiStub, LoggingEventBuilder, CallerBoundaryAware {
1313

1414
protected DefaultLoggingEvent loggingEvent;
1515
protected Logger logger;
@@ -19,6 +19,12 @@ public DefaultLoggingEventBuilder(Logger logger, Level level) {
1919
loggingEvent = new DefaultLoggingEvent(level, logger);
2020
}
2121

22+
@Override
23+
public DefaultLoggingEventBuilder setMessage(String message) {
24+
loggingEvent.setMessage(message);
25+
return this;
26+
}
27+
2228
/**
2329
* Add a marker to the current logging event being built.
2430
*
@@ -27,25 +33,25 @@ public DefaultLoggingEventBuilder(Logger logger, Level level) {
2733
* @param marker the marker to add
2834
*/
2935
@Override
30-
public LoggingEventBuilder addMarker(Marker marker) {
36+
public DefaultLoggingEventBuilder addMarker(Marker marker) {
3137
loggingEvent.addMarker(marker);
3238
return this;
3339
}
3440

3541
@Override
36-
public LoggingEventBuilder setCause(Throwable t) {
42+
public DefaultLoggingEventBuilder setCause(Throwable t) {
3743
loggingEvent.setThrowable(t);
3844
return this;
3945
}
4046

4147
@Override
42-
public LoggingEventBuilder addArgument(Object p) {
48+
public DefaultLoggingEventBuilder addArgument(Object p) {
4349
loggingEvent.addArgument(p);
4450
return this;
4551
}
4652

4753
@Override
48-
public LoggingEventBuilder addArgument(Supplier<?> objectSupplier) {
54+
public DefaultLoggingEventBuilder addArgument(Supplier<?> objectSupplier) {
4955
loggingEvent.addArgument(objectSupplier.get());
5056
return this;
5157
}
@@ -92,7 +98,11 @@ public void log(Supplier<String> messageSupplier) {
9298
log(messageSupplier.get());
9399
}
94100
}
95-
101+
102+
public void log() {
103+
log(loggingEvent);
104+
}
105+
96106
protected void log(LoggingEvent aLoggingEvent) {
97107
if (logger instanceof LoggingEventAware) {
98108
((LoggingEventAware) logger).log(aLoggingEvent);
@@ -183,13 +193,13 @@ private String mergeMarkersAndKeyValuePairs(LoggingEvent aLoggingEvent, String m
183193

184194

185195
@Override
186-
public LoggingEventBuilder addKeyValue(String key, Object value) {
196+
public DefaultLoggingEventBuilder addKeyValue(String key, Object value) {
187197
loggingEvent.addKeyValue(key, value);
188198
return this;
189199
}
190200

191201
@Override
192-
public LoggingEventBuilder addKeyValue(String key, Supplier<Object> value) {
202+
public DefaultLoggingEventBuilder addKeyValue(String key, Supplier<Object> value) {
193203
loggingEvent.addKeyValue(key, value.get());
194204
return this;
195205
}

0 commit comments

Comments
 (0)