我正在开发一个客户端 - 服务器 - 应用程序,并希望实现一个灵活的Logging框架,所以我选择了log4j,它不再真正发展,但它仍然是方便的框架。
因为Logging是在网络上发生的,所以我想要一个案例的解决方案,网络驱动器不可用,因此Logger必须更改其目标文件。
现在我想使用来自Log4j库的FallbackErrorHandler(配置了XML文件)并且实现工作正常:当我的网络驱动器不可用时,它会切换到本地日志文件,因此不应丢失任何日志记录。但是我从昨天开始就遇到了两个问题,无法解决或者发现,如何解决它。
无法返回初始记录配置:
当网络驱动器再次打开并且Logger可以写入旧目标时,log4j仍然会在本地驱动器上记录,我无法弄清楚,如何通知原始(主)Logger再次启动。我还尝试将第二个Appender连接到ErrorHandler,它应该镜像失败的主Logger,它尝试在网络目标上写入,当网络再次打开时,它会在本地和网络上记录这两个文件驾驶。但不幸的是它没有成功,我只得到一条失败的消息,即ErrorHandler内容不合适。
log4j:WARN The content of element type "errorHandler" must match "(param*,root-ref?,logger-ref*,appender-ref?)".
这是负责任的代码。
<appender name="TraceAppender" class="org.apache.log4j.DailyRollingFileAppender">
<!-- The second appender-ref "TestAppender" leads to the error. -->
<errorHandler class="org.apache.log4j.varia.FallbackErrorHandler">
<logger-ref ref="com.idoh"/>
<appender-ref ref="TraceFallbackAppender"/>
<appender-ref ref="TestAppender"/>
</errorHandler>
<param name="datePattern" value=".yyyy-MM-dd" />
<param name="file" value="logs/Trace.txt" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-6r %d{HH:mm:ss,SSS} [%t] %-5p - %m%n"/>
</layout>
</appender>
那么,我怎么能触发log4j重置为初始配置或者保持与“Local-Logger”并行的第二个appender。我的应用程序应该单独工作,不必经常重新启动。
编辑:另一个相关但更一般的问题:断开连接后,即使重新连接后,我的所有Fileappender(无法写入目的地)都会停止工作。引发的错误是:log4j:ERROR Failed to flush writer,
java.io.IOException: Der angegebene Netzwerkname ist nicht mehr verfügbar
(which means, that the stated networkname isn´t reachable)
错误本身很安静,但在此之后没有Logger工作。
/ EDIT
吞下第一条错误消息:
我认识到,导致主要记录器和FallbackErrorHandler之间切换的第一条消息(例如对readonly-File的记录请求)被吞下,因此主记录器都没有记录它(因为它但是,备份记录器也不知道错过了什么。所以其他人都遇到了这个问题,可以解决吗?或者有任何建议吗?