Я работаю над клиент-серверным приложением и хотел реализовать гибкую структуру ведения журнала, поэтому я выбрал log4j, который на самом деле больше не развивается, но по-прежнему удобен для использования.
Поскольку ведение журнала происходит по сети, я хотел найти решение для случая, когда сетевой диск недоступен, поэтому регистратор должен изменить файл (ы) назначения.
Теперь я хотел использовать FallbackErrorHandler (настроенный с помощью XML-файла) из библиотеки Log4j, и реализация сработала: когда мой сетевой диск недоступен, он переключается на локальный файл журнала, поэтому запись в журнал не должна быть потеряна , Но со вчерашнего дня я столкнулся с двумя проблемами и не мог понять, как их решить.
Нет возврата к исходной конфигурации ведения журнала:
Когда сетевой диск снова включен и 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». Мое приложение должно работать само по себе, и его не нужно часто перезапускать.
РЕДАКТИРОВАТЬ: еще один связанный, но более общий вопрос: после отключения все мои Fileappenders (которые не могли записать туда), перестают работать, даже после повторного подключения. Выдается ошибка:
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 (например, запрос на запись в файл только для чтения), проглатывается, поэтому ни один основной регистратор не регистрирует его (потому что оно не может), ни резервный Logger знает, что он пропустил. Так кто-нибудь еще сталкивался с этой проблемой и мог ее решить? Или есть предложения?