diff --git a/logging-modules/loki-logback/README.md b/logging-modules/loki-logback/README.md
new file mode 100644
index 0000000000..e320af31b4
--- /dev/null
+++ b/logging-modules/loki-logback/README.md
@@ -0,0 +1 @@
+### Relevant Articles:
\ No newline at end of file
diff --git a/logging-modules/loki-logback/pom.xml b/logging-modules/loki-logback/pom.xml
new file mode 100644
index 0000000000..7cc052b06f
--- /dev/null
+++ b/logging-modules/loki-logback/pom.xml
@@ -0,0 +1,65 @@
+
+
+ 4.0.0
+ logback
+ 0.1-SNAPSHOT
+ logback
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.0
+
+
+
+
+
+ com.github.loki4j
+ loki-logback-appender
+ ${loki-logback.version}
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+ org.junit
+ junit-bom
+ ${junit-jupiter.version}
+ pom
+ import
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+
+
+ 0.1.5
+ 1.4.2
+ 2.0.4
+ 1.18.22
+ 5.6.0
+
+
+
\ No newline at end of file
diff --git a/logging-modules/loki-logback/src/main/java/com/baeldung/loki/DemoService.java b/logging-modules/loki-logback/src/main/java/com/baeldung/loki/DemoService.java
new file mode 100644
index 0000000000..e9071c0de9
--- /dev/null
+++ b/logging-modules/loki-logback/src/main/java/com/baeldung/loki/DemoService.java
@@ -0,0 +1,15 @@
+package com.baeldung.loki;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DemoService {
+
+ private final Logger LOG = LoggerFactory.getLogger(DemoService.class);
+
+ public void log() {
+ LOG.info("DemoService.log invoked");
+ }
+}
diff --git a/logging-modules/loki-logback/src/main/resources/logback-spring.xml b/logging-modules/loki-logback/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000000..fa4b92f2f6
--- /dev/null
+++ b/logging-modules/loki-logback/src/main/resources/logback-spring.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+ {
+ "level":"%level",
+ "class":"%logger{36}",
+ "thread":"%thread",
+ "message": "%message",
+ "requestId": "%X{X-Request-ID}"
+ }
+
+
+
+
+
+
+
+
+
+
+ http://localhost:3100/loki/api/v1/push
+
+
+
+
+
+
+
+ {
+ "level":"%level",
+ "class":"%logger{36}",
+ "thread":"%thread",
+ "message": "%message",
+ "requestId": "%X{X-Request-ID}"
+ }
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/logging-modules/loki-logback/src/test/java/com/baeldung/loki/DemoServiceTest.java b/logging-modules/loki-logback/src/test/java/com/baeldung/loki/DemoServiceTest.java
new file mode 100644
index 0000000000..be88b80445
--- /dev/null
+++ b/logging-modules/loki-logback/src/test/java/com/baeldung/loki/DemoServiceTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.loki;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.text.ParseException;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
+
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest(classes = DemoService.class)
+public class DemoServiceTest {
+
+ @Mock
+ Appender appender;
+
+ @Captor
+ ArgumentCaptor captor;
+
+ @Test
+ public void givenLokiAppender_whenSampleServiceInvoked_ThenCaptureInfoLog() throws ParseException {
+ ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+ when(appender.getName()).thenReturn("loki-logback-appender");
+ logger.addAppender(appender);
+
+ DemoService service = new DemoService();
+ service.log();
+
+ verify(appender, times(1)).doAppend(captor.capture());
+ List allValues = captor.getAllValues();
+ assertEquals(1, allValues.size());
+ ILoggingEvent event = allValues.get(0);
+ assertEquals(event.getLevel(), Level.INFO);
+ assertEquals("DemoService.log invoked", event.getFormattedMessage());
+ }
+}