diff --git a/loki-log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/AppenderLogic.java b/loki-log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/AppenderLogic.java index 5dbc2d5..2b6c369 100644 --- a/loki-log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/AppenderLogic.java +++ b/loki-log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/AppenderLogic.java @@ -8,6 +8,7 @@ import pl.tkowalcz.tjahzi.TjahziLogger; import java.io.Serializable; import java.nio.ByteBuffer; +import java.util.Collections; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; @@ -17,18 +18,23 @@ public class AppenderLogic implements BiConsumer { protected static final org.apache.logging.log4j.Logger LOGGER = StatusLogger.getLogger(); private final LoggingSystem loggingSystem; - private final TjahziLogger logger; + private final String logLevelLabel; private final Map lokiLabels; + private final TjahziLogger logger; + public AppenderLogic( LoggingSystem loggingSystem, + String logLevelLabel, Map lokiLabels ) { this.loggingSystem = loggingSystem; - logger = loggingSystem.createLogger(); - this.lokiLabels = lokiLabels; + this.lokiLabels = Collections.unmodifiableMap(lokiLabels); + this.logLevelLabel = logLevelLabel; + + logger = loggingSystem.createLogger(); } public void append( @@ -51,9 +57,13 @@ public class AppenderLogic implements BiConsumer { @Override public void accept(LogEvent event, ByteBuffer byteBuffer) { + String logLevel = event.getLevel().toString(); + logger.log( event.getTimeMillis(), lokiLabels, + logLevelLabel, + logLevel, byteBuffer ); } diff --git a/loki-log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/LokiAppender.java b/loki-log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/LokiAppender.java index 53cb9bc..bfc6110 100644 --- a/loki-log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/LokiAppender.java +++ b/loki-log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/LokiAppender.java @@ -68,6 +68,9 @@ public class LokiAppender extends AbstractAppender { @PluginBuilderAttribute private boolean useOffHeapBuffer = true; + @PluginBuilderAttribute + private String logLevelLabel; + @PluginElement("Headers") private Header[] headers; @@ -118,6 +121,7 @@ public class LokiAppender extends AbstractAppender { getFilter(), isIgnoreExceptions(), getPropertyArray(), + logLevelLabel, lokiLabels, loggingSystem ); @@ -186,6 +190,14 @@ public class LokiAppender extends AbstractAppender { this.useOffHeapBuffer = useOffHeapBuffer; } + public String getLogLevelLabel() { + return logLevelLabel; + } + + public void setLogLevelLabel(String logLevelLabel) { + this.logLevelLabel = logLevelLabel; + } + public void setHeaders(Header[] headers) { this.headers = headers; } @@ -216,6 +228,7 @@ public class LokiAppender extends AbstractAppender { Filter filter, boolean ignoreExceptions, Property[] properties, + String logLevelLabel, Map lokiLabels, LoggingSystem loggingSystem) { super( @@ -230,6 +243,7 @@ public class LokiAppender extends AbstractAppender { this.loggingSystem = loggingSystem; this.appenderLogic = new AppenderLogic( loggingSystem, + logLevelLabel, lokiLabels ); } diff --git a/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/BufferSizeConfigurationTest.java b/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/BufferSizeConfigurationTest.java index c160303..17ac79e 100644 --- a/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/BufferSizeConfigurationTest.java +++ b/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/BufferSizeConfigurationTest.java @@ -3,14 +3,12 @@ package pl.tkowalcz.tjahzi.log4j2; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; import org.junit.jupiter.api.Test; -import org.testcontainers.junit.jupiter.Testcontainers; import java.net.URI; import java.net.URISyntaxException; import static org.assertj.core.api.Assertions.assertThat; -@Testcontainers class BufferSizeConfigurationTest { @Test diff --git a/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LogLevelLabelConfigurationTest.java b/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LogLevelLabelConfigurationTest.java new file mode 100644 index 0000000..36dddb2 --- /dev/null +++ b/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LogLevelLabelConfigurationTest.java @@ -0,0 +1,130 @@ +package pl.tkowalcz.tjahzi.log4j2; + +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import io.restassured.parsing.Parser; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.awaitility.Awaitility; +import org.awaitility.Durations; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.net.URI; +import java.net.URISyntaxException; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.nullValue; + +@Testcontainers +class LogLevelLabelConfigurationTest { + + @Container + public GenericContainer loki = new GenericContainer("grafana/loki:latest") + .withCommand("-config.file=/etc/loki-config.yaml") + .withClasspathResourceMapping("loki-config.yaml", + "/etc/loki-config.yaml", + BindMode.READ_ONLY) + .waitingFor( + Wait.forHttp("/ready") + .forPort(3100) + ) + .withExposedPorts(3100); + + @Test + void shouldWorkWIthNoLogLevelConfigured() throws URISyntaxException { + // Given + System.setProperty("loki.host", loki.getHost()); + System.setProperty("loki.port", loki.getFirstMappedPort().toString()); + + URI uri = getClass() + .getClassLoader() + .getResource("appender-test-with-log-label-unset.xml") + .toURI(); + + ((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)) + .setConfigLocation(uri); + + // When + Logger logger = LogManager.getLogger(LokiAppenderTest.class); + logger.info("Test"); + + // Then + RestAssured.port = loki.getFirstMappedPort(); + RestAssured.baseURI = "http://" + loki.getHost(); + RestAssured.registerParser("text/plain", Parser.JSON); + + Awaitility + .await() + .atMost(Durations.TEN_SECONDS) + .pollInterval(Durations.ONE_SECOND) + .ignoreExceptions() + .untilAsserted(() -> { + given() + .contentType(ContentType.URLENC) + .urlEncodingEnabled(false) + .formParam("query=%7Bserver%3D%22127.0.0.1%22%7D") + .when() + .get("/loki/api/v1/query_range") + .then() + .log() + .all() + .statusCode(200) + .body("status", equalTo("success")) + .body("data.result.size()", equalTo(1)) + .body("data.result[0].stream.server", equalTo("127.0.0.1")) + .body("data.result[0].stream.log_level", nullValue()); + }); + } + + @Test + void shouldSendLogLevelAsConfigured() throws URISyntaxException { + // Given + System.setProperty("loki.host", loki.getHost()); + System.setProperty("loki.port", loki.getFirstMappedPort().toString()); + + URI uri = getClass() + .getClassLoader() + .getResource("appender-test-with-log-label-set.xml") + .toURI(); + + ((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)) + .setConfigLocation(uri); + + // When + Logger logger = LogManager.getLogger(LokiAppenderTest.class); + logger.info("Test"); + + // Then + RestAssured.port = loki.getFirstMappedPort(); + RestAssured.baseURI = "http://" + loki.getHost(); + RestAssured.registerParser("text/plain", Parser.JSON); + + Awaitility + .await() + .atMost(Durations.TEN_SECONDS) + .pollInterval(Durations.ONE_SECOND) + .ignoreExceptions() + .untilAsserted(() -> { + given() + .contentType(ContentType.URLENC) + .urlEncodingEnabled(false) + .formParam("query=%7Bserver%3D%22127.0.0.1%22%7D") + .when() + .get("/loki/api/v1/query_range") + .then() + .log() + .all() + .statusCode(200) + .body("status", equalTo("success")) + .body("data.result.size()", equalTo(1)) + .body("data.result[0].stream.server", equalTo("127.0.0.1")) + .body("data.result[0].stream.log_level", equalTo("INFO")); + }); + } +} diff --git a/loki-log4j2-appender/src/test/resources/appender-test-with-log-label-set.xml b/loki-log4j2-appender/src/test/resources/appender-test-with-log-label-set.xml new file mode 100644 index 0000000..eb1ffa9 --- /dev/null +++ b/loki-log4j2-appender/src/test/resources/appender-test-with-log-label-set.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + ${sys:loki.host} + ${sys:loki.port} + + log_level + + + + %X{tid} [%t] %d{MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n%exception{full} + + +
+