我正在尝试为在Docker映像中运行JBoss EAP 7.2的应用程序设置自定义日志配置(在外部文件中),但我无法使其工作。
我有一个使用外部log4j2.xml文件进行日志记录配置的应用程序。该文件的路径在属性-Dlog4j.configurationFile中设置。
该应用程序在JBoss EAP 7.2中运行,并且当我在本地(Windows)中运行该日志记录配置时,它已正确定义,可以在eclipse中运行它(在服务器中设置属性->启动配置->程序参数)或直接执行standalone.bat(在standalone.conf.bat文件中设置属性)。
当我尝试在Docker映像中执行应用程序时就会出现问题(并且我想在Linux OS中也会发生同样的情况)。我评论了日志记录扩展名和子系统,并且应用程序正确启动,但是没有日志。 我在WildFly中尝试了完全相同的方法,并且在Windows和Docker映像中都可以正常工作。
考虑到JBoss和WildFly之间的共同点,我尽最大可能简化了JBoss的standalone.conf并使它类似于WildFly。
我已经评论了原始standalone.conf的这一部分:
. $JBOSS_HOME/bin/launch/files.sh
JBOSS_MODULES_JAR=$(getfiles jboss-modules)
JBOSS_LOGMANAGER_JAR=$(getfiles org/jboss/logmanager/main/jboss-logmanager)
WILDFLY_COMMON_JAR=$(getfiles org/wildfly/common/main/wildfly-common)
# for newer WF,these modules have changed names. We try the old ones first
# then the new ones for compatability
JBOSS_JSON_JAR=$(getfiles org/wildfly/javax/json/main/javax.json-1)
if [ $? -ne "0" ]; then
JBOSS_JSON_JAR=$(getfiles org/glassfish/javax/json/main/javax.json-1)
fi
if [ $? -ne "0" ]; then
echo Unable to locate a javax.json JAR,aborting.
exit 1
fi
JBOSS_JSON_API_JAR=$(getfiles org/wildfly/javax/json/main/javax.json-api)
if [ $? -ne "0" ]; then
JBOSS_JSON_API_JAR=$(getfiles javax/json/api/main/javax.json-api)
fi
if [ $? -ne "0" ]; then
echo Unable to locate a javax.json API JAR,aborting.
exit 1
fi
AB_JOLOKIA_PORT=$((${AB_JOLOKIA_PORT:-8778} + ${PORT_OFFSET:-0}))
export AB_JOLOKIA_PORT
# add jolokia options
JAVA_OPTS="${JAVA_OPTS} $(/opt/jolokia/jolokia-opts)"
JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:${JBOSS_MODULES_JAR}:${JBOSS_LOGMANAGER_JAR}:${JBOSS_JSON_JAR}:${JBOSS_JSON_API_JAR}:${WILDFLY_COMMON_JAR} -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
source /usr/local/dynamic-resources/dynamic_resources.sh
export GC_MAX_MetaSPACE_SIZE=${GC_MAX_MetaSPACE_SIZE:-256}
JAVA_OPTS="$(adjust_java_options ${JAVA_OPTS})"
# Make sure that we use /dev/urandom (CLOUD-422)
JAVA_OPTS="${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom"
# White list packages for use in ObjectMessages: CLOUD-703
if [ -n "$MQ_SERIALIZABLE_PACKAGES" ]; then
JAVA_OPTS="${JAVA_OPTS} -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=${MQ_SERIALIZABLE_PACKAGES}"
fi
# Append to JAVA_OPTS. Necessary to prevent some values being omitted if JAVA_OPTS is defined directly
JAVA_OPTS="$JAVA_OPTS $JAVA_OPTS_APPEND"
# add hawkular options
if [ -n "${AB_HAWKULAR_REST_URL:+x}" ]; then
# we need to configure java logging for hawkular
AB_HAWKULAR_AGENT_OPTS="$(source /opt/hawkular/hawkular-opts && get_hawkular_opts) -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
JAVA_OPTS="${JAVA_OPTS} ${AB_HAWKULAR_AGENT_OPTS}"
fi
# add prometheus options
JAVA_OPTS="${JAVA_OPTS} $(source ${JBOSS_CONTAINER_PROMETHEUS_MODULE}/prometheus-opts && get_prometheus_opts)"
但是失败了:
Could not load Logmanager "org.jboss.logmanager.LogManager"
java.lang.ClassnotFoundException: org.jboss.logmanager.LogManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.jboss.modules.JDKSpecific.getSystemClass(JDKSpecific.java:180)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:395)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
at java.util.logging.LogManager$1.run(LogManager.java:195)
at java.util.logging.LogManager$1.run(LogManager.java:181)
at java.security.accessController.doPrivileged(Native Method)
at java.util.logging.LogManager.<clinit>(LogManager.java:181)
at org.jboss.modules.Main.main(Main.java:523)
WARNING: Failed to load the specified log manager class org.jboss.logmanager.LogManager
Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/logmanager/Level
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.jboss.modules.Module.run(Module.java:340)
at org.jboss.modules.Module.run(Module.java:320)
at org.jboss.modules.Main.main(Main.java:593)
Caused by: java.lang.ClassnotFoundException: org.jboss.logmanager.Level
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.jboss.modules.JDKSpecific.getSystemClass(JDKSpecific.java:180)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:395)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
... 5 more
的确,在原始的standalone.conf中,有一些对“ LogManager”的引用,如果我还原它们,应用程序将再次启动,但没有日志。因此,这使我认为技巧与之相关。
我尝试了其他替代方法,例如在standalone.xml中设置<use-deployment-logging-config value =" true "/>
并将log4j2.xml文件定位到应用程序的WAR中,并且它可以工作,但是我需要将该文件移出应用程序。
我将不胜感激任何想法或建议。