Log4j: проблемы с FallbackErrorHandler - PullRequest
1 голос
/ 03 июня 2010

Я работаю над клиент-серверным приложением и хотел реализовать гибкую структуру ведения журнала, поэтому я выбрал 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 знает, что он пропустил. Так кто-нибудь еще сталкивался с этой проблемой и мог ее решить? Или есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...