diff --git a/logging-modules/pom.xml b/logging-modules/pom.xml
index 9bbabdc40f51..3b8e3cb11ac8 100644
--- a/logging-modules/pom.xml
+++ b/logging-modules/pom.xml
@@ -22,6 +22,7 @@
tinylog2
logging-techniques
solarwinds-loggly
+ splunk-with-log4j2
-
\ No newline at end of file
+
diff --git a/logging-modules/splunk-with-log4j2/pom.xml b/logging-modules/splunk-with-log4j2/pom.xml
new file mode 100644
index 000000000000..9c04e2684a9c
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/pom.xml
@@ -0,0 +1,76 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.3.4
+
+
+ com.splunk
+ log4j
+ 0.0.1-SNAPSHOT
+ log4j
+ Demo project for Splunk with Spring Boot
+
+ 17
+ 1.8.0
+
+
+
+
+ splunk-artifactory
+ Splunk Releases
+ https://splunk.jfrog.io/splunk/ext-releases-local
+
+
+ central
+ Central Repository
+ https://repo1.maven.org/maven2/
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+ com.splunk.logging
+ splunk-library-javalogging
+ ${splunk-logging.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-log4j2
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/Log4jApplication.java b/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/Log4jApplication.java
new file mode 100644
index 000000000000..28e56e8359a6
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/Log4jApplication.java
@@ -0,0 +1,13 @@
+package com.splunk.log4j;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Log4jApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Log4jApplication.class, args);
+ }
+
+}
diff --git a/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/controller/StudentController.java b/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/controller/StudentController.java
new file mode 100644
index 000000000000..f50d2f89c306
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/controller/StudentController.java
@@ -0,0 +1,37 @@
+package com.splunk.log4j.controller;
+
+import java.util.List;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.splunk.log4j.dto.Student;
+import com.splunk.log4j.service.StudentService;
+
+@RestController
+@RequestMapping("students")
+public class StudentController {
+
+ private final StudentService studentService;
+
+ public StudentController(StudentService studentService) {
+ this.studentService = studentService;
+ }
+
+ @PostMapping
+ public Student addStudent(@RequestBody Student student) {
+ return studentService.addStudent(student);
+ }
+
+ @GetMapping
+ public List getStudents() {
+ return studentService.getStudents();
+ }
+
+ @GetMapping("{rollNumber}")
+ public Student getStudent(@PathVariable("rollNumber") int rollNumber) {
+ return studentService.getStudent(rollNumber);
+ }
+}
diff --git a/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/dto/Student.java b/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/dto/Student.java
new file mode 100644
index 000000000000..273e40418617
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/dto/Student.java
@@ -0,0 +1,58 @@
+package com.splunk.log4j.dto;
+
+import java.util.Objects;
+
+public class Student {
+
+ private String name;
+
+ private int rollNumber;
+
+ public Student() {
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getRollNumber() {
+ return rollNumber;
+ }
+
+ public void setRollNumber(int rollNumber) {
+ this.rollNumber = rollNumber;
+ }
+
+ @Override
+ public String toString() {
+ return "Student{" + "name='" + name + '\'' + ", rollNumber=" + rollNumber + '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Student student = (Student) o;
+
+ if (rollNumber != student.rollNumber) {
+ return false;
+ }
+ return Objects.equals(name, student.name);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = name != null ? name.hashCode() : 0;
+ result = 31 * result + rollNumber;
+ return result;
+ }
+}
diff --git a/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/service/StudentService.java b/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/service/StudentService.java
new file mode 100644
index 000000000000..88c9d00baeea
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/src/main/java/com/splunk/log4j/service/StudentService.java
@@ -0,0 +1,45 @@
+package com.splunk.log4j.service;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.stereotype.Service;
+import com.splunk.log4j.dto.Student;
+
+@Service
+public class StudentService {
+
+ private static final Logger logger = LogManager.getLogger(StudentService.class);
+
+ private final List students = new ArrayList<>();
+
+ public Student addStudent(Student student) {
+ logger.info("addStudent: adding Student");
+ logger.info("addStudent: Request: {}", student);
+ students.add(student);
+ logger.info("addStudent: added Student");
+ logger.info("addStudent: Response: {}", student);
+ return student;
+ }
+
+ public List getStudents() {
+ logger.info("getStudents: getting Students");
+ List studentsList = students;
+ logger.info("getStudents: got Students");
+ logger.info("getStudents: Response: {}", studentsList);
+ return studentsList;
+ }
+
+ public Student getStudent(int rollNumber) {
+ logger.info("getStudent: getting Student");
+ logger.info("getStudent: Request: {}", rollNumber);
+ Student student = students.stream()
+ .filter(stu -> stu.getRollNumber() == rollNumber)
+ .findAny()
+ .orElseThrow(() -> new RuntimeException("Student not found"));
+ logger.info("getStudent: got Student");
+ logger.info("getStudent: Response: {}", student);
+ return student;
+ }
+}
diff --git a/logging-modules/splunk-with-log4j2/src/main/resources/application.properties b/logging-modules/splunk-with-log4j2/src/main/resources/application.properties
new file mode 100644
index 000000000000..1610c2f2e62f
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/src/main/resources/application.properties
@@ -0,0 +1 @@
+spring.application.name=log4j
diff --git a/logging-modules/splunk-with-log4j2/src/main/resources/log4j2-spring.xml b/logging-modules/splunk-with-log4j2/src/main/resources/log4j2-spring.xml
new file mode 100644
index 000000000000..8a04c423d96d
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/src/main/resources/log4j2-spring.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/logging-modules/splunk-with-log4j2/src/test/java/com/splunk/log4j/controller/StudentControllerUnitTest.java b/logging-modules/splunk-with-log4j2/src/test/java/com/splunk/log4j/controller/StudentControllerUnitTest.java
new file mode 100644
index 000000000000..f5447ac7d5d3
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/src/test/java/com/splunk/log4j/controller/StudentControllerUnitTest.java
@@ -0,0 +1,75 @@
+package com.splunk.log4j.controller;
+
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import java.util.List;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.splunk.log4j.dto.Student;
+import com.splunk.log4j.service.StudentService;
+
+@WebMvcTest(StudentController.class)
+class StudentControllerUnitTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockBean
+ private StudentService studentService;
+
+ @Autowired
+ private ObjectMapper objectMapper;
+
+ @Test
+ void whenAddStudentCalled_thenReturnSuccessAndAddedStudent() throws Exception {
+ Student student = new Student();
+ student.setName("Ram");
+ student.setRollNumber(3);
+
+ when(studentService.addStudent(student)).thenReturn(student);
+
+ mockMvc.perform(post("/students").contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(student)))
+ .andExpect(status().isOk())
+ .andExpect(content().json(objectMapper.writeValueAsString(student)))
+ .andReturn();
+ }
+
+ @Test
+ void whenGetStudentCalled_thenReturnStudentByIndex() throws Exception {
+ Student student = new Student();
+ student.setName("Ram");
+ student.setRollNumber(4);
+
+ when(studentService.getStudent(0)).thenReturn(student);
+
+ mockMvc.perform(get("/students/0"))
+ .andExpect(status().isOk())
+ .andExpect(content().json(objectMapper.writeValueAsString(student)));
+ }
+
+ @Test
+ void whenGetStudentsCalled_thenReturnListOfStudent() throws Exception {
+ Student student = new Student();
+ student.setName("Ram");
+ student.setRollNumber(4);
+
+ Student student2 = new Student();
+ student.setName("Sham");
+ student.setRollNumber(3);
+
+ when(studentService.getStudents()).thenReturn(List.of(student, student2));
+
+ mockMvc.perform(get("/students"))
+ .andExpect(status().isOk())
+ .andExpect(content().json(objectMapper.writeValueAsString(List.of(student, student2))));
+ }
+}
diff --git a/logging-modules/splunk-with-log4j2/src/test/java/com/splunk/log4j/service/StudentServiceUnitTest.java b/logging-modules/splunk-with-log4j2/src/test/java/com/splunk/log4j/service/StudentServiceUnitTest.java
new file mode 100644
index 000000000000..79a5c24d5cbb
--- /dev/null
+++ b/logging-modules/splunk-with-log4j2/src/test/java/com/splunk/log4j/service/StudentServiceUnitTest.java
@@ -0,0 +1,65 @@
+package com.splunk.log4j.service;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import com.splunk.log4j.dto.Student;
+
+@SpringBootTest
+class StudentServiceUnitTest {
+
+ @Autowired
+ private StudentService studentService;
+
+ @Test
+ void whenAddStudentCalled_thenReturnAddedStudent() {
+ Student student = new Student();
+ student.setName("Ram");
+ student.setRollNumber(4);
+
+ Student student2 = studentService.addStudent(student);
+
+ Assertions.assertEquals(student2.getName(), student.getName());
+ Assertions.assertEquals(student2.getRollNumber(), student.getRollNumber());
+ }
+
+ @Test
+ void whenGetStudentsCalled_thenReturnListOfStudent() {
+ Student student = new Student();
+ student.setName("Ram");
+ student.setRollNumber(4);
+
+ Student student2 = new Student();
+ student.setName("Sham");
+ student.setRollNumber(5);
+
+ studentService.addStudent(student);
+ studentService.addStudent(student2);
+ List studentList = studentService.getStudents();
+
+ Student student3 = studentList.stream()
+ .filter(s -> s.getRollNumber() == 5)
+ .findFirst()
+ .orElseThrow(() -> new RuntimeException("Student not found"));
+
+ Assertions.assertNotNull(student3);
+ Assertions.assertEquals(5, student3.getRollNumber());
+ }
+
+ @Test
+ void whenGetStudentCalled_thenStudentByIndex() {
+ Student student = new Student();
+ student.setName("Ram");
+ student.setRollNumber(4);
+
+ studentService.addStudent(student);
+ Student student2 = studentService.getStudent(4);
+
+ Assertions.assertEquals(student2.getRollNumber(), student.getRollNumber());
+ Assertions.assertEquals(student2.getName(), student.getName());
+ }
+}