Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何接收slf4j日志并且仍然不依赖于日志后端?_Java_Logging_Remote Debugging_Slf4j - Fatal编程技术网

Java 如何接收slf4j日志并且仍然不依赖于日志后端?

Java 如何接收slf4j日志并且仍然不依赖于日志后端?,java,logging,remote-debugging,slf4j,Java,Logging,Remote Debugging,Slf4j,我使用as-logging facade,让用户决定在哪里以及记录什么。现在,在崩溃的情况下,我想向服务器发送一个包含调试信息的文件——基本上是一个日志文件。既然我们已经在代码中分散了所有日志语句,为什么不使用它们呢 因此,基本上,我希望通过SLF4J以编程方式创建一个日志文件,对于仍然可以插入自己的日志后端和配置的用户来说是透明的 我的第一个想法是实现org.slf4j.impl.StaticLoggerBinder,交付自己的日志记录器实现,该记录器执行日志记录,然后委托给用户配置的日志记录

我使用as-logging facade,让用户决定在哪里以及记录什么。现在,在崩溃的情况下,我想向服务器发送一个包含调试信息的文件——基本上是一个日志文件。既然我们已经在代码中分散了所有日志语句,为什么不使用它们呢

因此,基本上,我希望通过SLF4J以编程方式创建一个日志文件,对于仍然可以插入自己的日志后端和配置的用户来说是透明的

我的第一个想法是实现org.slf4j.impl.StaticLoggerBinder,交付自己的日志记录器实现,该记录器执行日志记录,然后委托给用户配置的日志记录器。但是,我看到了一些问题:如果用户放置了一个普通的日志后端,那么类路径上就有多个
org.slf4j.impl.StaticLoggerBinder
实例。这将发出警告,我可能无法确保我的实现是被调用的实现


有更好的解决方案吗?完全不同的方法?这个想法本身就不好吗?如何实现这一点?

SLF4J的要点不是让应用程序最终用户选择他们的日志框架(为什么他们会在意?),而是让开发人员包括一个库,而不必被绑定到库选择的日志框架中


因此,如果要从已部署的应用程序上载调试信息,可以修复日志记录实现。用户仍然可以编辑实现的配置文件(如果需要)。

由于SLF4J是开源的,您可以将其修改为使用除org.SLF4J.impl.StaticLoggerBinder之外的其他类。然后,自定义的
StaticLoggerBinder
类可以加载用户提供的原始
org.slf4j.impl.StaticLoggerBinder
(如果存在)

另一个想法是在应用程序中使用自定义的
日志工厂
(而不是
org.slf4j.LoggerFactory
),它返回一个
记录器
委托。此委托类委托日志记录方法调用原始的
记录器
实现,并在必要时将日志发送到服务器

无论如何,在我看来,这两个都是一个笨拙的黑客,创建两个工件(一个用于最终用户,另一个用于开发人员)闻起来更好


(最后,我不知道它是什么类型的库/应用程序,但在我的工作环境中,如果库向第三方服务器发送数据,这是不可接受的。你确定你真的需要这样做吗?

我完全同意你的第一点。但是,该应用程序可以以两种方式使用:一种是针对最终用户,另一种是针对其他应用程序中包含的开发人员的API。即使它被用作API,我仍然希望有一份应用程序日志的副本,并且我希望避免仅仅因为这个功能就有两个不同的版本。@roesslerj这是一个您可能希望编辑到问题本身中的细节。