From 2eb5a6ae03b1b3fab315ec6c35d11823da7997a4 Mon Sep 17 00:00:00 2001 From: Bossanyi Tibor Date: Wed, 20 May 2020 15:36:04 +0200 Subject: [PATCH] spfl4j logging --- build.gradle.kts | 8 +++- .../com/aitrainer/api/ApiApplication.kt | 6 ++- .../api/controller/ExerciseTypeController.kt | 24 ++++++++--- src/main/resources/application.properties | 4 +- src/main/resources/logback-spring.xml | 41 +++++++++++++++++++ src/main/resources/simplelogger.properties | 34 +++++++++++++++ .../com/aitrainer/api/test/AitrainerDBTest.kt | 4 +- .../com/aitrainer/api/test/CustomerTests.kt | 6 +-- .../aitrainer/api/test/ExerciseTypeTest.kt | 27 +++++++++--- 9 files changed, 132 insertions(+), 22 deletions(-) create mode 100644 src/main/resources/logback-spring.xml create mode 100644 src/main/resources/simplelogger.properties diff --git a/build.gradle.kts b/build.gradle.kts index 51b59ac..7408179 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } group = "com.aitrainer" -version = "0.0.3" +version = "0.0.4" java.sourceCompatibility = JavaVersion.VERSION_1_8 repositories { @@ -22,13 +22,17 @@ dependencies { implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + implementation("org.apache.logging.log4j:log4j-core:2.13.3") + implementation("org.apache.logging.log4j:log4j-api:2.13.3") + implementation("org.slf4j:slf4j-api:1.7.30") + + runtimeOnly("mysql:mysql-connector-java") testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude(group = "org.junit.vintage", module = "junit-vintage-engine") } testImplementation("junit:junit:4.13") testImplementation("org.jetbrains.kotlin:kotlin-test-junit5:1.3.72") - } tasks.withType { diff --git a/src/main/kotlin/com/aitrainer/api/ApiApplication.kt b/src/main/kotlin/com/aitrainer/api/ApiApplication.kt index 400a4fc..742e079 100644 --- a/src/main/kotlin/com/aitrainer/api/ApiApplication.kt +++ b/src/main/kotlin/com/aitrainer/api/ApiApplication.kt @@ -1,5 +1,6 @@ package com.aitrainer.api +import org.slf4j.LoggerFactory import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.builder.SpringApplicationBuilder @@ -10,7 +11,7 @@ import org.springframework.web.bind.annotation.RestController @SpringBootApplication @RestController class ApiApplication - + private val logger = LoggerFactory.getLogger(ApiApplication::class.simpleName) @Override fun configure(application: SpringApplicationBuilder): SpringApplicationBuilder { return application.sources(ApiApplication::class.java) @@ -18,11 +19,12 @@ class ApiApplication fun main(args: Array) { + logger.info(" ---- Start aitrainer API") SpringApplication.run(ApiApplication::class.java, *args) } @RequestMapping( "/") fun hello(): String { - return "Hello Aitrainer API"; + return "Hello Aitrainer API" } diff --git a/src/main/kotlin/com/aitrainer/api/controller/ExerciseTypeController.kt b/src/main/kotlin/com/aitrainer/api/controller/ExerciseTypeController.kt index 8930c12..b6143b7 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/ExerciseTypeController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/ExerciseTypeController.kt @@ -2,6 +2,8 @@ package com.aitrainer.api.controller import com.aitrainer.api.model.ExerciseType import com.aitrainer.api.repository.ExerciseTypeRepository +import org.slf4j.LoggerFactory + import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* import javax.validation.Valid @@ -9,17 +11,27 @@ import javax.validation.Valid @RestController @RequestMapping("/api") class ExerciseTypeController ( private val exerciseTypeRepository: ExerciseTypeRepository ) { - + private val logger = LoggerFactory.getLogger(javaClass) + @GetMapping("/exercise_type") - fun getAllExerciseType(): List = - exerciseTypeRepository.findAll() + fun getAllExerciseType(): List { + val list: List = exerciseTypeRepository.findAll() + logger.info("Get All exercise types: $list") + return list + } + + @PostMapping("/exercise_type") - fun createNewExerciseType(@Valid @RequestBody exerciseType: ExerciseType): ExerciseType = - exerciseTypeRepository.save(exerciseType) + fun createNewExerciseType(@Valid @RequestBody exerciseType: ExerciseType): ExerciseType { + logger.info("Create new exercise type: $exerciseType") + return exerciseTypeRepository.save(exerciseType) + } + @GetMapping("/exercise_type/{id}") fun getExerciseTypeById(@PathVariable(value = "id") exerciseTypeId: Long): ResponseEntity { + logger.info("Get exercise type by id: $exerciseTypeId") return exerciseTypeRepository.findById(exerciseTypeId).map { exerciseType -> ResponseEntity.ok(exerciseType) }.orElse(ResponseEntity.notFound().build()) @@ -35,7 +47,7 @@ class ExerciseTypeController ( private val exerciseTypeRepository: ExerciseTypeR @PutMapping("/exercise_type/{id}") fun updateExerciseTypesById(@PathVariable(value = "id") exerciseTypeId: Long, @Valid @RequestBody newExerciseType: ExerciseType): ResponseEntity { - + logger.info("Update exercise type by id: $exerciseTypeId with object $newExerciseType") return exerciseTypeRepository.findById(exerciseTypeId).map { existingExerciseType -> val updatedExerciseType: ExerciseType = existingExerciseType .copy(name = newExerciseType.name, diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1f3f585..a43762e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,4 +10,6 @@ spring.datasource.password = andio2009 # The SQL dialect makes Hibernate generate better SQL for the chosen database -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect \ No newline at end of file +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect +logging.config=classpath:logback-spring.xml +logging.file=logs \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..23f9249 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,41 @@ + + + + + + ${logging.file}/aitrainer.log + + ${logging.file}/aitrainer.%d{yyyy-MM-dd}.%i.log.gz + + 50MB + + 30 + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger:%line] %msg%n + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger:%line] %msg%n + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/simplelogger.properties b/src/main/resources/simplelogger.properties new file mode 100644 index 0000000..05ff3de --- /dev/null +++ b/src/main/resources/simplelogger.properties @@ -0,0 +1,34 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. + +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=debug + +# Logging detail level for a SimpleLogger instance named "xxxxx". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +#org.slf4j.simpleLogger.log.xxxxx= + +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +org.slf4j.simpleLogger.showDateTime=true + +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z + +# Set to true if you want to output the current thread name. +# Defaults to true. +#org.slf4j.simpleLogger.showThreadName=true + +# Set to true if you want the Logger instance name to be included in output messages. +# Defaults to true. +#org.slf4j.simpleLogger.showLogName=true + +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +org.slf4j.simpleLogger.showShortLogName=true \ No newline at end of file diff --git a/src/test/kotlin/com/aitrainer/api/test/AitrainerDBTest.kt b/src/test/kotlin/com/aitrainer/api/test/AitrainerDBTest.kt index a8a6c72..6450923 100644 --- a/src/test/kotlin/com/aitrainer/api/test/AitrainerDBTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/AitrainerDBTest.kt @@ -1,8 +1,8 @@ package com.aitrainer.api.test import org.springframework.beans.factory.annotation.Autowired - -import java.sql.* +import java.sql.Connection +import java.sql.DriverManager import java.util.* import kotlin.test.assertNotNull import kotlin.test.assertTrue diff --git a/src/test/kotlin/com/aitrainer/api/test/CustomerTests.kt b/src/test/kotlin/com/aitrainer/api/test/CustomerTests.kt index f179371..d1c5a5a 100644 --- a/src/test/kotlin/com/aitrainer/api/test/CustomerTests.kt +++ b/src/test/kotlin/com/aitrainer/api/test/CustomerTests.kt @@ -1,12 +1,12 @@ package com.aitrainer.api.test -import org.springframework.boot.test.context.SpringBootTest -import com.aitrainer.api.repository.CustomerRepository import com.aitrainer.api.model.Customer +import com.aitrainer.api.repository.CustomerRepository import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest import kotlin.test.assertEquals import kotlin.test.assertNotNull -import org.springframework.beans.factory.annotation.Autowired @SpringBootTest class CustomerTests { diff --git a/src/test/kotlin/com/aitrainer/api/test/ExerciseTypeTest.kt b/src/test/kotlin/com/aitrainer/api/test/ExerciseTypeTest.kt index 1105330..f119762 100644 --- a/src/test/kotlin/com/aitrainer/api/test/ExerciseTypeTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/ExerciseTypeTest.kt @@ -3,12 +3,14 @@ package com.aitrainer.api.test import com.aitrainer.api.model.ExerciseType import com.aitrainer.api.repository.ExerciseTypeRepository import org.junit.jupiter.api.Test +import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import kotlin.test.assertEquals @SpringBootTest class ExerciseTypeTest { + private val logger = LoggerFactory.getLogger(javaClass) @Autowired private lateinit var exerciseTypeRepository: ExerciseTypeRepository @@ -17,18 +19,31 @@ class ExerciseTypeTest { @Test fun testGet() { val id: Long = 7 - val extype: ExerciseType = exerciseTypeRepository.findById( id ).orElse(null) - assertEquals( extype.name, "4x10m-es ingafutás") + val extype: ExerciseType = exerciseTypeRepository.findById(id).orElse(null) + assertEquals(extype.name, "4x10m-es ingafutás") } + + @Test + fun testGetAll() { + val exerciseTypes: List = exerciseTypeRepository.findAll() + assertEquals(exerciseTypes[0].exerciseTypeId, 1) + assertEquals(exerciseTypes[0].name, "Melső fekvőtámasz 1 perc") + } + + @Test fun testInsert(){ - val newEx = ExerciseType( "Húzodszkodás", " A legtöbb húzodszkodást 24 óra alatt John Ort érte el 7600-al 2016-ban. ", null ) + logger.info("Add 'Húzodzkodás 2") + val newEx = ExerciseType( "Húzodzkodás 2", " A legtöbb húzodszkodást 24 óra alatt John Ort érte el 7600-al 2016-ban. ", null ) val savedEx: ExerciseType = exerciseTypeRepository.save(newEx) - assertEquals(savedEx.name, "Húzodszkodás") + assertEquals(savedEx.name, "Húzodzkodás 2") this.insertedId = savedEx.exerciseTypeId + logger.info("Find 'Húzodzkodás 2") val extype: ExerciseType = exerciseTypeRepository.findById( savedEx.exerciseTypeId ).orElse(null) - assertEquals( extype.name, "Húzodszkodás") - + assertEquals( extype.name, "Húzodzkodás 2") + + logger.info("Delete 'Húzodzkodás 2") + exerciseTypeRepository.delete(extype) } } \ No newline at end of file