diff --git a/log4j2-appender/pom.xml b/log4j2-appender/pom.xml
index 1165b64..1010ed7 100644
--- a/log4j2-appender/pom.xml
+++ b/log4j2-appender/pom.xml
@@ -102,6 +102,12 @@
1.14.3
test
+
+ org.testcontainers
+ nginx
+ 1.14.3
+ test
+
diff --git a/log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderBuilder.java b/log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderBuilder.java
index e194e30..1518fe1 100644
--- a/log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderBuilder.java
+++ b/log4j2-appender/src/main/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderBuilder.java
@@ -4,7 +4,6 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.apache.logging.log4j.status.StatusLogger;
import pl.tkowalcz.tjahzi.LoggingSystem;
import pl.tkowalcz.tjahzi.TjahziInitializer;
@@ -48,6 +47,9 @@ public class LokiAppenderBuilder> extends Abstr
@PluginBuilderAttribute
private int port;
+ @PluginBuilderAttribute
+ private boolean useSSL;
+
@PluginBuilderAttribute
private String username;
@@ -103,6 +105,7 @@ public class LokiAppenderBuilder> extends Abstr
.withLogEndpoint(logEndpoint)
.withHost(host)
.withPort(port)
+ .withUseSSL(useSSL)
.withUsername(username)
.withPassword(password)
.withConnectionTimeoutMillis(connectTimeoutMillis)
@@ -174,6 +177,46 @@ public class LokiAppenderBuilder> extends Abstr
return host;
}
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getLogEndpoint() {
+ return logEndpoint;
+ }
+
+ public void setLogEndpoint(String logEndpoint) {
+ this.logEndpoint = logEndpoint;
+ }
+
+ public boolean isUseSSL() {
+ return useSSL;
+ }
+
+ public void setUseSSL(boolean useSSL) {
+ this.useSSL = useSSL;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
public int getConnectTimeoutMillis() {
return connectTimeoutMillis;
}
diff --git a/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/BufferSizeConfigurationTest.java b/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/BufferSizeConfigurationTest.java
index ce47eb7..91cd288 100644
--- a/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/BufferSizeConfigurationTest.java
+++ b/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/BufferSizeConfigurationTest.java
@@ -3,15 +3,13 @@ package pl.tkowalcz.tjahzi.log4j2;
import org.apache.logging.log4j.core.LoggerContext;
import org.junit.jupiter.api.Test;
-import java.net.URISyntaxException;
-
import static org.assertj.core.api.Assertions.assertThat;
import static pl.tkowalcz.tjahzi.log4j2.infra.IntegrationTest.loadConfig;
class BufferSizeConfigurationTest {
@Test
- void shouldUseDefaultWhenLogBufferSizeIsNotSetViaConfiguration() throws URISyntaxException {
+ void shouldUseDefaultWhenLogBufferSizeIsNotSetViaConfiguration() {
// When
LoggerContext context = loadConfig("appender-test-with-buffer-size-megabytes-unset.xml");
@@ -22,7 +20,7 @@ class BufferSizeConfigurationTest {
}
@Test
- void shouldSetLogBufferSizeViaConfiguration() throws URISyntaxException {
+ void shouldSetLogBufferSizeViaConfiguration() {
// When
LoggerContext context = loadConfig("appender-test-with-buffer-size-megabytes-set-to-64.xml");
diff --git a/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderHttpsCustomEndpointTest.java b/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderHttpsCustomEndpointTest.java
new file mode 100644
index 0000000..12cd200
--- /dev/null
+++ b/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderHttpsCustomEndpointTest.java
@@ -0,0 +1,75 @@
+package pl.tkowalcz.tjahzi.log4j2;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.testcontainers.containers.BindMode;
+import org.testcontainers.containers.NginxContainer;
+import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
+import org.testcontainers.junit.jupiter.Container;
+import pl.tkowalcz.tjahzi.log4j2.infra.IntegrationTest;
+import pl.tkowalcz.tjahzi.log4j2.infra.LokiAssert;
+
+import static org.hamcrest.CoreMatchers.*;
+
+class LokiAppenderHttpsCustomEndpointTest extends IntegrationTest {
+
+ @Container
+ public NginxContainer> nginx = new NginxContainer<>("nginx:latest")
+ .withNetwork(network)
+ .withClasspathResourceMapping("loki.reverse.nginx.conf",
+ "/etc/nginx/conf.d/loki.reverse.conf",
+ BindMode.READ_ONLY
+ )
+ .withClasspathResourceMapping("nginx/nginx-selfsigned.crt",
+ "/etc/nginx/nginx-selfsigned.crt",
+ BindMode.READ_ONLY
+ )
+ .withClasspathResourceMapping("nginx/nginx-selfsigned.key",
+ "/etc/nginx/nginx-selfsigned.key",
+ BindMode.READ_ONLY
+ )
+ .withClasspathResourceMapping("nginx/passwords",
+ "/etc/nginx/passwords",
+ BindMode.READ_ONLY
+ )
+ .waitingFor(new HttpWaitStrategy())
+ .withExposedPorts(81);
+
+ @Override
+ @BeforeEach
+ public void setUp() {
+ System.setProperty("loki.host", nginx.getHost());
+ System.setProperty("loki.port", nginx.getFirstMappedPort().toString());
+ }
+
+ @Test
+ void shouldSendData() {
+ // Given
+ loadConfig("appender-test-custom-endpoint-configuration.xml");
+ Logger logger = LogManager.getLogger(LokiAppenderHttpsCustomEndpointTest.class);
+
+ String expectedLogLine = "Hello World";
+
+ // When
+ logger.info(expectedLogLine);
+
+ // Then
+ LokiAssert.assertThat(loki)
+ .returns(response -> response
+ .body("data.result.size()", equalTo(1))
+ .body("data.result[0].stream.server", equalTo("127.0.0.1"))
+ .body(
+ "data.result.values",
+ hasItems(
+ hasItems(
+ hasItems(
+ containsString("INFO LokiAppenderHttpsCustomEndpointTest - " + expectedLogLine)
+ )
+ )
+ )
+ )
+ );
+ }
+}
diff --git a/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderHttpsUrlConnectionReverseProxyTest.java b/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderHttpsUrlConnectionReverseProxyTest.java
new file mode 100644
index 0000000..d5d2dd3
--- /dev/null
+++ b/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderHttpsUrlConnectionReverseProxyTest.java
@@ -0,0 +1,75 @@
+package pl.tkowalcz.tjahzi.log4j2;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.testcontainers.containers.BindMode;
+import org.testcontainers.containers.NginxContainer;
+import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
+import org.testcontainers.junit.jupiter.Container;
+import pl.tkowalcz.tjahzi.log4j2.infra.IntegrationTest;
+import pl.tkowalcz.tjahzi.log4j2.infra.LokiAssert;
+
+import static org.hamcrest.CoreMatchers.*;
+
+class LokiAppenderHttpsUrlConnectionReverseProxyTest extends IntegrationTest {
+
+ @Container
+ public NginxContainer> nginx = new NginxContainer<>("nginx:latest")
+ .withNetwork(network)
+ .withClasspathResourceMapping("loki.reverse.nginx.conf",
+ "/etc/nginx/conf.d/loki.reverse.conf",
+ BindMode.READ_ONLY
+ )
+ .withClasspathResourceMapping("nginx/nginx-selfsigned.crt",
+ "/etc/nginx/nginx-selfsigned.crt",
+ BindMode.READ_ONLY
+ )
+ .withClasspathResourceMapping("nginx/nginx-selfsigned.key",
+ "/etc/nginx/nginx-selfsigned.key",
+ BindMode.READ_ONLY
+ )
+ .withClasspathResourceMapping("nginx/passwords",
+ "/etc/nginx/passwords",
+ BindMode.READ_ONLY
+ )
+ .waitingFor(new HttpWaitStrategy())
+ .withExposedPorts(81);
+
+ @Override
+ @BeforeEach
+ public void setUp() {
+ System.setProperty("loki.host", nginx.getHost());
+ System.setProperty("loki.port", nginx.getFirstMappedPort().toString());
+ }
+
+ @Test
+ void shouldSendData() {
+ // Given
+ loadConfig("appender-test-url-configuration.xml");
+ Logger logger = LogManager.getLogger(LokiAppenderHttpsUrlConnectionReverseProxyTest.class);
+
+ String expectedLogLine = "Hello World";
+
+ // When
+ logger.info(expectedLogLine);
+
+ // Then
+ LokiAssert.assertThat(loki)
+ .returns(response -> response
+ .body("data.result.size()", equalTo(1))
+ .body("data.result[0].stream.server", equalTo("127.0.0.1"))
+ .body(
+ "data.result.values",
+ hasItems(
+ hasItems(
+ hasItems(
+ containsString("INFO LokiAppenderHttpsUrlConnectionReverseProxyTest - " + expectedLogLine)
+ )
+ )
+ )
+ )
+ );
+ }
+}
diff --git a/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/infra/IntegrationTest.java b/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/infra/IntegrationTest.java
index b2cf198..e6e1055 100644
--- a/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/infra/IntegrationTest.java
+++ b/log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/infra/IntegrationTest.java
@@ -6,6 +6,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.Network;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -17,8 +18,12 @@ import java.net.URL;
@Testcontainers
public class IntegrationTest {
+ public static Network network = Network.newNetwork();
+
@Container
public GenericContainer loki = new GenericContainer("grafana/loki:2.3.0")
+ .withNetwork(network)
+ .withNetworkAliases("loki")
.withCommand("-config.file=/etc/loki-config.yaml")
.withClasspathResourceMapping("loki-config.yaml",
"/etc/loki-config.yaml",
@@ -31,7 +36,7 @@ public class IntegrationTest {
.withExposedPorts(3100);
@BeforeEach
- void setUp() {
+ public void setUp() {
System.setProperty("loki.host", loki.getHost());
System.setProperty("loki.port", loki.getFirstMappedPort().toString());
}
diff --git a/log4j2-appender/src/test/resources/appender-test-custom-endpoint-configuration.xml b/log4j2-appender/src/test/resources/appender-test-custom-endpoint-configuration.xml
new file mode 100644
index 0000000..0024917
--- /dev/null
+++ b/log4j2-appender/src/test/resources/appender-test-custom-endpoint-configuration.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${sys:loki.host}
+ ${sys:loki.port}
+
+ true
+ /monitoring/loki/api/v1/push
+
+ tjahzi
+ tjahzi
+
+
+
+
+ [%t] %d{DEFAULT} %5p %c{1} - %m%n%exception{full}
+
+
+
+
+
+
+
diff --git a/log4j2-appender/src/test/resources/appender-test-url-configuration.xml b/log4j2-appender/src/test/resources/appender-test-url-configuration.xml
new file mode 100644
index 0000000..5dc2a2f
--- /dev/null
+++ b/log4j2-appender/src/test/resources/appender-test-url-configuration.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://${sys:loki.host}:${sys:loki.port}/monitoring/loki/api/v1/push
+
+ tjahzi
+ tjahzi
+
+
+
+ [%t] %d{DEFAULT} %5p %c{1} - %m%n%exception{full}
+
+
+
+
+
+
+
diff --git a/log4j2-appender/src/test/resources/loki.reverse.nginx.conf b/log4j2-appender/src/test/resources/loki.reverse.nginx.conf
new file mode 100644
index 0000000..91b7094
--- /dev/null
+++ b/log4j2-appender/src/test/resources/loki.reverse.nginx.conf
@@ -0,0 +1,12 @@
+server {
+ listen 81 ssl;
+ ssl_certificate nginx-selfsigned.crt;
+ ssl_certificate_key nginx-selfsigned.key;
+
+ location /monitoring/ {
+ proxy_pass http://loki:3100/;
+ }
+
+ auth_basic "loki auth";
+ auth_basic_user_file /etc/nginx/passwords;
+}
diff --git a/log4j2-appender/src/test/resources/nginx/nginx-selfsigned.crt b/log4j2-appender/src/test/resources/nginx/nginx-selfsigned.crt
new file mode 100644
index 0000000..07324e6
--- /dev/null
+++ b/log4j2-appender/src/test/resources/nginx/nginx-selfsigned.crt
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICljCCAX4CCQDDkzDNweN3/jANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJQ
+TDAeFw0yMjA1MDMyMjA0MzRaFw0yMzA1MDMyMjA0MzRaMA0xCzAJBgNVBAYTAlBM
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx6glTZOdvg9TbDu6fk/L
+pZkWFegPALIkCf+ckk+yDSpyg+kuD4XR96NdcxRrMfQBCJGfTBRnpEI4VyZD5aBf
+xRoqN6DwRrE8fN7r25C5wi3O7Xewz1NKmVnll+RnjZH84UuC3g+5RMVg7xDM8jrw
+pdQnw8EY2bBfT8G+1JLWdFBdQDByblMJv+w0LdisqbV0A/bTdLMD8a2Pw7lbciMC
+s0rrdlfcga0QsI7PsraOjVzjl29Cm09YNUjeiR4dD6ZNSAC73qdi1n9OPfrct648
+Q/kbR2jiwHzvnQUwj/UCKncs1Vxc84YDaCxiMQYyaHxvaukUFWzE3SLu/OKtpHcE
+7wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBBRVyWs2RLG3WJoqx7ArSXAg43uikv
+D7Tvo+ZIRuX7GRtQTk5N3nhyG5EVY85j9LX1MlaTkLeuAjHFuWjgRXe6cSFThnrA
+qZRMH19jIDlTsd1YOurGrNQCST6R6YJ3rrPrcRDuLow/nO+4hD903DzzuLSjqoWw
+TRIRwEcKuX/YrXX81/uFLEonuL97N4HkDnIhPZy/ndS8qAdrH6T47XZ6jh4WYInC
+q0FNEmIjbGgTqwOh5wARP83aR6azXpS8Wb6ms2LYBd1BDuoAkqX4Hw5/iHcsqBQ8
+UNp7qAH4UQj+cgUL0MQUL07NhJpbcAuAjz6iUXyFv/bb9WR2t2h2qLOu
+-----END CERTIFICATE-----
diff --git a/log4j2-appender/src/test/resources/nginx/nginx-selfsigned.key b/log4j2-appender/src/test/resources/nginx/nginx-selfsigned.key
new file mode 100644
index 0000000..f414efe
--- /dev/null
+++ b/log4j2-appender/src/test/resources/nginx/nginx-selfsigned.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHqCVNk52+D1Ns
+O7p+T8ulmRYV6A8AsiQJ/5yST7INKnKD6S4PhdH3o11zFGsx9AEIkZ9MFGekQjhX
+JkPloF/FGio3oPBGsTx83uvbkLnCLc7td7DPU0qZWeWX5GeNkfzhS4LeD7lExWDv
+EMzyOvCl1CfDwRjZsF9Pwb7UktZ0UF1AMHJuUwm/7DQt2KyptXQD9tN0swPxrY/D
+uVtyIwKzSut2V9yBrRCwjs+yto6NXOOXb0KbT1g1SN6JHh0Ppk1IALvep2LWf049
++ty3rjxD+RtHaOLAfO+dBTCP9QIqdyzVXFzzhgNoLGIxBjJofG9q6RQVbMTdIu78
+4q2kdwTvAgMBAAECggEANRmdQjKeY2wEDeccxHdIfDRo0U60nsTCHP6kj60ud53w
+cvDTVUGMBEaolfC6ScDRfYvtR/itT9xky5jbufibP/qje8QL42FD6xoGtJCbNu+j
+9zg8CAfo8TwdefY/LEHFdc31ckXQSmAMVcisGUhftFrmcIOsrkjgMIAg1rxu2OQG
+gLhC5CCESLcGJdHnWnxuQCb81u51b5gftRgoCTRqOBiHf+uopn/cYjCOCCHIwh2I
+Dr8yVDcxUIeXzaTnUk3epR4AcYePI8A41KCqIlhQPDy6VbbZmDwHUROMD05ON88z
+/PsTUrhAvlAuYXDioxkDXCmU7/4ccUZtg+tVsQe3EQKBgQDmzjimW0RMLKvx5f9V
+PTgqrWuQssE1CuDqZAyqianyjkFzE4MteIXVzBh0JreDpKipyUcGu8QnlrS+LCsj
+W0DczdIq+WZmTFE8MmMxx5EFxEgXbyidV9P+VeBLgQ5kGYTAOfb6M8oHbSuo9mnQ
+6WZDWUwSJ5k5YFFXVjZZp4V1fQKBgQDdc3v1mr9sRwiy5AD641AgeCjmYCMm90j4
+QEZr25IgyueT7tA13O/Yi56ggiiQtkN0OjVCqtpF+piWIyEjXprUGf/0c/w16yew
+Cfv4j2+DGYqsNrPXU3yBWCOseFm221E/obmvvi8F9aSftTs83dMw9QSYgnnbkmVz
+5aPQrZT/2wKBgC3pxhEpxKtWk5naQ/HD7OFogCZXuOGBWX6nCnH+UqVisRhgQE8S
+U6VVJWQts4HnhnnIBW4MehfZ/fh6ttYguAV0mCNeW4VsFxjfeSYU6f94rVKkFTM/
+nndQw/6hHKjC/spyfXQGS2Ew0WeaJTCezW4GXICcCfoE9AloqAUrsvvNAoGBANV6
+4MLxvRtalw4tMqypubKzY2pCv2Bu/s8i10Be2U33jKtViy6BoE22uuKs1wI6UmiX
+PITaQ7U2USZbEzUPnF5f+hjkPvyThxzzYw5I6A0P8Fj4GwK3Hs1p9GntUz8tyfN3
+qpO62YX7OgokIckZZuBJM3b6QRLk3ByQAg3HaF4FAoGBANUMBR3oUC5Eb7Uzr2oy
+xY5mQ9YpN3ePzVUPc1tV8UCILksnJmobL4MFLfH0DWMQpysxBhjKwoYm1UxgYnWK
+FtJcYxAybkPvon+cCzOeVcZKQY5Kq5cjBGRKAA79fDQjiFR+mtwVY7JcaDfK8hff
+OW7UOrsm/EpNhyG4IYjH8cLd
+-----END PRIVATE KEY-----
diff --git a/log4j2-appender/src/test/resources/nginx/passwords b/log4j2-appender/src/test/resources/nginx/passwords
new file mode 100644
index 0000000..1a12e11
--- /dev/null
+++ b/log4j2-appender/src/test/resources/nginx/passwords
@@ -0,0 +1 @@
+tjahzi:$apr1$7WwaD0YV$Z3WwsmYhmHM9Vsp7euiO21