Skip to content

Commit

Permalink
+ using SynchronousQueue in BufferedStandardOutput when buffer size is 0
Browse files Browse the repository at this point in the history
+ synchronized out stream batch flush
+ internal rename
  • Loading branch information
q3769 committed May 4, 2023
1 parent 6986409 commit f568957
Show file tree
Hide file tree
Showing 31 changed files with 136 additions and 131 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

<groupId>io.github.elf4j</groupId>
<artifactId>elf4j-engine</artifactId>
<version>7.0.2</version>
<version>7.0.3</version>
<packaging>jar</packaging>
<name>elf4j-engine</name>
<description>A stand-alone Java log engine implementing the ELF4J (Easy Logging Facade for Java) API</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@
/**
*
*/
public class BufferingLogServiceDispatchingThread implements LogServiceDispatchingThread {
public class BufferingLogServiceThread implements LogServiceThread {
private static final int DEFAULT_FRONT_BUFFER_CAPACITY = 262144;
private final ExecutorService executorService;

/**
* @param bufferCapacity
* async work queue capacity for log entry tasks
* async work queue capacity for log events
*/
public BufferingLogServiceDispatchingThread(Integer bufferCapacity) {
public BufferingLogServiceThread(Integer bufferCapacity) {
bufferCapacity = bufferCapacity == null ? DEFAULT_FRONT_BUFFER_CAPACITY : bufferCapacity;
InternalLogger.INSTANCE.log(Level.INFO, "Service thread buffer capacity: " + bufferCapacity);
this.executorService = new ThreadPoolExecutor(1,
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/elf4j/engine/service/DispatchingLogService.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,20 +72,20 @@ public void log(@NonNull NativeLogger nativeLogger,
if (!logServiceConfiguration.isEnabled(nativeLogger)) {
return;
}
LogEntry.LogEntryBuilder logEntryBuilder = LogEntry.builder()
LogEvent.LogEventBuilder logEventBuilder = LogEvent.builder()
.nativeLogger(nativeLogger)
.throwable(throwable)
.message(message)
.arguments(arguments);
if (this.includeCallerDetail()) {
logEntryBuilder.callerStack(new Throwable().getStackTrace()).serviceInterfaceClass(serviceInterfaceClass);
logEventBuilder.callerStack(new Throwable().getStackTrace()).serviceInterfaceClass(serviceInterfaceClass);
}
if (this.includeCallerThread()) {
Thread callerThread = Thread.currentThread();
logEntryBuilder.callerThread(new LogEntry.ThreadValue(callerThread.getName(), callerThread.getId()));
logEventBuilder.callerThread(new LogEvent.ThreadValue(callerThread.getName(), callerThread.getId()));
}
this.logServiceConfiguration.getLogServiceDispatchingThread()
.execute(() -> this.logServiceConfiguration.getLogServiceWriter().write(logEntryBuilder.build()));
this.logServiceConfiguration.getLogServiceThread()
.execute(() -> this.logServiceConfiguration.getLogServiceWriter().write(logEventBuilder.build()));
}

private static class Configuration {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@
import java.util.function.Supplier;

/**
* Source content data to be rendered to a final log message
* Source data to be rendered to a final log message
*/
@Value
@Builder
public class LogEntry {
public class LogEvent {
private static final int ADDITIONAL_STRING_BUILDER_CAPACITY = 32;
@NonNull NativeLogger nativeLogger;
@NonNull Instant timestamp = Instant.now();
Expand Down
7 changes: 2 additions & 5 deletions src/main/java/elf4j/engine/service/LogServiceManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,10 @@ public void stopAll() {
}

private void stopOutput() {
stoppables.stream()
.filter(s -> !(s instanceof LogServiceDispatchingThread))
.parallel()
.forEach(Stoppable::stop);
stoppables.stream().filter(s -> !(s instanceof LogServiceThread)).parallel().forEach(Stoppable::stop);
}

private void stopService() {
stoppables.stream().filter(LogServiceDispatchingThread.class::isInstance).parallel().forEach(Stoppable::stop);
stoppables.stream().filter(LogServiceThread.class::isInstance).parallel().forEach(Stoppable::stop);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,5 @@
/**
*
*/
public interface LogServiceDispatchingThread extends Executor, Stoppable {
public interface LogServiceThread extends Executor, Stoppable {
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
package elf4j.engine.service.configuration;

import elf4j.engine.NativeLogger;
import elf4j.engine.service.LogServiceDispatchingThread;
import elf4j.engine.service.LogServiceThread;
import elf4j.engine.service.writer.LogWriter;
import elf4j.engine.service.writer.StandardOutput;

Expand Down Expand Up @@ -55,9 +55,9 @@ public interface LogServiceConfiguration {
boolean isEnabled(NativeLogger nativeLogger);

/**
* @return async executor for log entry tasks
* @return async executor for log event processing
*/
LogServiceDispatchingThread getLogServiceDispatchingThread();
LogServiceThread getLogServiceThread();

/**
* @return buffered standard out stream writer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@

import elf4j.Level;
import elf4j.engine.NativeLogger;
import elf4j.engine.service.BufferingLogServiceDispatchingThread;
import elf4j.engine.service.LogServiceDispatchingThread;
import elf4j.engine.service.BufferingLogServiceThread;
import elf4j.engine.service.LogServiceManager;
import elf4j.engine.service.LogServiceThread;
import elf4j.engine.service.util.PropertiesUtils;
import elf4j.engine.service.writer.BufferedStandardOutput;
import elf4j.engine.service.writer.LogWriter;
Expand All @@ -53,7 +53,7 @@ public class RefreshableLogServiceConfiguration implements LogServiceConfigurati
private boolean noop;
private CallerLevels callerLevels;
private Map<NativeLogger, Boolean> loggerEnablementCache;
private LogServiceDispatchingThread logServiceDispatchingThread;
private LogServiceThread logServiceThread;
private StandardOutput standardOutput;
private LogWriter logServiceWriter;

Expand Down Expand Up @@ -90,8 +90,8 @@ public boolean isEnabled(NativeLogger nativeLogger) {
}

@Override
public LogServiceDispatchingThread getLogServiceDispatchingThread() {
return this.logServiceDispatchingThread;
public LogServiceThread getLogServiceThread() {
return this.logServiceThread;
}

@Override
Expand Down Expand Up @@ -127,8 +127,7 @@ private void parse(@Nullable Properties properties) {
}
this.callerLevels = CallerLevels.from(properties);
this.loggerEnablementCache = new ConcurrentHashMap<>();
this.logServiceDispatchingThread =
new BufferingLogServiceDispatchingThread(PropertiesUtils.getAsInteger("buffer.front", properties));
this.logServiceThread = new BufferingLogServiceThread(PropertiesUtils.getAsInteger("buffer.front", properties));
this.standardOutput = new BufferedStandardOutput(properties.getProperty("stream"),
PropertiesUtils.getAsInteger("buffer.back", properties));
this.logServiceWriter = WriterGroup.from(this);
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/elf4j/engine/service/pattern/ClassPattern.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

package elf4j.engine.service.pattern;

import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import lombok.NonNull;
import lombok.Value;

Expand Down Expand Up @@ -70,8 +70,8 @@ public boolean includeCallerThread() {
}

@Override
public void renderTo(@NonNull LogEntry logEntry, StringBuilder target) {
String fullName = logEntry.getCallerClassName();
public void render(@NonNull LogEvent logEvent, StringBuilder target) {
String fullName = logEvent.getCallerClassName();
switch (classDisplayOption) {
case FULL:
target.append(fullName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

package elf4j.engine.service.pattern;

import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import lombok.NonNull;
import lombok.Value;

Expand Down Expand Up @@ -60,7 +60,7 @@ public boolean includeCallerThread() {
}

@Override
public void renderTo(@NonNull LogEntry logEntry, @NonNull StringBuilder target) {
target.append(logEntry.getCallerDetail().getFileName());
public void render(@NonNull LogEvent logEvent, @NonNull StringBuilder target) {
target.append(logEvent.getCallerDetail().getFileName());
}
}
28 changes: 14 additions & 14 deletions src/main/java/elf4j/engine/service/pattern/JsonPattern.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import com.dslplatform.json.JsonWriter;
import com.dslplatform.json.PrettifyOutputStream;
import com.dslplatform.json.runtime.Settings;
import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import elf4j.engine.service.util.StackTraceUtils;
import lombok.Builder;
import lombok.NonNull;
Expand Down Expand Up @@ -104,9 +104,9 @@ public boolean includeCallerThread() {
}

@Override
public void renderTo(LogEntry logEntry, StringBuilder target) {
public void render(LogEvent logEvent, StringBuilder target) {
jsonWriter.reset();
jsonWriter.serializeObject(JsonLogEntry.from(logEntry, this));
jsonWriter.serializeObject(JsonLogEntry.from(logEvent, this));
if (!this.prettyPrint) {
target.append(jsonWriter);
return;
Expand All @@ -127,21 +127,21 @@ static class JsonLogEntry {
OffsetDateTime timestamp;
String level;
String callerClass;
LogEntry.ThreadValue callerThread;
LogEntry.StackFrameValue callerDetail;
LogEvent.ThreadValue callerThread;
LogEvent.StackFrameValue callerDetail;
CharSequence message;
CharSequence exception;

static JsonLogEntry from(@NonNull LogEntry logEntry, @NonNull JsonPattern jsonPattern) {
static JsonLogEntry from(@NonNull LogEvent logEvent, @NonNull JsonPattern jsonPattern) {
return JsonLogEntry.builder()
.timestamp(OffsetDateTime.ofInstant(logEntry.getTimestamp(), ZoneId.systemDefault()))
.callerClass(jsonPattern.includeCallerDetail ? null : logEntry.getCallerClassName())
.level(logEntry.getNativeLogger().getLevel().name())
.callerThread(jsonPattern.includeCallerThread ? logEntry.getCallerThread() : null)
.callerDetail(jsonPattern.includeCallerDetail ? logEntry.getCallerDetail() : null)
.message(logEntry.getResolvedMessage())
.exception(logEntry.getThrowable() == null ? null :
StackTraceUtils.getTraceAsBuffer(logEntry.getThrowable()))
.timestamp(OffsetDateTime.ofInstant(logEvent.getTimestamp(), ZoneId.systemDefault()))
.callerClass(jsonPattern.includeCallerDetail ? null : logEvent.getCallerClassName())
.level(logEvent.getNativeLogger().getLevel().name())
.callerThread(jsonPattern.includeCallerThread ? logEvent.getCallerThread() : null)
.callerDetail(jsonPattern.includeCallerDetail ? logEvent.getCallerDetail() : null)
.message(logEvent.getResolvedMessage())
.exception(logEvent.getThrowable() == null ? null :
StackTraceUtils.getTraceAsBuffer(logEvent.getThrowable()))
.build();
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/elf4j/engine/service/pattern/LevelPattern.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

package elf4j.engine.service.pattern;

import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import lombok.NonNull;
import lombok.Value;

Expand Down Expand Up @@ -69,8 +69,8 @@ public boolean includeCallerThread() {
}

@Override
public void renderTo(@NonNull LogEntry logEntry, StringBuilder target) {
String level = logEntry.getNativeLogger().getLevel().name();
public void render(@NonNull LogEvent logEvent, StringBuilder target) {
String level = logEvent.getNativeLogger().getLevel().name();
if (displayLength == UNSPECIFIED) {
target.append(level);
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

package elf4j.engine.service.pattern;

import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import lombok.NonNull;
import lombok.Value;

Expand Down Expand Up @@ -60,7 +60,7 @@ public boolean includeCallerThread() {
}

@Override
public void renderTo(@NonNull LogEntry logEntry, @NonNull StringBuilder target) {
target.append(logEntry.getCallerDetail().getLineNumber());
public void render(@NonNull LogEvent logEvent, @NonNull StringBuilder target) {
target.append(logEvent.getCallerDetail().getLineNumber());
}
}
8 changes: 4 additions & 4 deletions src/main/java/elf4j/engine/service/pattern/LogPattern.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

package elf4j.engine.service.pattern;

import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import elf4j.engine.service.writer.PerformanceSensitive;

/**
Expand All @@ -34,13 +34,13 @@
public interface LogPattern extends PerformanceSensitive {

/**
* Extracts the content of particular interest to this log pattern instance from the specified log entry, and
* Extracts the content of particular interest to this log pattern instance from the specified log event, and
* appends the result to the specified target aggregator of the final log message
*
* @param logEntry
* @param logEvent
* entire log content data source to render
* @param target
* logging text aggregator of the final log message
*/
void renderTo(LogEntry logEntry, StringBuilder target);
void render(LogEvent logEvent, StringBuilder target);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

package elf4j.engine.service.pattern;

import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import elf4j.engine.service.util.StackTraceUtils;
import lombok.NonNull;
import lombok.Value;
Expand Down Expand Up @@ -61,9 +61,9 @@ public boolean includeCallerThread() {
}

@Override
public void renderTo(@NonNull LogEntry logEntry, @NonNull StringBuilder target) {
target.append(logEntry.getResolvedMessage());
Throwable t = logEntry.getThrowable();
public void render(@NonNull LogEvent logEvent, @NonNull StringBuilder target) {
target.append(logEvent.getResolvedMessage());
Throwable t = logEvent.getThrowable();
if (t == null) {
return;
}
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/elf4j/engine/service/pattern/MethodPattern.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

package elf4j.engine.service.pattern;

import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import lombok.NonNull;
import lombok.Value;

Expand Down Expand Up @@ -60,7 +60,7 @@ public boolean includeCallerThread() {
}

@Override
public void renderTo(@NonNull LogEntry logEntry, @NonNull StringBuilder target) {
target.append(logEntry.getCallerDetail().getMethodName());
public void render(@NonNull LogEvent logEvent, @NonNull StringBuilder target) {
target.append(logEvent.getCallerDetail().getMethodName());
}
}
8 changes: 4 additions & 4 deletions src/main/java/elf4j/engine/service/pattern/PatternGroup.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

package elf4j.engine.service.pattern;

import elf4j.engine.service.LogEntry;
import elf4j.engine.service.LogEvent;
import lombok.NonNull;
import lombok.Value;

Expand All @@ -42,7 +42,7 @@ public class PatternGroup implements LogPattern {
/**
* @param pattern
* entire layout pattern text from configuration
* @return composite pattern object for the entire log entry's output layout
* @return composite pattern object for the entire final log message output layout
*/
@Nonnull
public static PatternGroup from(@NonNull String pattern) {
Expand All @@ -60,9 +60,9 @@ public boolean includeCallerThread() {
}

@Override
public void renderTo(LogEntry logEntry, StringBuilder target) {
public void render(LogEvent logEvent, StringBuilder target) {
for (LogPattern pattern : patterns) {
pattern.renderTo(logEntry, target);
pattern.render(logEvent, target);
}
}
}
Loading

0 comments on commit f568957

Please sign in to comment.