我正在开发一个客户端-服务器应用程序,并且想要实现一个灵活的 Logging 框架,所以我选择了 log4j,它不再真正发展,但它仍然是一个方便的框架。
因为日志记录是沿着网络进行的,所以我想要一个针对网络驱动器不可用的情况的解决方案,因此记录器必须更改其目标文件。
现在我想使用 Log4j 库中的 FallbackErrorHandler (用 XML 文件配置)并且实现有效:当我的网络驱动器不可用时,它会切换到本地日志文件,因此不会丢失任何日志记录。但我从昨天开始就解决了两个问题,但无法弄清楚或找出如何解决它。
不返回初始日志记录配置:
当网络驱动器再次打开并且记录器可以写入旧目标时,log4j 仍然在本地驱动器上记录,我不知道如何通知原始(主)记录器重新启动。我还尝试将第二个 Appender 附加到 ErrorHandler,它应该镜像失败的主 Logger,它尝试在网络目标上写入,当网络再次打开时,它会记录本地和网络上的两个文件驾驶。但不幸的是它没有成功,我只收到一条错误消息,指出 ErrorHandler-content 不适合。
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 重置为初始配置或保持与“本地记录器”并行的第二个附加程序。我的应用程序应该自行运行,并且不必经常重新启动。
编辑:另一个相关但更普遍的问题:断开连接后,我所有的 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)
错误本身是可以预料的,但在此之后没有记录器正在工作则不然。
/EDIT
第一个错误消息被吞掉:
我认识到,导致主记录器和 FallbackErrorHandler 之间切换的第一条消息(例如对只读文件的记录请求)被吞没,因此主记录器都不会记录它(因为它不能)备份记录器也不知道它错过了什么。那么其他人遇到这个问题并且可以解决它吗?或者有什么建议吗?