Repository: logging-log4j2 Updated Branches: refs/heads/master ef321c140 -> eb82f77c0
LOG4J2-1528 Serialize configuration into a log4j2.xml file Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/446fb87a Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/446fb87a Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/446fb87a Branch: refs/heads/master Commit: 446fb87af4ccaab777280730fde921948eb4425f Parents: 0728abc Author: Mikael Ståldal <[email protected]> Authored: Wed Aug 17 22:20:44 2016 +0200 Committer: Mikael Ståldal <[email protected]> Committed: Wed Aug 17 22:20:44 2016 +0200 ---------------------------------------------------------------------- .../builder/api/ConfigurationBuilder.java | 17 +++ .../impl/DefaultConfigurationBuilder.java | 113 +++++++++++++++++++ 2 files changed, 130 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/446fb87a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java index 1fbfa01..2e7ef96 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java @@ -22,6 +22,9 @@ import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.ConfigurationSource; import org.apache.logging.log4j.core.util.Builder; +import java.io.IOException; +import java.io.OutputStream; + /** * Interface for building logging configurations. * @param <T> The Configuration type created by this builder. @@ -405,4 +408,18 @@ public interface ConfigurationBuilder<T extends Configuration> extends Builder<T * @return The constructed Configuration. */ T build(boolean initialize); + + /** + * Write an XML configuration file from this builder. + * + * @param output OutputStream to write to, will not be closed + */ + void writeXmlConfigurationFile(OutputStream output) throws IOException; + + /** + * Write an XML configuration from this builder. + * + * @return XML configuration + */ + String writeXmlConfiguration(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/446fb87a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java index 38b4fdb..6666486 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java @@ -16,8 +16,12 @@ */ package org.apache.logging.log4j.core.config.builder.impl; +import java.io.IOException; +import java.io.OutputStream; +import java.io.StringWriter; import java.lang.reflect.Constructor; import java.util.List; +import java.util.Map; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.Filter; @@ -38,6 +42,10 @@ import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuild import org.apache.logging.log4j.core.config.builder.api.ScriptComponentBuilder; import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuilder; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; + /** * @param <T> The BuiltConfiguration type. * @since 2.4 @@ -188,6 +196,111 @@ public class DefaultConfigurationBuilder<T extends BuiltConfiguration> implement } @Override + public void writeXmlConfigurationFile(OutputStream output) throws IOException { + try { + XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(output); + writeConfigurationXml(xmlWriter); + xmlWriter.close(); + } catch (XMLStreamException e) { + if (e.getNestedException() instanceof IOException) { + throw (IOException)e.getNestedException(); + } else { + throw new RuntimeException(e); + } + } + } + + @Override + public String writeXmlConfiguration() { + StringWriter sw = new StringWriter(); + try { + XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(sw); + writeConfigurationXml(xmlWriter); + xmlWriter.close(); + } catch (XMLStreamException e) { + throw new RuntimeException(e); + } + return sw.toString(); + } + + private void writeConfigurationXml(XMLStreamWriter xmlWriter) throws XMLStreamException { + xmlWriter.writeStartDocument(); + xmlWriter.writeCharacters(System.lineSeparator()); + + xmlWriter.writeStartElement("Configuration"); + if (name != null) { + xmlWriter.writeAttribute("name", name); + } + if (level != null) { + xmlWriter.writeAttribute("status", level.name()); + } + if (verbosity != null) { + xmlWriter.writeAttribute("verbose", verbosity); + } + if (destination != null) { + xmlWriter.writeAttribute("dest", destination); + } + if (packages != null) { + xmlWriter.writeAttribute("packages", packages); + } + if (shutdownFlag != null) { + xmlWriter.writeAttribute("shutdownHook", shutdownFlag); + } + if (advertiser != null) { + xmlWriter.writeAttribute("advertiser", advertiser); + } + if (monitorInterval > 0) { + xmlWriter.writeAttribute("monitorInterval", String.valueOf(monitorInterval)); + } + + xmlWriter.writeCharacters(System.lineSeparator()); + + for (Component component : root.getComponents()) { + if (!component.getAttributes().isEmpty() || !component.getComponents().isEmpty() || component.getValue() != null) { + writeComponentXml(xmlWriter, component, 1); + } + } + + xmlWriter.writeEndElement(); // "Configuration" + + xmlWriter.writeEndDocument(); + } + + private void writeComponentXml(XMLStreamWriter xmlWriter, Component component, int nesting) throws XMLStreamException { + if (!component.getComponents().isEmpty() || component.getValue() != null) { + indentXml(xmlWriter, nesting); + xmlWriter.writeStartElement(component.getPluginType()); + writeAttributesXml(xmlWriter, component); + xmlWriter.writeCharacters(System.lineSeparator()); + for (Component subComponent : component.getComponents()) { + writeComponentXml(xmlWriter, subComponent, nesting + 1); + } + if (component.getValue() != null) { + xmlWriter.writeCharacters(component.getValue()); + } + indentXml(xmlWriter, nesting); + xmlWriter.writeEndElement(); + } else { + indentXml(xmlWriter, nesting); + xmlWriter.writeEmptyElement(component.getPluginType()); + writeAttributesXml(xmlWriter, component); + } + xmlWriter.writeCharacters(System.lineSeparator()); + } + + private void indentXml(XMLStreamWriter xmlWriter, int nesting) throws XMLStreamException { + for (int i = 0; i < nesting; i++) { + xmlWriter.writeCharacters("\t"); + } + } + + private void writeAttributesXml(XMLStreamWriter xmlWriter, Component component) throws XMLStreamException { + for (Map.Entry<String, String> attribute : component.getAttributes().entrySet()) { + xmlWriter.writeAttribute(attribute.getKey(), attribute.getValue()); + } + } + + @Override public ScriptComponentBuilder newScript(final String name, final String language, final String text) { return new DefaultScriptComponentBuilder(this, name, language, text); }
