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();
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With