Skip to content

Commit

Permalink
Change listener API2
Browse files Browse the repository at this point in the history
  • Loading branch information
ogesaku committed Feb 18, 2024
1 parent 288e821 commit b5c3cfc
Show file tree
Hide file tree
Showing 17 changed files with 536 additions and 349 deletions.
16 changes: 14 additions & 2 deletions klog/src/main/kotlin/com/coditory/klog/EmittingKlogLogger.kt
Original file line number Diff line number Diff line change
Expand Up @@ -79,31 +79,43 @@ internal class EmittingKlogLogger(
event: LogEvent,
async: Boolean,
) {
var logged = false
listener.onLogStarted(event)
for (level in Level.higherLevelsOrEqual(event.level)) {
for (stream in streams.getOrDefault(level, emptyList())) {
val emitted = stream.emit(event, async)
logged = logged || emitted
if (emitted && stream.stopOnMatch()) {
listener.onLogEnded(event)
return
}
}
}
listener.onLogEnded(event)
if (logged) {
listener.onLogEnded(event)
} else {
listener.onLogSkipped(event)
}
}

private suspend fun emitEventSuspending(event: LogEvent) {
var logged = false
listener.onLogStarted(event)
for (level in Level.higherLevelsOrEqual(event.level)) {
for (stream in streams.getOrDefault(level, emptyList())) {
val emitted = stream.emitSuspending(event)
logged = logged || emitted
if (emitted && stream.stopOnMatch()) {
listener.onLogEnded(event)
return
}
}
}
listener.onLogEnded(event)
if (logged) {
listener.onLogEnded(event)
} else {
listener.onLogSkipped(event)
}
}

