Обнаружение ошибок файла конфигурации log4j

В настоящее время я пишу регистратор, использующий log4j. Как только я загрузил файл log4j.properties или log4j.xml, мне стало интересно, есть ли способ определить, действителен ли файл конфигурации регистратора. Если он недействителен, я надеялся вместо этого загрузить настройку по умолчанию (которая находится в другом файле).

Спасибо


person user459811    schedule 13.10.2010    source источник
comment
Да, это чертовски раздражает, согласен. Но я не думаю, что ты сможешь это сделать.   -  person skaffman    schedule 13.10.2010
comment
Я немного погуглил, и ничего не оказалось. Я надеялся, что переполнение стека даст мне ответ, но я полагаю, что мне просто придется полагаться на хороший ввод пользователя, если они решат изменить файл. Спасибо за ваш ответ! :)   -  person user459811    schedule 14.10.2010


Ответы (2)


Мы решили эту проблему, перенаправив System.err перед загрузкой конфигурации и проверив, были ли зарегистрированы ошибки в потоке:

class ConfigurationLoader {
    class Log4jConfigStderrStream extends ByteArrayOutputStream {
        private int lineCount;

        private StringBuilder output;

        private PrintStream underlying;

        public Log4jConfigStderrStream(PrintStream underlying) {
            this.lineCount = 0;
            this.output = new StringBuilder("");
            this.underlying = underlying;
        }

        @Override
        public void flush() throws IOException {
            String[] buffer;
            synchronized (this) {
                buffer = this.toString().split("\n");
                super.flush();
                super.reset();
                for (int i = 0; i < buffer.length; i++) {
                    String line = buffer[i].replace("\n", "").replace("\r",
                            "");
                    if (line.length() > 0) {
                        this.lineCount++;
                        this.output.append(line);
                        this.output.append("\n");
                    }
                }
            }
        }

        public String getOutput() {
            return this.output.toString();
        }

        public PrintStream getUnderlying() {
            return this.underlying;
        }

        public boolean hasErrors() {
            return this.lineCount == 0 ? false : true;
        }
    }

    private String output;

    public void flushOutput() {
        if (!"".equals(this.output))
            System.err.print(this.output);
    }

    public boolean loadConfiguration(String filename) {
        Log4jConfigStderrStream confErr;
        confErr = new Log4jConfigStderrStream(System.err);
        System.setErr(new PrintStream(confErr, true));
        LogManager.resetConfiguration();
        DOMConfigurator.configure(filename);
        System.setErr(confErr.getUnderlying());
        this.output = confErr.getOutput();
        return !confErr.hasErrors();
    }
}
person Björn    schedule 18.04.2012

Вы можете только попробовать вручную проверить, существует ли регистратор или нет.

http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/LogManager.java?view=markup

Например: LogManager.exists ("ваше имя регистратора");

Кроме того, вы можете проверить, действителен ли ваш xml, проверив его по DTD.

Но каково определение «действительного» файла журнала? Если он основан только на синтаксисе, используйте проверку DTD и проверьте, находится ли файл свойств в хорошем формате.

Если файл действителен, если в нем есть определенное созвездие, используйте ручной подход, описанный выше.

Надеюсь, это поможет, Кристиан

person Christian    schedule 19.04.2011