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

Reply via email to