Skip to content

Commit

Permalink
Merge pull request #14 from GoodforGod/dev
Browse files Browse the repository at this point in the history
[2.0.0]
  • Loading branch information
GoodforGod authored Aug 18, 2023
2 parents e38932a + 3b14fe8 commit 5dc0075
Show file tree
Hide file tree
Showing 20 changed files with 263 additions and 190 deletions.
38 changes: 26 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,18 @@ And more...

[**Gradle**](https://mvnrepository.com/artifact/io.goodforgod/slf4j-simple-logger)
```groovy
implementation "io.goodforgod:slf4j-simple-logger:1.0.0"
implementation "io.goodforgod:slf4j-simple-logger:2.0.0"
```

[**Maven**](https://mvnrepository.com/artifact/io.goodforgod/slf4j-simple-logger)
```xml
<dependency>
<groupId>io.goodforgod</groupId>
<artifactId>slf4j-simple-logger</artifactId>
<version>1.0.0</version>
<version>2.0.0</version>
</dependency>
```

Based on SLF4J 1.7.36

## Content

- [Logging example](#logging-example)
Expand All @@ -56,32 +54,37 @@ Based on SLF4J 1.7.36
- [Callable and Supplier](#callable-and-supplier)
- [Logger level change](#logger-level-change)
- [Configuration](#configuration)
- [Compatability](#slf4j-compatability)

## Logging example

### Text format

Below is example of logged message in text format:
```java
logger.debug("Message is printed for this logger");
Marker myMarker = MarkerFactory.getMarker("my_marker");
myMarker.add(MarkerFactory.getMarker("my_marker_ref"));
logger.debug(myMarker, "Message is printed for this logger");
```

Result logged message:
```text
Date Time Implementation Log Level Environment variables Thread Logger Name Log Message
| | | | | | |
___________|__________ ______|_______ __|__ ___________________|______________ __|__ ___________|___________ ________________|________________
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
2022-02-23T15:43:40.331 [0.9.0-SNAPSHOT] [DEBUG] [SESSION=Console, PROCESSOR_LEVEL=6] [main] io.goodforgod.Application - Message is printed for this logger
Date Time Implementation Log Level Markers Environment variables Thread Logger Name Log Message
| | | | | | | |
___________|__________ ______|_______ __|__ ________________|______________ __________________|_______________ __|__ ___________|___________ ________________|________________
| | | | | | | | | | | | | | |
| | | | | | | | | | | | | | |
2022-02-23T15:43:40.331 [0.9.0-SNAPSHOT] [DEBUG] [markers=my_marker,my_marker_ref] [SESSION=Console, PROCESSOR_LEVEL=6] [main] io.goodforgod.Application - Message is printed for this logger
```

### Json format

Below is example of logged message in json format:
```java
Exception e = new RuntimeException();
logger.debug("Message is printed for this logger", e);
Marker myMarker = MarkerFactory.getMarker("my_marker");
myMarker.add(MarkerFactory.getMarker("my_marker_ref"));
logger.debug(myMarker, "Message is printed for this logger", e);
```

Result logged message:
Expand All @@ -92,6 +95,7 @@ Result logged message:
"level": "DEBUG",
"thread": "main",
"logger": "io.goodforgod.Application",
"markers": ["my_marker", "my_marker_ref"],
"environment": [
{
"name": "SESSION",
Expand Down Expand Up @@ -254,6 +258,8 @@ org.slf4j.simpleLogger.showImplementationVersion=false
org.slf4j.simpleLogger.levelInBrackets=true
# Set to true if to show current thread in output. (default false)
org.slf4j.simpleLogger.showThreadName=false
# Set to true if to show marker parameter values. (default false)
org.slf4j.simpleLogger.showMarkers=false
# Set to true to show only class name in output. (default false)
org.slf4j.simpleLogger.showShortLogName=false
# Set to true if to show full class name in output (package + class name). (default true)
Expand Down Expand Up @@ -334,6 +340,8 @@ org.slf4j.simpleLogger.showImplementationVersion=false
org.slf4j.simpleLogger.levelInBrackets=true
# Set to true if to show current thread in output. (default false)
org.slf4j.simpleLogger.showThreadName=false
# Set to true if to show marker parameter values. (default false)
org.slf4j.simpleLogger.showMarkers=false
# Set to true to show only class name in output. (default false)
org.slf4j.simpleLogger.showShortLogName=false
# Set to true if to show full class name in output (package + class name). (default true)
Expand Down Expand Up @@ -362,6 +370,12 @@ org.slf4j.simpleLogger.logFileError=System.out
org.slf4j.simpleLogger.log.path.to.class=WARN
```

## SLF4J Compatability

Starting from version *2.0.0* library ships for [SLF4J 2.0.0+](https://www.slf4j.org/manual.html). (Based on SLF4J 2.0.7+)

Starting from version *1.0.0* library ships for [SLF4J 1.7.5+](https://www.slf4j.org/manual.html). (Based on SLF4J 1.7.36+)

## License

This project licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11

dependencies {
annotationProcessor "io.goodforgod:graalvm-hint-processor:1.0.0"
compileOnly "io.goodforgod:graalvm-hint-annotations:1.0.0"
annotationProcessor "io.goodforgod:graalvm-hint-processor:1.1.0"
compileOnly "io.goodforgod:graalvm-hint-annotations:1.1.0"

api "org.slf4j:slf4j-api:1.7.36"
api "org.slf4j:slf4j-api:2.0.7"

testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.9.3"
testImplementation "org.junit.jupiter:junit-jupiter-api:5.9.3"
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
groupId=io.goodforgod
artifactId=slf4j-simple-logger
artifactVersion=1.0.0-SNAPSHOT
artifactVersion=2.0.0-SNAPSHOT


##### GRADLE #####
Expand Down
15 changes: 8 additions & 7 deletions src/main/java/io/goodforgod/slf4j/simplelogger/GraalVMHint.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import io.goodforgod.graalvm.hint.annotation.InitializationHint;
import org.slf4j.LoggerFactory;
import org.slf4j.impl.StaticLoggerBinder;
import org.slf4j.impl.StaticMDCBinder;
import org.slf4j.impl.StaticMarkerBinder;
import org.slf4j.LoggerFactoryFriend;
import org.slf4j.MDC;
import org.slf4j.MarkerFactory;

/**
* @author Anton Kurako (GoodforGod)
Expand All @@ -13,15 +13,16 @@
@InitializationHint(value = InitializationHint.InitPhase.BUILD,
types = {
LoggerFactory.class,
StaticLoggerBinder.class,
StaticMarkerBinder.class,
StaticMDCBinder.class,
LoggerFactoryFriend.class,
MarkerFactory.class,
MDC.class,
MDC.MDCCloseable.class,
SimpleLoggerConfiguration.class,
SimpleLogger.class,
SimpleLoggerLayouts.class,
JsonLoggerLayouts.class,
},
typeNames = "io.goodforgod.slf4j.simplelogger")
typeNames = { "io.goodforgod.slf4j.simplelogger", "org.slf4j.event", "org.slf4j.helpers", "org.slf4j.spi" })
final class GraalVMHint {

private GraalVMHint() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.slf4j.Marker;

/**
* JSON logger layout implementations
Expand Down Expand Up @@ -130,6 +131,35 @@ public int order() {
}
}

static final class MarkerLayout implements Layout {

@Override
public void print(SimpleLoggingEvent event) {
event.append("\"markers\":[");
if (event.marker() != null) {
event.append('\"');
event.append(event.marker().getName());
event.append('\"');
renderMarkers(event, event.marker());
}
event.append(']');
}

private static void renderMarkers(SimpleLoggingEvent event, Marker marker) {
marker.iterator().forEachRemaining(m -> {
event.append(",\"");
event.append(m.getName());
event.append("\"");
renderMarkers(event, m);
});
}

@Override
public int order() {
return SimpleLoggerLayouts.LayoutOrder.MARKER.ordinal();
}
}

static final class EnvironmentOnStartLayout implements Layout {

private final SimpleLoggerConfiguration configuration;
Expand Down
32 changes: 26 additions & 6 deletions src/main/java/io/goodforgod/slf4j/simplelogger/SimpleLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@

import java.util.List;
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.event.Level;
import org.slf4j.event.LoggingEvent;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MarkerIgnoringBase;
import org.slf4j.helpers.LegacyAbstractLogger;

/**
* <p>
Expand Down Expand Up @@ -116,7 +117,7 @@
* @author Anton Kurako (GoodforGod)
* @since 09.10.2021
*/
public final class SimpleLogger extends MarkerIgnoringBase {
public final class SimpleLogger extends LegacyAbstractLogger {

static final int LOG_LEVEL_OFF = Level.ERROR.toInt() + 10;

Expand Down Expand Up @@ -187,17 +188,21 @@ private String recursivelyComputeLevelString() {
return levelString;
}

private void log(Level level, String message, Throwable throwable) {
log(level, message, null, throwable);
}

/**
* This is our internal implementation for logging regular (non-parameterized) log messages.
*
* @param level One of the LOG_LEVEL_XXX constants defining the log level
* @param message The message itself
* @param throwable The exception whose stack trace should be logged
*/
private void log(Level level, String message, Throwable throwable) {
private void log(Level level, String message, Marker marker, Throwable throwable) {
final SimpleLoggingEvent event = (CONFIG.isShowShortLogName())
? new SimpleLoggingEvent(logNameShort, level, message, throwable)
: new SimpleLoggingEvent(logName, level, message, throwable);
? new SimpleLoggingEvent(logNameShort, level, message, marker, throwable)
: new SimpleLoggingEvent(logName, level, message, marker, throwable);

final List<Layout> layouts = CONFIG.getLayouts();
for (Layout layout : layouts) {
Expand Down Expand Up @@ -253,7 +258,7 @@ private void formatAndLog(Level level, String format, Object... arguments) {
return;
}

FormattingTuple tp = MessageFormatter.formatArray(format, arguments);
final FormattingTuple tp = MessageFormatter.formatArray(format, arguments);
log(level, tp.getMessage(), tp.getThrowable());
}

Expand All @@ -268,6 +273,21 @@ private boolean isLevelEnabled(Level logLevel) {
return (logLevel.toInt() >= currentLogLevel);
}

@Override
protected String getFullyQualifiedCallerName() {
return SimpleLogger.class.getName();
}

@Override
protected void handleNormalizedLoggingCall(Level level,
Marker marker,
String messagePattern,
Object[] arguments,
Throwable throwable) {
final FormattingTuple tp = MessageFormatter.formatArray(messagePattern, arguments);
log(level, tp.getMessage(), marker, throwable);
}

/**
* Are {@code trace} messages currently enabled?
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ final class SimpleLoggerConfiguration {
private static final boolean LEVEL_IN_BRACKETS_DEFAULT = true;
private static final boolean SHOW_THREAD_NAME_DEFAULT = false;
private static final boolean SHOW_LOG_NAME_DEFAULT = true;
private static final boolean SHOW_MARKERS_DEFAULT = false;
private static final boolean SHOW_IMPLEMENTATION_VERSION_DEFAULT = false;
private static final boolean SHOW_SHORT_LOG_NAME_DEFAULT = false;
private static final boolean SHOW_DATE_TIME_DEFAULT = true;
Expand All @@ -64,8 +65,12 @@ final class SimpleLoggerConfiguration {
private DateTimeOutputType dateTimeOutputType = DateTimeOutputType.DATE_TIME;
private DateTimeFormatter dateTimeFormatter;
private int defaultLogLevel = Level.INFO.toInt();
private boolean showDateTime = SHOW_DATE_TIME_DEFAULT;
private boolean showShortLogName = SHOW_SHORT_LOG_NAME_DEFAULT;
private boolean showLogName = SHOW_LOG_NAME_DEFAULT;
private boolean showThreadName = SHOW_THREAD_NAME_DEFAULT;
private boolean showLevelInBrackets = LEVEL_IN_BRACKETS_DEFAULT;
private boolean showMarker = SHOW_MARKERS_DEFAULT;
private Integer logNameLength;
private List<String> environments;
private boolean environmentShowName;
Expand Down Expand Up @@ -131,7 +136,11 @@ private void computeChangeableConfiguration() {
}

this.showShortLogName = getBooleanProperty(SHOW_SHORT_LOG_NAME, SHOW_SHORT_LOG_NAME_DEFAULT);
this.showDateTime = getBooleanProperty(SHOW_DATE_TIME, SHOW_DATE_TIME_DEFAULT);
this.showLogName = getBooleanProperty(SHOW_LOG_NAME, SimpleLoggerConfiguration.SHOW_LOG_NAME_DEFAULT);
this.showThreadName = getBooleanProperty(SHOW_THREAD_NAME, SHOW_THREAD_NAME_DEFAULT);
this.showLevelInBrackets = getBooleanProperty(LEVEL_IN_BRACKETS, LEVEL_IN_BRACKETS_DEFAULT);
this.showMarker = getBooleanProperty(SHOW_MARKERS, SHOW_MARKERS_DEFAULT);
this.logNameLength = getIntProperty(SHOW_LOG_NAME_LENGTH)
.filter(i -> i > 0)
.orElse(null);
Expand Down Expand Up @@ -322,7 +331,6 @@ private DateTimeFormatter getDateTimeFormatter(DateTimeOutputType dateTimeOutput

private List<Layout> computeTextLayouts() {
final List<Layout> loggerLayouts = new ArrayList<>();
final boolean showDateTime = getBooleanProperty(SHOW_DATE_TIME, SHOW_DATE_TIME_DEFAULT);
if (showDateTime) {
loggerLayouts.add(getDateTimeTextLayout(dateTimeOutputType));
}
Expand All @@ -335,19 +343,21 @@ private List<Layout> computeTextLayouts() {
loggerLayouts.add(new SimpleLoggerLayouts.ImplementationLayout(this));
}

final boolean showThreadName = getBooleanProperty(SHOW_THREAD_NAME, SHOW_THREAD_NAME_DEFAULT);
if (showThreadName) {
loggerLayouts.add(new SimpleLoggerLayouts.ThreadLayout());
}

if (showMarker) {
loggerLayouts.add(new SimpleLoggerLayouts.MarkerLayout());
}

if (environmentsOnStartText != null) {
loggerLayouts.add(new SimpleLoggerLayouts.EnvironmentOnStartLayout(this));
} else if (!environments.isEmpty()) {
loggerLayouts.add(new SimpleLoggerLayouts.EnvironmentLayout(this));
}

final boolean levelInBrackets = getBooleanProperty(LEVEL_IN_BRACKETS, LEVEL_IN_BRACKETS_DEFAULT);
if (levelInBrackets) {
if (showLevelInBrackets) {
loggerLayouts.add(new SimpleLoggerLayouts.LevelLayout("[TRACE] ", "[DEBUG] ", "[INFO] ", "[WARN] ", "[ERROR] "));
} else {
loggerLayouts.add(new SimpleLoggerLayouts.LevelLayout("TRACE ", "DEBUG ", "INFO ", "WARN ", "ERROR "));
Expand All @@ -367,7 +377,6 @@ private List<Layout> computeTextLayouts() {

private List<Layout> computeJsonLayouts() {
final List<Layout> loggerLayouts = new ArrayList<>();
final boolean showDateTime = getBooleanProperty(SHOW_DATE_TIME, SHOW_DATE_TIME_DEFAULT);
if (showDateTime) {
loggerLayouts.add(getDateTimeJsonLayout(dateTimeOutputType));
}
Expand All @@ -380,11 +389,14 @@ private List<Layout> computeJsonLayouts() {
loggerLayouts.add(new JsonLoggerLayouts.ImplementationLayout(this));
}

final boolean showThreadName = getBooleanProperty(SHOW_THREAD_NAME, SHOW_THREAD_NAME_DEFAULT);
if (showThreadName) {
loggerLayouts.add(new JsonLoggerLayouts.ThreadLayout());
}

if (showMarker) {
loggerLayouts.add(new JsonLoggerLayouts.MarkerLayout());
}

if (environmentsOnStartJson != null) {
loggerLayouts.add(new JsonLoggerLayouts.EnvironmentOnStartLayout(this));
} else if (!environments.isEmpty()) {
Expand Down
Loading

0 comments on commit 5dc0075

Please sign in to comment.