log4j ContentAppender пусто, когда статический - PullRequest
0 голосов
/ 10 июня 2011

Когда ConsoleAppender статичен, я получаю следующую ошибку из log4j:

log4j:ERROR Attempted to append to closed appender named [null].

Пример кода:

import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
public class Logging {
    private static final PatternLayout layout = new PatternLayout("[%d{dd MMM yyyy HH:mm:ss}] [%t] %-6r %-5p %m\n");
    private static final ConsoleAppender consoleAppender = new ConsoleAppender(layout);
    private Logger logger;
    private String filterClass;
    private boolean logFlag = false;

    public LoggingExample(Class c) {
        logger = Logger.getLogger(c);
        logger.setAdditivity(false);
        logger.removeAllAppenders();
        logger.addAppender(consoleAppender);
        consoleAppender.activateOptions();
        filterClass = c.getName();
    }

    public log() {
        logger.info("this doesn't work when ConsoleAppender is static!");
    }
}

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Это происходит из-за того, что removeAllAppenders() удаляет, а закрывает всех дополнений и основных авторов. Средство записи вашего консольного приложения также закрывается, когда вы делаете это , потому что консольное приложение уже подключено к регистратору по умолчанию , если вы когда-либо создаете более одного экземпляра LoggingExample.

0 голосов
/ 10 июня 2011

Мне кажется, это как-то связано с инициализацией макета или консоли приложения.Как узнать, что макет или consoleAppender не удалось построить?

Я буду использовать Статический блок инициализации для выполнения любой логики, необходимой для создания статических объектов:

    public class Logging {
        private static final PatternLayout layout;
        private static final ConsoleAppender consoleAppender;

        static { /* code to initialize layout and consoloAppender  */}
        // Rest of your code
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...