private fun createEvent(
Expand Down
81 changes: 44 additions & 37 deletions klog/src/main/kotlin/com/coditory/klog/KlogContext.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ import com.coditory.klog.config.KlogConfig
import com.coditory.klog.config.KlogErrLogger
import com.coditory.klog.config.LogPublisherConfig
import com.coditory.klog.config.LogStreamConfig
import com.coditory.klog.publish.BatchingLogPublisher
import com.coditory.klog.publish.BlockingLogSink
import com.coditory.klog.publish.BufferedLogSink
import com.coditory.klog.publish.InstrumentedAsyncLogPublisher
import com.coditory.klog.publish.InstrumentedBlockingPublisher
import com.coditory.klog.publish.LogPublisher
import com.coditory.klog.publish.LogPublisherListener
import com.coditory.klog.publish.SerialLogPublisher
import com.coditory.klog.sink.BatchingLogSink
import com.coditory.klog.sink.BlockingLogSink
import com.coditory.klog.sink.BufferedLogSink
import com.coditory.klog.sink.SerialLogSink
import java.time.Clock

internal data class KlogContext(
Expand All @@ -24,8 +25,8 @@ internal data class KlogContext(
companion object {
fun build(config: KlogConfig): KlogContext {
return KlogContext(
streams = config.streams.mapIndexed { idx, stream ->
buildStream(idx, stream, config)
streams = config.streams.map { stream ->
buildStream(stream, config)
},
clock = config.clock,
listener = config.listener,
Expand All @@ -35,80 +36,86 @@ internal data class KlogContext(
}

private fun buildStream(
streamIdx: Int,
config: LogStreamConfig,
klogConfig: KlogConfig,
): LogStream {
val streamDescriptor = LogStreamDescriptor(streamIdx, config.filter)
val publishers =
config.publishers.mapIndexed { idx, publisher ->
val descriptor = LogPublisherDescriptor(
stream = streamDescriptor,
publisherIdx = idx,
publisherType = publisher.javaClass,
)
buildPublisher(descriptor, publisher, klogConfig)
config.publishers.map { publisher ->
buildPublisher(publisher, config, klogConfig)
}

return LogStream(
descriptor = streamDescriptor,
filter = config.filter,
publishers = publishers,
stopOnMatch = config.stopOnMatch,
prioritizer = config.prioritizer,
listener = klogConfig.listener,
listener = CompositeLogStreamListener.create(config.listener, klogConfig.listener),
)
}

private fun buildPublisher(
descriptor: LogPublisherDescriptor,
config: LogPublisherConfig,
streamConfig: LogStreamConfig,
klogConfig: KlogConfig,
): LogPublisher {
return when (config) {
is BlockingLogPublisherConfig -> buildBlockingLogPublisher(descriptor, config, klogConfig)
is AsyncLogPublisherConfig -> buildAsyncLogPublisher(descriptor, config, klogConfig)
is BlockingLogPublisherConfig -> buildBlockingLogPublisher(config, streamConfig, klogConfig)
is AsyncLogPublisherConfig -> buildAsyncLogPublisher(config, streamConfig, klogConfig)
}
}

private fun buildBlockingLogPublisher(
descriptor: LogPublisherDescriptor,
config: BlockingLogPublisherConfig,
streamConfig: LogStreamConfig,
klogConfig: KlogConfig,
): LogPublisher {
return BlockingLogSink(
val publisher = InstrumentedBlockingPublisher(
listener = CompositeLogPublisherListener.create(
config.listener,
streamConfig.listener,
klogConfig.listener,
),
publisher = config.publisher,
descriptor = descriptor,
listener = klogConfig.listener,
klogErrLogger = klogConfig.klogErrLogger,
)
return BlockingLogSink(
publisher = publisher,
listener = CompositeLogStreamListener.create(streamConfig.listener, klogConfig.listener),
klogErrLogger = klogConfig.klogErrLogger,
)
}

private fun buildAsyncLogPublisher(
descriptor: LogPublisherDescriptor,
config: AsyncLogPublisherConfig,
streamConfig: LogStreamConfig,
klogConfig: KlogConfig,
): LogPublisher {
val publisher = InstrumentedAsyncLogPublisher(
listener = CompositeLogPublisherListener.create(
config.listener,
streamConfig.listener,
klogConfig.listener,
),
publisher = config.publisher,
klogErrLogger = klogConfig.klogErrLogger,
)
val serialAsyncLogPublisher =
if (!config.serialize) {
config.publisher
publisher
} else {
SerialLogPublisher(
publisher = config.publisher,
listener = LogPublisherListener.terminal(descriptor, klogConfig.listener),
SerialLogSink(
publisher = publisher,
listener = CompositeLogStreamListener.create(streamConfig.listener, klogConfig.listener),
klogErrLogger = klogConfig.klogErrLogger,
)
}
val batchingAsyncPublisher =
if (config.batchSize > 0) {
BatchingLogPublisher(
BatchingLogSink(
publisher = serialAsyncLogPublisher,
batchSize = config.batchSize,
maxBatchStaleness = config.maxBatchStaleness,
listener = if (config.serialize) {
LogPublisherListener.middle(descriptor, klogConfig.listener)
} else {
LogPublisherListener.terminal(descriptor, klogConfig.listener)
},
listener = CompositeLogStreamListener.create(streamConfig.listener, klogConfig.listener),
klogErrLogger = klogConfig.klogErrLogger,
)
} else {
Expand All @@ -118,7 +125,7 @@ internal data class KlogContext(
publisher = batchingAsyncPublisher,
standardLogBufferCapacity = config.standardLogBufferCapacity,
prioritizedLogBufferCapacity = config.prioritizedLogBufferCapacity,
listener = LogPublisherListener.entry(descriptor, klogConfig.listener),
listener = CompositeLogStreamListener.create(streamConfig.listener, klogConfig.listener),
klogErrLogger = klogConfig.klogErrLogger,
)
}
Expand Down
65 changes: 2 additions & 63 deletions klog/src/main/kotlin/com/coditory/klog/LogListener.kt
Original file line number Diff line number Diff line change
@@ -1,74 +1,13 @@
package com.coditory.klog

import com.coditory.klog.config.LogFilter

interface LogListener {
fun onLogStarted(event: LogEvent) {}

fun onLogEnded(event: LogEvent) {}

fun onStreamStarted(
stream: LogStreamDescriptor,
event: LogEvent,
) {
}

fun onStreamEnded(
stream: LogStreamDescriptor,
event: LogEvent,
) {
}

fun onPublishStarted(
publisher: LogPublisherDescriptor,
event: LogEvent,
) {
}

fun onPublishStarted(
publisher: LogPublisherDescriptor,
events: List<LogEvent>,
) {
}

fun onPublishDropped(
publisher: LogPublisherDescriptor,
event: LogEvent,
e: Throwable? = null,
) {
}

fun onPublishDropped(
publisher: LogPublisherDescriptor,
events: List<LogEvent>,
e: Throwable? = null,
) {
}

fun onPublishEnded(
publisher: LogPublisherDescriptor,
event: LogEvent,
) {
}
fun onLogSkipped(event: LogEvent) {}

fun onPublishEnded(
publisher: LogPublisherDescriptor,
events: List<LogEvent>,
) {
}
fun onLogEnded(event: LogEvent) {}

companion object {
internal val NOOP = object : LogListener {}
}
}

data class LogPublisherDescriptor(
val stream: LogStreamDescriptor,
val publisherIdx: Int,
val publisherType: Class<out Any>,
)

data class LogStreamDescriptor(
val idx: Int,
val filter: LogFilter,
)
82 changes: 82 additions & 0 deletions klog/src/main/kotlin/com/coditory/klog/LogPublisherListener.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.coditory.klog

interface LogPublisherListener {
fun onPublishStarted(event: LogEvent) {}

fun onPublishStarted(events: List<LogEvent>) {}

fun onPublishDropped(event: LogEvent, e: Throwable? = null) {}

fun onPublishDropped(events: List<LogEvent>, e: Throwable? = null) {}

fun onPublishEnded(event: LogEvent) {}

fun onPublishEnded(events: List<LogEvent>) {}

companion object {
internal val NOOP = object : LogPublisherListener {}
}
}

internal class CompositeLogPublisherListener private constructor(
private val first: LogPublisherListener,
private val second: LogPublisherListener,
) : LogPublisherListener {
override fun onPublishStarted(event: LogEvent) {
first.onPublishStarted(event)
second.onPublishStarted(event)
}

override fun onPublishStarted(events: List<LogEvent>) {
first.onPublishStarted(events)
second.onPublishStarted(events)
}

override fun onPublishDropped(event: LogEvent, e: Throwable?) {
first.onPublishDropped(event, e)
second.onPublishDropped(event, e)
}

override fun onPublishDropped(events: List<LogEvent>, e: Throwable?) {
first.onPublishDropped(events, e)
second.onPublishDropped(events, e)
}

override fun onPublishEnded(event: LogEvent) {
first.onPublishEnded(event)
second.onPublishEnded(event)
}

override fun onPublishEnded(events: List<LogEvent>) {
first.onPublishEnded(events)
second.onPublishEnded(events)
}

companion object {
fun create(
first: LogPublisherListener,
second: LogPublisherListener,
): LogPublisherListener {
if (first == LogPublisherListener.NOOP) return second
if (second == LogPublisherListener.NOOP) return first
return CompositeLogPublisherListener(first, second)
}

fun create(
first: LogPublisherListener,
second: LogStreamListener,
third: LogListener,
): LogPublisherListener {
val combined = if (second is LogPublisherListener) {
create(first, second as LogPublisherListener)
} else {
first
}
return if (third is LogPublisherListener) {
create(combined, third as LogPublisherListener)
} else {
combined
}
}
}
}
Loading

0 comments on commit b5c3cfc

Please sign in to comment.