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()); + } +}