Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在独立JBoss中配置自定义日志_Java_Docker_Wildfly_Jboss7.x_Log4j2 - Fatal编程技术网

Java 如何在独立JBoss中配置自定义日志

Java 如何在独立JBoss中配置自定义日志,java,docker,wildfly,jboss7.x,log4j2,Java,Docker,Wildfly,Jboss7.x,Log4j2,我正在尝试为在Docker映像中运行于JBoss EAP 7.2之上的应用程序设置自定义日志配置(在外部文件中),但我还无法使其正常工作 我有一个使用外部log4j2.xml文件进行日志配置的应用程序。此文件的路径在属性-Dlog4j.configurationFile中设置 该应用程序在JBoss EAP 7.2中运行,当我在本地(Windows)中运行它时,日志配置已正确定义,可以在Eclipse中运行它(在服务器-->启动配置-->程序参数中设置属性),也可以直接执行standalone.

我正在尝试为在Docker映像中运行于JBoss EAP 7.2之上的应用程序设置自定义日志配置(在外部文件中),但我还无法使其正常工作

我有一个使用外部log4j2.xml文件进行日志配置的应用程序。此文件的路径在属性-Dlog4j.configurationFile中设置

该应用程序在JBoss EAP 7.2中运行,当我在本地(Windows)中运行它时,日志配置已正确定义,可以在Eclipse中运行它(在服务器-->启动配置-->程序参数中设置属性),也可以直接执行standalone.bat(在standalone.conf.bat文件中设置属性)

当我试图在Docker映像中执行应用程序时,问题就出现了(我想在Linux操作系统中也会出现同样的情况)。我对日志扩展和子系统进行了注释,应用程序正确启动,但没有日志。 我在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
无法加载Logmanager“org.jboss.Logmanager.Logmanager”
java.lang.ClassNotFoundException:org.jboss.logmanager.logmanager
位于java.net.URLClassLoader.findClass(URLClassLoader.java:382)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
位于org.jboss.modules.jdksspecific.getSystemClass(jdksspecific.java:180)
位于org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:395)
位于org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
在java.util.logging.LogManager$1.run(LogManager.java:195)
在java.util.logging.LogManager$1.run(LogManager.java:181)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.util.logging.LogManager。(LogManager.java:181)
位于org.jboss.modules.Main.Main(Main.java:523)
警告:无法加载指定的日志管理器类org.jboss.logmanager.logmanager
线程“main”java.lang.NoClassDefFoundError中出现异常:org/jboss/logmanager/Level
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:348)
位于org.jboss.modules.Module.run(Module.java:340)
位于org.jboss.modules.Module.run(Module.java:320)
位于org.jboss.modules.Main.Main(Main.java:593)
原因:java.lang.ClassNotFoundException:org.jboss.logmanager.Level
位于java.net.URLClassLoader.findClass(URLClassLoader.java:382)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
位于org.jboss.modules.jdksspecific.getSystemClass(jdksspecific.java:180)
位于org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:395)
位于org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
... 还有5个
的确,在最初的standalone.conf中有一些对“LogManager”的引用,如果我还原它们,应用程序将再次启动,但没有日志。这让我觉得这个把戏和它有关

我尝试过其他替代方法,比如在standalone.xml中设置
,并将log4j2.xml文件定位到应用程序的WAR中,这是可行的,但我需要将该文件移出应用程序


如果您有任何想法或建议,我将不胜感激。

您是否尝试过将
使用部署日志记录配置设置为
false
?默认值为
true
,如果您想使用自己的log4j2配置,听起来您可能希望将其设置为
false
。您可能还需要将
添加日志api依赖项
设置为
false
。我现在已经尝试过:
(使用
true
),但是在这种情况下,有必要将log4j2.xml包含到WARYes的/WEB-INF/classes目录中。您可能需要在部署中包含log4j2.xml配置文件。问题是,该文件必须是外部文件。如果没有其他选择,我们可以考虑一下,但是如果它在Windows的JBoss中正常工作,在Windows和Unix的Wildfly中正常工作,那么在UnixI中JBoss应该有另一种方法。我不是Docker专家,但你需要用Docker的方法。它在WildFly和EAP7.2中确实应该是一样的。