咖啡因缓存日志记录

Ags*_*Ags 8 spring caching spring-cache caffeine

我正在使用带有 spring 注释的咖啡因缓存提供程序,当条目\xe2\x80\x99s 放入缓存或驱逐或缓存上发生的任何活动时,我无法看到来自 caffeinecachemanager 的日志。我是否必须明确提及属性启用或禁用咖啡因日志?

\n\n

任何人都可以帮助解决以下问题吗?\n当 @cachable 填充缓存时如何记录消息?\n当缓存条目从缓存中逐出时如何记录?\n有什么方法可以检查以缓存名称存储的所有缓存条目吗?\ n使用spring注解和CaffeineCacheManager时是否需要AOP配置。?如果是这样,请帮助示例。

\n

Ton*_*sic 0

理想的情况是使用方面,但我不想深入研究它,因为它只是为了调试以了解实际的底层行为。

所以我使用 kotlin 做了下面的事情,但你可以根据你的需要进行调整。

首先,创建一个委托类:

class DelegatingCache<K, V>(
    val name: String,
    private val delegate: Cache<K, V>
) : Cache<K, V> {
    private val logger = LoggerFactory.getLogger(javaClass)

    override fun getIfPresent(key: K): V? = delegate.getIfPresent(key)
        .also { logger.warn("$name getIfPresent(key=$key) = $it") }

    override fun get(key: K, mappingFunction: Function<in K, out @PolyNull V>?): @PolyNull V =
        delegate.get(key, mappingFunction)
            .also { logger.warn("$name get(key=$key) = $it") }

    override fun getAllPresent(keys: Iterable<K>): Map<K, V> = delegate.getAllPresent(keys)
        .also { logger.warn("$name getAllPresent") }

    override fun getAll(
        keys: MutableIterable<K>?,
        mappingFunction: Function<in MutableSet<out K>, out MutableMap<out K, out V>>?
    ): MutableMap<K, V>? = delegate.getAll(keys, mappingFunction)
        .also { logger.warn("$name getAll") }

    override fun put(key: K, value: V) = delegate.put(key, value)
        .also { logger.warn("$name put(key=$key, value=$value)") }

    override fun putAll(map: Map<out K, V>) = delegate.putAll(map)
        .also { logger.warn("$name putAll") }

    override fun invalidate(key: K) = delegate.invalidate(key)
        .also { logger.warn("$name invalidate(key=$key)") }

    override fun invalidateAll(keys: Iterable<K>) = delegate.invalidateAll(keys)
        .also { logger.warn("$name invalidateAll(keys: Iterable<K>)") }

    override fun invalidateAll() = delegate.invalidateAll()
        .also { logger.warn("$name invalidateAll") }

    override fun estimatedSize(): Long = delegate.estimatedSize()
        .also { logger.warn("$name estimatedSize = $it") }

    override fun stats(): CacheStats = delegate.stats()
        .also { logger.warn("$name stats = $it") }

    override fun asMap(): ConcurrentMap<K, V> = delegate.asMap()
        .also { logger.warn("$name asMap") }

    override fun cleanUp() = delegate.cleanUp()
        .also { logger.warn("$name cleanUp") }

    override fun policy(): Policy<K, V> = delegate.policy()
        .also { logger.warn("$name policy = $it") }
}
Run Code Online (Sandbox Code Playgroud)

然后,当您在类上构建 Cache 实例时@Configuration,只需将缓存包装在该委托器类中,然后再返回它。

private fun <K, V> buildCache(
    cacheName: String,
): Cache<K, V> {
    return Caffeine.newBuilder()
        // ...
        .build<K, V>()
        .let { DelegatingCache(cacheName, it) }
}
Run Code Online (Sandbox Code Playgroud)

干杯