Skip to content

Commit b1b0dc5

Browse files
authored
Merge pull request #3 from monowai/dev-refactor
Beef up tests. Simplify package structure
2 parents b59950d + 414bee1 commit b1b0dc5

18 files changed

+412
-182
lines changed

build.gradle.kts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
plugins {
32
`java-library`
43
`maven-publish`
@@ -8,6 +7,14 @@ plugins {
87
id("io.spring.dependency-management") version "1.1.2"
98
}
109

10+
buildscript {
11+
val kotlinVersion = "1.8.21"
12+
dependencies {
13+
classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlinVersion")
14+
classpath("org.jmailen.gradle:kotlinter-gradle:3.14.0")
15+
}
16+
}
17+
1118
repositories {
1219
mavenLocal()
1320
maven {
@@ -19,11 +26,11 @@ repositories {
1926
group = "com.github.firetail-io"
2027
version = "0.0.1.SNAPSHOT"
2128
description = "firetail-java-lib"
22-
java.sourceCompatibility = JavaVersion.VERSION_1_8
29+
// java.sourceCompatibility = JavaVersion.VERSION_1_8
2330

2431
dependencies {
2532
implementation(
26-
platform("org.springframework.boot:spring-boot-dependencies:2.7.14"),
33+
platform("org.springframework.boot:spring-boot-dependencies:2.7.15"),
2734
)
2835
api("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
2936
api("commons-io:commons-io:2.7")
@@ -40,7 +47,8 @@ dependencies {
4047
compileOnly("org.springframework:spring-webmvc")
4148
testImplementation(kotlin("test"))
4249
testImplementation("javax.servlet:javax.servlet-api")
43-
testImplementation("org.springframework:spring-test")
50+
testImplementation("org.springframework.boot:spring-boot-starter-test")
51+
testImplementation("org.springframework:spring-webmvc")
4452
testImplementation("org.assertj:assertj-core")
4553
testImplementation("org.mockito.kotlin:mockito-kotlin:5.0.0")
4654
}
@@ -51,7 +59,7 @@ publishing {
5159
}
5260
}
5361
kotlin {
54-
jvmToolchain(8)
62+
jvmToolchain(17)
5563
}
5664

5765
tasks.test { // See 5️⃣
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.firetail.logging
1+
package io.firetail.logging.base
22

33
class Constants {
44
companion object {
@@ -7,6 +7,7 @@ class Constants {
77
const val OP_NAME = "X-Operation-Name"
88
const val RESPONSE_TIME = "X-Response-Time"
99
const val RESPONSE_STATUS = "X-Response-Status"
10+
const val AUDIT = "audit"
1011
val empty = ByteArray(0)
1112
}
1213
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.firetail.logging.base
2+
3+
import io.firetail.logging.servlet.FiretailFilter
4+
import io.firetail.logging.util.LogContext
5+
import io.firetail.logging.util.StringUtils
6+
import org.springframework.beans.factory.annotation.Autowired
7+
import org.springframework.beans.factory.annotation.Value
8+
import org.springframework.context.ApplicationContext
9+
import org.springframework.context.annotation.Configuration
10+
import org.springframework.context.annotation.Import
11+
12+
@Configuration
13+
@Import(
14+
FiretailLogger::class,
15+
StringUtils::class,
16+
LogContext::class,
17+
FiretailFilter::class,
18+
)
19+
class FiretailConfig @Autowired constructor(
20+
@Value("\${firetail.ignorePatterns:#null}")
21+
val ignorePatterns: String?,
22+
@Value("\${firetail.logHeaders:false}")
23+
val logHeaders: Boolean = false,
24+
) {
25+
@Autowired
26+
lateinit var context: ApplicationContext
27+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package io.firetail.logging.base
2+
3+
import io.firetail.logging.servlet.SpringRequestWrapper
4+
import io.firetail.logging.servlet.SpringResponseWrapper
5+
import io.firetail.logging.util.StringUtils
6+
import net.logstash.logback.argument.StructuredArguments
7+
import org.slf4j.LoggerFactory
8+
import org.springframework.stereotype.Service
9+
10+
@Service
11+
class FiretailLogger(
12+
private val stringUtils: StringUtils = StringUtils(),
13+
private val firetailConfig: FiretailConfig,
14+
) {
15+
fun logRequest(wrappedRequest: SpringRequestWrapper) =
16+
if (firetailConfig.logHeaders) {
17+
logWithHeaders(wrappedRequest)
18+
} else {
19+
logNoHeaders(wrappedRequest)
20+
}
21+
22+
private fun logNoHeaders(wrappedRequest: SpringRequestWrapper) {
23+
LOGGER.info(
24+
"Request: method={}, uri={}, payload={}, audit={}",
25+
wrappedRequest.method,
26+
wrappedRequest.requestURI,
27+
stringUtils.toString(wrappedRequest.inputStream.readAllBytes(), wrappedRequest.characterEncoding),
28+
StructuredArguments.value(Constants.AUDIT, true),
29+
)
30+
}
31+
32+
private fun logWithHeaders(wrappedRequest: SpringRequestWrapper) {
33+
LOGGER.info(
34+
"Request: method={}, uri={}, payload={}, headers={}, audit={}",
35+
wrappedRequest.method,
36+
wrappedRequest.requestURI,
37+
stringUtils.toString(wrappedRequest.inputStream.readAllBytes(), wrappedRequest.characterEncoding),
38+
wrappedRequest.allHeaders,
39+
StructuredArguments.value(Constants.AUDIT, true),
40+
)
41+
}
42+
43+
fun logResponse(
44+
startTime: Long,
45+
wrappedResponse: SpringResponseWrapper,
46+
status: Int = wrappedResponse.status,
47+
) {
48+
val duration = System.currentTimeMillis() - startTime
49+
wrappedResponse.characterEncoding = stringUtils.charSet()
50+
if (firetailConfig.logHeaders) {
51+
logWithHeaders(duration, status, wrappedResponse)
52+
} else {
53+
logNoHeaders(duration, status, wrappedResponse)
54+
}
55+
}
56+
57+
private fun logNoHeaders(
58+
duration: Long,
59+
status: Int,
60+
wrappedResponse: SpringResponseWrapper,
61+
) {
62+
LOGGER.info(
63+
"Response({} ms): status={}, payload={}, audit={}",
64+
StructuredArguments.value(Constants.RESPONSE_TIME, duration),
65+
StructuredArguments.value(Constants.RESPONSE_STATUS, status),
66+
stringUtils.toString(wrappedResponse.contentAsByteArray),
67+
StructuredArguments.value(Constants.AUDIT, true),
68+
)
69+
}
70+
71+
private fun logWithHeaders(
72+
duration: Long,
73+
status: Int,
74+
wrappedResponse: SpringResponseWrapper,
75+
) {
76+
LOGGER.info(
77+
"Response({} ms): status={}, payload={}, headers={}, audit={}",
78+
StructuredArguments.value(Constants.RESPONSE_TIME, duration),
79+
StructuredArguments.value(Constants.RESPONSE_STATUS, status),
80+
stringUtils.toString(wrappedResponse.contentAsByteArray),
81+
wrappedResponse.allHeaders,
82+
StructuredArguments.value(Constants.AUDIT, true),
83+
)
84+
}
85+
86+
companion object {
87+
private val LOGGER = LoggerFactory.getLogger(this::class.java)
88+
}
89+
}

src/main/kotlin/io/firetail/logging/config/SpringLoggerAutoConfiguration.kt renamed to src/main/kotlin/io/firetail/logging/base/SpringLoggerAutoConfiguration.kt

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
package io.firetail.logging.config
1+
package io.firetail.logging.base
22

3-
import io.firetail.logging.client.RestTemplateSetHeaderInterceptor
4-
import io.firetail.logging.filter.SpringLoggerFilter
5-
import io.firetail.logging.util.UniqueIDGenerator
3+
import io.firetail.logging.servlet.FiretailHeaderInterceptor
64
import org.springframework.beans.factory.annotation.Autowired
75
import org.springframework.beans.factory.annotation.Value
86
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
97
import org.springframework.boot.context.properties.ConfigurationProperties
108
import org.springframework.context.annotation.Bean
119
import org.springframework.context.annotation.Configuration
10+
import org.springframework.context.annotation.Import
1211
import org.springframework.http.client.ClientHttpRequestInterceptor
1312
import org.springframework.web.client.RestTemplate
1413
import java.util.*
@@ -18,6 +17,7 @@ import javax.annotation.PostConstruct
1817
// import net.logstash.logback.encoder.LogstashEncoder;
1918
@Configuration
2019
@ConfigurationProperties(prefix = "logging.logstash")
20+
@Import(FiretailConfig::class)
2121
class SpringLoggerAutoConfiguration {
2222
// private static final String FIRETAIL_APPENDER_NAME = "FIRETAIL";
2323
var url = "localhost:8500"
@@ -32,22 +32,12 @@ class SpringLoggerAutoConfiguration {
3232
@Autowired(required = false)
3333
var template: Optional<RestTemplate>? = null
3434

35-
@Bean
36-
fun generator(): UniqueIDGenerator {
37-
return UniqueIDGenerator()
38-
}
39-
40-
@Bean
41-
fun loggingFilter(): SpringLoggerFilter {
42-
return SpringLoggerFilter(generator(), ignorePatterns, isLogHeaders)
43-
}
44-
4535
@Bean
4636
@ConditionalOnMissingBean(RestTemplate::class)
4737
fun restTemplate(): RestTemplate {
4838
val restTemplate = RestTemplate()
4939
val interceptorList: MutableList<ClientHttpRequestInterceptor> = ArrayList()
50-
interceptorList.add(RestTemplateSetHeaderInterceptor())
40+
interceptorList.add(FiretailHeaderInterceptor())
5141
restTemplate.interceptors = interceptorList
5242
return restTemplate
5343
}
@@ -84,7 +74,7 @@ class SpringLoggerAutoConfiguration {
8474
fun init() {
8575
template!!.ifPresent { restTemplate: RestTemplate ->
8676
val interceptorList: MutableList<ClientHttpRequestInterceptor> = ArrayList()
87-
interceptorList.add(RestTemplateSetHeaderInterceptor())
77+
interceptorList.add(FiretailHeaderInterceptor())
8878
restTemplate.interceptors = interceptorList
8979
}
9080
}

src/main/kotlin/io/firetail/logging/filter/SpringLoggerFilter.kt

Lines changed: 0 additions & 120 deletions
This file was deleted.

0 commit comments

Comments
 (0)