开发者

log4j configuration file error detection

I'开发者_如何学运维m currently writing a logger utilizing log4j. Once I load in a log4j.properties or a log4j.xml file, I was wondering if there was a way to detect if the logger configuration file is valid. If it isn't valid, I was hoping to load a default setting (that's located in another file) instead.

Thanks


We solved this problem by redirecting System.err before loading the configuration and checking if errors were logged to the stream:

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();
    }
}


You can only try to check manually for a logger being existent or not.

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

Like: LogManager.exists("your logger name");

Additionally you can check if your xml is valid or not with validating it against the DTD.

But what is the definition for a "valid" log file? If its only syntax based use DTD validation and check if the property file is in a good format.

If a file is valid if it has a specific constellation use the manual approach above.

Hope that helps, Christian

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