Обнаружение ошибки файла конфигурации log4j - PullRequest
7 голосов
/ 13 октября 2010

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 апреля 2012

Мы решили эту проблему, перенаправив 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();
    }
}
1 голос
/ 19 апреля 2011

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

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

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

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

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

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

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

...