log4cxx consoleappender怎么关闭

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4cxx consoleappender怎么关闭相关的知识,希望对你有一定的参考价值。

参考技术A Log4cxx是开放源代码项目Apache Logging Service的子项目之一,用于为C++程序提供日志功能,以便开发者对目标程序进行调试 和审计。本文对log4cxx的使用及配置进行介绍,并给出一个可以快速开始的实例。最后,针对日志服务给出一些实践方面的建...

如何在Kotlin中指定递归泛型参数?

我只想从使用Log4j(v2.8.2)的Java中移植以下代码:

ConsoleAppender appender = ConsoleAppender.newBuilder().
            withName("ConsoleAppender").build();

问题在于newBuilder()方法,它被定义为log4j中的某种递归泛型:

@PluginBuilderFactory
public static <B extends Builder<B>> B newBuilder() {
    return new Builder<B>().asBuilder();
}

Java代码自动推断通用参数,而Kotlin则不然。有什么解决方案可以在Kotlin中调用这个方法吗?

我在Kotlin尝试过的代码:

val appender = ConsoleAppender.newBuilder().withName("ConsoleAppender").build()

它有以下错误:

错误:(90,48)Kotlin:类型推断失败:没有足够的信息来推断参数B的乐趣!> newBuilder():B!请明确说明。

当代码在粘贴时自动从Java转换时,它会设置一些stub newBuilder<B>(),其中B未定义,我不知道它应该是什么。

答案

Log4J似乎使用了一个构建器模式,在Kotlin中要求每个开放的非抽象类都有两个构建器:一个是泛型​​的,可以通过子类扩展,另一个是非泛型的,可以实例化。

既然你可能不想修改Log4J,我会考虑使用反射:

fun main(args: Array<String>) {
val builder = ConsoleAppender::class.java.getMethod("newBuilder").invoke(null) as ConsoleAppender.Builder<*>
val appender = builder.withName("ConsoleAppender").build()
println(appender.name)

}

请参阅我在discuss.kotlinlang.org的回答:

Recursive generic in Builder pattern

另一答案

我找到了等待如何为log4j2配置解决此问题,请参阅示例:

// create concrete type just to call method
// however, we should not use it, because of possible runtime casting issues
private class ConsoleBuilder : ConsoleAppender.Builder<ConsoleBuilder>()

private fun createAppender(configuration: Configuration): ConsoleAppender {
    // hide our temporary class immediately, to avoid runtime type casting issue
    return (ConsoleAppender.newBuilder<ConsoleBuilder>() as ConsoleAppender.Builder<ConsoleBuilder>).apply {
        withName("MyAppender")
        setConfiguration(configuration)
    }.build()
}

以上是关于log4cxx consoleappender怎么关闭的主要内容,如果未能解决你的问题,请参考以下文章

手动补丁出错log4cxx.dll丢失怎么解决

RedHat安装log4cxx日志库的步骤

8.21-log4cxx

RedHat安装log4cxx日志库的步骤

log4cxx配置日期回滚策略中增加MaxFileSize属性

在运行时加载第 3 方 DLL 失败并出现未处理异常(Log4CXX、ActiveMQ)