Martin Peřina has uploaded a new change for review. Change subject: tools: Add runtime log4j setup to engine-config ......................................................................
tools: Add runtime log4j setup to engine-config 1) Moves default log4j.xml for engine-config into tools.jar 2) By default logging is off 3) Adds --log-file which sets file to write logging messages into 4) Adds --log-level which sets logging level for logger specified with --log-file (it's set to INFO by default) 5) Adds --log4j-config which sets filename or URL with custom log4j.xml file to setup logging Change-Id: I328a018ef1b714c6a90d1b219dcd326a16bcab2d Bug-Url: https://bugzilla.redhat.com/1063901 Signed-off-by: Martin Perina <mper...@redhat.com> --- M Makefile M backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfig.java M backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigCLIParser.java A backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigExecutor.java M backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigMap.java M backend/manager/tools/src/main/java/org/ovirt/engine/core/config/OptionKey.java A backend/manager/tools/src/main/resources/engine-config/log4j.xml M backend/manager/tools/src/test/java/org/ovirt/engine/core/config/EngineConfigTest.java M ovirt-engine.spec.in M packaging/bin/engine-config.sh D packaging/etc/engine-config/log4j.xml.in M packaging/man/man8/engine-config.8 12 files changed, 137 insertions(+), 76 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/21/26821/1 diff --git a/Makefile b/Makefile index 19a6960..29fb82b 100644 --- a/Makefile +++ b/Makefile @@ -162,7 +162,6 @@ packaging/bin/engine-prolog.sh \ packaging/bin/ovirt-engine-log-setup-event.sh \ packaging/bin/pki-common.sh \ - packaging/etc/engine-config/log4j.xml \ packaging/etc/engine-manage-domains/engine-manage-domains.conf \ packaging/etc/engine-manage-domains/log4j.xml \ packaging/etc/engine.conf.d/README \ diff --git a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfig.java b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfig.java index 046a81b..025013d 100644 --- a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfig.java +++ b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfig.java @@ -1,17 +1,9 @@ package org.ovirt.engine.core.config; import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import javax.xml.parsers.FactoryConfigurationError; - -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.LogManager; import org.apache.log4j.Logger; -import org.apache.log4j.xml.DOMConfigurator; import org.ovirt.engine.core.config.validation.ConfigActionType; -import org.ovirt.engine.core.tools.ToolConsole; import org.ovirt.engine.core.utils.EngineLocalConfig; /** @@ -20,9 +12,6 @@ public class EngineConfig { // The log: private static final Logger log = Logger.getLogger(EngineConfig.class); - - // The console: - private static final ToolConsole console = ToolConsole.getInstance(); public static final String CONFIG_FILE_PATH_PROPERTY = "engine-config.config.file.path"; public static final File DEFAULT_CONFIG_PATH = new File(EngineLocalConfig.getInstance().getEtcDir(), "engine-config"); @@ -47,42 +36,6 @@ actionType.validate(parser.getEngineConfigMap()); setEngineConfigLogic(new EngineConfigLogic(parser)); engineConfigLogic.execute(); - } - - /** - * Initializes logging configuration - */ - private static void initLogging() { - String cfgFile = System.getProperty("log4j.configuration"); - if (StringUtils.isNotBlank(cfgFile)) { - try { - URL url = new URL(cfgFile); - LogManager.resetConfiguration(); - DOMConfigurator.configure(url); - } catch (FactoryConfigurationError | MalformedURLException ex) { - System.out.println("Cannot configure logging: " + ex.getMessage()); - } - } - } - - /** - * The main method, instantiates the parser and executes. - * - * @param args - * The arguments given by the user. - */ - public static void main(String... args) { - initLogging(); - try { - EngineConfigCLIParser parser = new EngineConfigCLIParser(); - parser.parse(args); - getInstance().setUpAndExecute(parser); - - } catch (Throwable t) { - log.debug("Exiting with error: ", t); - console.writeErrorLine(t.getMessage()); - System.exit(1); - } } public void setEngineConfigLogic(EngineConfigLogic engineConfigLogic) { diff --git a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigCLIParser.java b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigCLIParser.java index 29f0152..cb1505d 100644 --- a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigCLIParser.java +++ b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigCLIParser.java @@ -258,6 +258,9 @@ engineConfigMap.setUser(parseOptionKey(OptionKey.OPTION_USER)); engineConfigMap.setAdminPassFile(parseOptionKey(OptionKey.OPTION_ADMINPASSFILE)); engineConfigMap.setOnlyReloadable(parseOptionKey(OptionKey.OPTION_ONLY_RELOADABLE)); + engineConfigMap.setLogFile(parseOptionKey(OptionKey.OPTION_LOG_FILE)); + engineConfigMap.setLogLevel(parseOptionKey(OptionKey.OPTION_LOG_LEVEL)); + engineConfigMap.setLog4jConfig(parseOptionKey(OptionKey.OPTION_LOG4J_CONFIG)); } public EngineConfigMap getEngineConfigMap() { diff --git a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigExecutor.java b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigExecutor.java new file mode 100644 index 0000000..489b811 --- /dev/null +++ b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigExecutor.java @@ -0,0 +1,55 @@ +package org.ovirt.engine.core.config; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; + +import org.apache.log4j.Logger; +import org.ovirt.engine.core.utils.log.Log4jUtils; + +/** + * Parses command line arguments, setups logging and executes engine config + */ +public class EngineConfigExecutor { + public static void setupLogging(String log4jConfig, String logFile, String logLevel) { + URL cfgFileUrl = null; + try { + if (log4jConfig == null) { + cfgFileUrl = EngineConfigExecutor.class.getResource("/engine-config/log4j.xml"); + } else { + cfgFileUrl = new File(log4jConfig).toURI().toURL(); + } + Log4jUtils.setupLogging(cfgFileUrl); + } catch (MalformedURLException ex) { + throw new IllegalArgumentException( + String.format("Error loading log4j configuration from '%s': %s", cfgFileUrl, ex.getMessage()), + ex); + } + + if (logFile != null) { + Log4jUtils.addFileAppender(logFile, logLevel); + } + } + + public static void main(String... args) { + EngineConfigCLIParser parser = null; + try { + parser = new EngineConfigCLIParser(); + parser.parse(args); + + EngineConfigMap argsMap = parser.getEngineConfigMap(); + setupLogging(argsMap.getLog4jConfig(), argsMap.getLogFile(), argsMap.getLogLevel()); + } catch (Throwable t) { + System.out.println(t.getMessage()); + System.exit(1); + } + + try { + EngineConfig.getInstance().setUpAndExecute(parser); + } catch (Throwable t) { + Logger.getLogger(EngineConfigExecutor.class).debug("Exiting with error: ", t); + System.out.println(t.getMessage()); + System.exit(1); + } + } +} diff --git a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigMap.java b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigMap.java index 856ed88..204103d 100644 --- a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigMap.java +++ b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/EngineConfigMap.java @@ -16,6 +16,9 @@ private String user; private String adminPassFile; private boolean onlyReloadable; + private String logFile; + private String logLevel; + private String log4jConfig; public boolean isOnlyReloadable() { return onlyReloadable; @@ -92,6 +95,30 @@ this.alternatePropertiesFile = alternatePropertiesFile; } + public String getLogFile() { + return logFile; + } + + public void setLogFile(String logFile) { + this.logFile = logFile; + } + + public String getLogLevel() { + return logLevel; + } + + public void setLogLevel(String logLevel) { + this.logLevel = logLevel; + } + + public String getLog4jConfig() { + return log4jConfig; + } + + public void setLog4jConfig(String log4jConfig) { + this.log4jConfig = log4jConfig; + } + @Override public String toString() { final String SEPARATOR = ", "; @@ -104,7 +131,11 @@ .append("key = ").append(this.key).append(SEPARATOR) .append("value = ").append(this.value).append(SEPARATOR) .append("alternateConfigFile = ").append(this.alternateConfigFile).append(SEPARATOR) - .append("alternatePropertiesFile = ").append(this.alternatePropertiesFile).append(" )"); + .append("alternatePropertiesFile = ").append(this.alternatePropertiesFile).append(SEPARATOR) + .append("logFile = ").append(this.logFile).append(SEPARATOR) + .append("logLevel = ").append(this.logLevel).append(SEPARATOR) + .append("log4jConfig = ").append(this.log4jConfig).append(SEPARATOR) + .append(" )"); return retValue.toString(); } diff --git a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/OptionKey.java b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/OptionKey.java index e4c3394..2056a86 100644 --- a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/OptionKey.java +++ b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/OptionKey.java @@ -13,7 +13,10 @@ OPTION_VERSION(Arrays.asList(new String[] { "--cver" })), OPTION_USER(Arrays.asList(new String[] { "-u", "--user" })), OPTION_ADMINPASSFILE(Arrays.asList(new String[] { "--admin-pass-file" })), - OPTION_ONLY_RELOADABLE(Arrays.asList(new String[] { "-o", "--only-reloadable" })); + OPTION_ONLY_RELOADABLE(Arrays.asList(new String[] { "-o", "--only-reloadable" })), + OPTION_LOG_FILE(Arrays.asList(new String[] { "--log-file" })), + OPTION_LOG_LEVEL(Arrays.asList(new String[] { "--log-level" })), + OPTION_LOG4J_CONFIG(Arrays.asList(new String[] { "--log4j-config" })); private List<String> optionalStrings; diff --git a/backend/manager/tools/src/main/resources/engine-config/log4j.xml b/backend/manager/tools/src/main/resources/engine-config/log4j.xml new file mode 100644 index 0000000..7b0580b --- /dev/null +++ b/backend/manager/tools/src/main/resources/engine-config/log4j.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> + +<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> + <appender name="null-appender" class="org.apache.log4j.varia.NullAppender" /> + <root> + <level value="DEBUG"/> + <!-- + We need this, because log4j writes warning messages to stderr + if no appender is configured and we add appender only if proper + command line argument is specified. + --> + <appender-ref ref="null-appender" /> + </root> +</log4j:configuration> diff --git a/backend/manager/tools/src/test/java/org/ovirt/engine/core/config/EngineConfigTest.java b/backend/manager/tools/src/test/java/org/ovirt/engine/core/config/EngineConfigTest.java index 6a13f63..c226d80 100644 --- a/backend/manager/tools/src/test/java/org/ovirt/engine/core/config/EngineConfigTest.java +++ b/backend/manager/tools/src/test/java/org/ovirt/engine/core/config/EngineConfigTest.java @@ -27,7 +27,7 @@ // get the real path of the config file final String path = URLDecoder.decode(ClassLoader.getSystemResource("engine-config.conf").getPath(), "UTF-8"); Assert.assertNotNull(path); - EngineConfig.main("-a", "--config=" + path); + EngineConfigExecutor.main("-a", "--config=" + path); } @Test diff --git a/ovirt-engine.spec.in b/ovirt-engine.spec.in index b434954..3b6b0c4 100644 --- a/ovirt-engine.spec.in +++ b/ovirt-engine.spec.in @@ -1006,7 +1006,6 @@ %{engine_data}/conf/jaas.conf %{engine_data}/services/ovirt-engine-notifier %{engine_etc}/engine-config/engine-config.*properties -%{engine_etc}/engine-config/log4j.xml %{engine_etc}/engine-manage-domains/log4j.xml %{engine_etc}/notifier/notifier.conf.d/ %{engine_java}/tools.jar diff --git a/packaging/bin/engine-config.sh b/packaging/bin/engine-config.sh index 56ea1d1..60f17a6 100755 --- a/packaging/bin/engine-config.sh +++ b/packaging/bin/engine-config.sh @@ -37,6 +37,15 @@ -c CFG_FILE, --config=CFG_FILE Use the given alternate configuration file. + --log-file=LOG_FILE + Sets file to write logging into (if not set nothing is logged). + + --log-level=LOG_LEVEL + Sets log level, one of DEBUG (default), INFO, WARN, ERROR (case insensitive). + + --log4j-config=XML_FILE + Sets log4j.xml file which logging configuration is loaded from. + SETTING PASSWORDS Passwords can be set in interactive mode: @@ -98,9 +107,8 @@ # exec "${JAVA_HOME}/bin/java" \ - -Dlog4j.configuration="file:${ENGINE_ETC}/engine-config/log4j.xml" \ -Djboss.modules.write-indexes=false \ -jar "${JBOSS_HOME}/jboss-modules.jar" \ -dependencies org.ovirt.engine.core.tools \ - -class org.ovirt.engine.core.config.EngineConfig \ + -class org.ovirt.engine.core.config.EngineConfigExecutor \ "$@" diff --git a/packaging/etc/engine-config/log4j.xml.in b/packaging/etc/engine-config/log4j.xml.in deleted file mode 100644 index 63a8db3..0000000 --- a/packaging/etc/engine-config/log4j.xml.in +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> - - <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> - <param name="File" value="@ENGINE_LOG@/engine-config.log"/> - <param name="Append" value="true"/> - <param name="MaxFileSize" value="1500KB"/> - <param name="MaxBackupIndex" value="1"/> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> - </layout> - </appender> - - <root> - <priority value="DEBUG"/> - <appender-ref ref="FILE"/> - </root> - -</log4j:configuration> diff --git a/packaging/man/man8/engine-config.8 b/packaging/man/man8/engine-config.8 index ff0de96..172d7c4 100644 --- a/packaging/man/man8/engine-config.8 +++ b/packaging/man/man8/engine-config.8 @@ -45,6 +45,22 @@ .RS 4 Use the given alternate configuration file. .RE +.PP +\fB\-\-log\-file\fR=\fILOG_FILE\fR +.RS 4 +Sets file to write logging into (if not set nothing is logged). +.RE +.PP +\fB\-\-log\-level\fR=\fILOG_LEVEL\fR +.RS 4 +Sets log level, one of DEBUG (default), INFO, WARN, ERROR (case insensitive). +.RE +.PP +\fB\-\-log4j\-config\fR=\fIXML_FILE\fR +.RS 4 +Sets log4j.xml file which logging configuration is loaded from. +.RE + .SH SETTING PASSWORDS Passwords can be set in interactive mode: .RS 4 -- To view, visit http://gerrit.ovirt.org/26821 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I328a018ef1b714c6a90d1b219dcd326a16bcab2d Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Martin Peřina <mper...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches