Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
90e7683
chore: Tidyup build issues
monowai Jul 25, 2023
cd5044f
refactor: Kotlin/Gradle
monowai Aug 3, 2023
b59950d
Merge pull request #2 from monowai/dev-refactor
muhammadn Aug 24, 2023
c158fe5
refactor: Simplify classes and introduce clearer defaults
monowai Sep 8, 2023
8fe24f5
feat: Beef up Interceptor tests
monowai Sep 9, 2023
414bee1
Merge branch 'muhammadn:main' into dev-refactor
monowai Sep 12, 2023
b1b0dc5
Merge pull request #3 from monowai/dev-refactor
muhammadn Oct 19, 2023
deddc9b
Merge branch 'main' of github.com:FireTail-io/firetail-java-lib
muhammadn Oct 19, 2023
55d1336
chore: Fix publishToMavenLocal
monowai Oct 24, 2023
a9ba96f
feat: Added Spring Boot Web Demo
monowai Oct 25, 2023
8e1abf8
feat: Added Open API documentation
monowai Oct 31, 2023
56a0a59
feat: Firetail Interceptor. Add tests to support correct disabling
monowai Nov 23, 2023
efabcac
feat: Serialization
monowai Nov 24, 2023
b35a62f
feat: Map payload
monowai Nov 27, 2023
ab40eaa
feat: Send logs
monowai Nov 28, 2023
b0e7ad8
feat: EnableFiretail annotation. remove config property
monowai Nov 29, 2023
aa49569
feat: Tidyup logging and duration
monowai Dec 1, 2023
cbaf27c
feat: Added a buffer for data logs. Minor package refactor
monowai Dec 4, 2023
87b1186
refactor: Internalise locking of the Buffer and remove the need to sy…
monowai Dec 5, 2023
bfd9baf
add issue notes and github actions
muhammadn Dec 5, 2023
69fe1c5
Merge branch 'feat/kotlin-migration' of github.com:FireTail-io/fireta…
muhammadn Dec 5, 2023
140ace4
change version for jdk
muhammadn Dec 5, 2023
d7a3737
check for multiple java versions
muhammadn Dec 5, 2023
1e956da
remove java 17
muhammadn Dec 5, 2023
a57ba9d
add back java-version
muhammadn Dec 5, 2023
24eaa35
cache builds
muhammadn Dec 5, 2023
238b878
add documentation
muhammadn Oct 7, 2024
e6a01ba
should be application-local.yml
muhammadn Oct 8, 2024
4566567
add a note to tell user about env vars
muhammadn Oct 15, 2024
d43259b
rephrase it a bit
muhammadn Oct 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

plugins {
`java-library`
`maven-publish`
Expand All @@ -8,6 +7,14 @@ plugins {
id("io.spring.dependency-management") version "1.1.2"
}

buildscript {
val kotlinVersion = "1.8.21"
dependencies {
classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlinVersion")
classpath("org.jmailen.gradle:kotlinter-gradle:3.14.0")
}
}

repositories {
mavenLocal()
maven {
Expand All @@ -19,11 +26,11 @@ repositories {
group = "com.github.firetail-io"
version = "0.0.1.SNAPSHOT"
description = "firetail-java-lib"
java.sourceCompatibility = JavaVersion.VERSION_1_8
// java.sourceCompatibility = JavaVersion.VERSION_1_8

dependencies {
implementation(
platform("org.springframework.boot:spring-boot-dependencies:2.7.14"),
platform("org.springframework.boot:spring-boot-dependencies:2.7.15"),
)
api("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
api("commons-io:commons-io:2.7")
Expand All @@ -40,7 +47,8 @@ dependencies {
compileOnly("org.springframework:spring-webmvc")
testImplementation(kotlin("test"))
testImplementation("javax.servlet:javax.servlet-api")
testImplementation("org.springframework:spring-test")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework:spring-webmvc")
testImplementation("org.assertj:assertj-core")
testImplementation("org.mockito.kotlin:mockito-kotlin:5.0.0")
}
Expand All @@ -51,7 +59,7 @@ publishing {
}
}
kotlin {
jvmToolchain(8)
jvmToolchain(17)
}

tasks.test { // See 5️⃣
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.firetail.logging
package io.firetail.logging.base

class Constants {
companion object {
Expand All @@ -7,6 +7,7 @@ class Constants {
const val OP_NAME = "X-Operation-Name"
const val RESPONSE_TIME = "X-Response-Time"
const val RESPONSE_STATUS = "X-Response-Status"
const val AUDIT = "audit"
val empty = ByteArray(0)
}
}
27 changes: 27 additions & 0 deletions src/main/kotlin/io/firetail/logging/base/FiretailConfig.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.firetail.logging.base

import io.firetail.logging.servlet.FiretailFilter
import io.firetail.logging.util.LogContext
import io.firetail.logging.util.StringUtils
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Import

@Configuration
@Import(
FiretailLogger::class,
StringUtils::class,
LogContext::class,
FiretailFilter::class,
)
class FiretailConfig @Autowired constructor(
@Value("\${firetail.ignorePatterns:#null}")
val ignorePatterns: String?,
@Value("\${firetail.logHeaders:false}")
val logHeaders: Boolean = false,
) {
@Autowired
lateinit var context: ApplicationContext
}
89 changes: 89 additions & 0 deletions src/main/kotlin/io/firetail/logging/base/FiretailLogger.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package io.firetail.logging.base

import io.firetail.logging.servlet.SpringRequestWrapper
import io.firetail.logging.servlet.SpringResponseWrapper
import io.firetail.logging.util.StringUtils
import net.logstash.logback.argument.StructuredArguments
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service

@Service
class FiretailLogger(
private val stringUtils: StringUtils = StringUtils(),
private val firetailConfig: FiretailConfig,
) {
fun logRequest(wrappedRequest: SpringRequestWrapper) =
if (firetailConfig.logHeaders) {
logWithHeaders(wrappedRequest)
} else {
logNoHeaders(wrappedRequest)
}

private fun logNoHeaders(wrappedRequest: SpringRequestWrapper) {
LOGGER.info(
"Request: method={}, uri={}, payload={}, audit={}",
wrappedRequest.method,
wrappedRequest.requestURI,
stringUtils.toString(wrappedRequest.inputStream.readAllBytes(), wrappedRequest.characterEncoding),
StructuredArguments.value(Constants.AUDIT, true),
)
}

private fun logWithHeaders(wrappedRequest: SpringRequestWrapper) {
LOGGER.info(
"Request: method={}, uri={}, payload={}, headers={}, audit={}",
wrappedRequest.method,
wrappedRequest.requestURI,
stringUtils.toString(wrappedRequest.inputStream.readAllBytes(), wrappedRequest.characterEncoding),
wrappedRequest.allHeaders,
StructuredArguments.value(Constants.AUDIT, true),
)
}

fun logResponse(
startTime: Long,
wrappedResponse: SpringResponseWrapper,
status: Int = wrappedResponse.status,
) {
val duration = System.currentTimeMillis() - startTime
wrappedResponse.characterEncoding = stringUtils.charSet()
if (firetailConfig.logHeaders) {
logWithHeaders(duration, status, wrappedResponse)
} else {
logNoHeaders(duration, status, wrappedResponse)
}
}

private fun logNoHeaders(
duration: Long,
status: Int,
wrappedResponse: SpringResponseWrapper,
) {
LOGGER.info(
"Response({} ms): status={}, payload={}, audit={}",
StructuredArguments.value(Constants.RESPONSE_TIME, duration),
StructuredArguments.value(Constants.RESPONSE_STATUS, status),
stringUtils.toString(wrappedResponse.contentAsByteArray),
StructuredArguments.value(Constants.AUDIT, true),
)
}

private fun logWithHeaders(
duration: Long,
status: Int,
wrappedResponse: SpringResponseWrapper,
) {
LOGGER.info(
"Response({} ms): status={}, payload={}, headers={}, audit={}",
StructuredArguments.value(Constants.RESPONSE_TIME, duration),
StructuredArguments.value(Constants.RESPONSE_STATUS, status),
stringUtils.toString(wrappedResponse.contentAsByteArray),
wrappedResponse.allHeaders,
StructuredArguments.value(Constants.AUDIT, true),
)
}

companion object {
private val LOGGER = LoggerFactory.getLogger(this::class.java)
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package io.firetail.logging.config
package io.firetail.logging.base

import io.firetail.logging.client.RestTemplateSetHeaderInterceptor
import io.firetail.logging.filter.SpringLoggerFilter
import io.firetail.logging.util.UniqueIDGenerator
import io.firetail.logging.servlet.FiretailHeaderInterceptor
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Import
import org.springframework.http.client.ClientHttpRequestInterceptor
import org.springframework.web.client.RestTemplate
import java.util.*
Expand All @@ -18,6 +17,7 @@ import javax.annotation.PostConstruct
// import net.logstash.logback.encoder.LogstashEncoder;
@Configuration
@ConfigurationProperties(prefix = "logging.logstash")
@Import(FiretailConfig::class)
class SpringLoggerAutoConfiguration {
// private static final String FIRETAIL_APPENDER_NAME = "FIRETAIL";
var url = "localhost:8500"
Expand All @@ -32,22 +32,12 @@ class SpringLoggerAutoConfiguration {
@Autowired(required = false)
var template: Optional<RestTemplate>? = null

@Bean
fun generator(): UniqueIDGenerator {
return UniqueIDGenerator()
}

@Bean
fun loggingFilter(): SpringLoggerFilter {
return SpringLoggerFilter(generator(), ignorePatterns, isLogHeaders)
}

@Bean
@ConditionalOnMissingBean(RestTemplate::class)
fun restTemplate(): RestTemplate {
val restTemplate = RestTemplate()
val interceptorList: MutableList<ClientHttpRequestInterceptor> = ArrayList()
interceptorList.add(RestTemplateSetHeaderInterceptor())
interceptorList.add(FiretailHeaderInterceptor())
restTemplate.interceptors = interceptorList
return restTemplate
}
Expand Down Expand Up @@ -84,7 +74,7 @@ class SpringLoggerAutoConfiguration {
fun init() {
template!!.ifPresent { restTemplate: RestTemplate ->
val interceptorList: MutableList<ClientHttpRequestInterceptor> = ArrayList()
interceptorList.add(RestTemplateSetHeaderInterceptor())
interceptorList.add(FiretailHeaderInterceptor())
restTemplate.interceptors = interceptorList
}
}
Expand Down
120 changes: 0 additions & 120 deletions src/main/kotlin/io/firetail/logging/filter/SpringLoggerFilter.kt

This file was deleted.

Loading