覆盖 WildFly 中的日志记录
Posted
技术标签:
【中文标题】覆盖 WildFly 中的日志记录【英文标题】:Override logging in WildFly 【发布时间】:2014-03-17 18:24:46 【问题描述】:我使用了 tomcat 并简单地覆盖了默认的日志记录系统。如何在我的 Spring 应用中启用 Wildfly 上的 logback 日志记录?
我的 Logback.xml 在 tomcat 上运行
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger35 - %msg %n</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="WARN" />
<logger name="com.citronium.planstery" level="INFO" />
<logger name="org.apache.http.impl.conn.tsccm" level="ERROR" />
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
【问题讨论】:
我不能完全回答你的问题,但我可以给你指点。请检查此thread。覆盖 JBossLogging 不再那么简单了。凭借他们新的模块化类加载架构,重写日志框架已成为一种开销。我们遇到了类似的问题并决定使用 SLf4J+JBossLogging 组合。 Maxim 查看日期。我的问题以前是 【参考方案1】:您可以使用 logback 在您的应用程序中配置日志记录。您不能使用 logback 为服务器配置日志记录。
要在您的配置中使用 logback,您需要将 add-logging-api-dependencies
更改为 false
或创建一个排除子系统的 jboss-deployment-structure.xml
。您还需要在部署中包含 logback 和 slf4j。
更改add-logging-api-dependencies
的第一个选项是所有部署的全局设置。以下 CLI 命令将更改该值:
/subsystem=logging:write-attribute(name=add-logging-api-dependencies,value=false)
此选项不会将任何 implicit 日志记录依赖项添加到您的部署中。
使用jboss-deployment-structure.xml
的第二个选项将仅为您的部署禁用日志记录子系统。下面是一个示例文件:
<jboss-deployment-structure>
<deployment>
<!-- exclude-subsystem prevents a subsystems deployment unit processors running on a deployment -->
<!-- which gives basically the same effect as removing the subsystem, but it only affects single deployment -->
<exclude-subsystems>
<subsystem name="logging" />
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
【讨论】:
使用 jboss-deployment-structure.xml 后我得到这个异常: 引起:java.lang.NoClassDefFoundError: Lorg/apache/commons/logging/Log; 确保在部署中包含 commons-logging 作为库,或者在 jboss-deployment-structure.xml 中添加显式的 org.apache.commons.logging 依赖项。也就是说,如果您使用公共日志记录,为什么要排除日志记录? 我不使用公共日志记录。我使用 log4j。我的日志记录根本不起作用。在我的战争中添加排除子系统并添加 commons-logging.jar 后,它开始工作。谢谢詹姆斯。但我还是不明白这一点。我在哪里可以获得更多信息?到处都是那么纠结。我很困惑。 它可能无法正常工作的原因有多种。这完全取决于您的设置。请随时发布详细问题community.jboss.org/en/wildfly。 WRT commons-logging 它可能是您的依赖项之一需要它。 你可能是 Spring 需要它。【参考方案2】:这是我们如何做到这一点的,顺便说一下,我们使用的是 wildfly-8.1.0-Final。
首先,制作一个包含此类的 jar 文件: https://gist.github.com/xiaodong-xie/219491e0b433f8bd451e
然后把这个jar文件放到“wildfly-8.1.0.Final/modules/system/layers/base/org/jboss/logmanager/main”中,并在module.xml文件中添加对这个jar文件的引用完全相同的文件夹。
然后将“logback-classic-1.1.2.jar”和“logback-core-1.1.2.jar”(你可以使用任何你选择的logback版本)放入“wildfly-8.1.0.Final/modules” /system/layers/base/org/jboss/logmanager/main”,并在 module.xml 文件中引用这两个 jar 文件。
将以下内容添加到您正在使用的standalone.xml 中的“subsystem:logging”:
<custom-handler name="logback" class="org.slf4j.bridge.SLF4JBridgeHandler" module="org.jboss.logmanager"></custom-handler>
并在以下根记录器元素中引用此处理程序:
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="logback"/>
</handlers>
</root-logger>
这里是一个 logback.xml 的例子:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
<appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>$JBOSS_HOME/standalone/log/server-logback.log</file>
<append>true</append>
</appender>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="LOGFILE"/>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC"/>
</root>
</configuration>
并将这个 logback.xml 文件放入“wildfly-8.1.0.Final/standalone/configuration”文件夹中。
将以下内容添加到“wildfly-8.1.0.Final/bin”文件夹中的“standalone.sh”或等效文件中。
-Dlogback.configurationFile=file:$JBOSS_CONFIG_DIR/logback.xml
就在“-Dlogging.configuration=file:$JBOSS_CONFIG_DIR/logging.properties”行下。 “standalone.sh”文件中有两个地方。
================================================ ====================================
或者你可以用更简单的方法来做。 :)
将2个logback jar文件放入“jboss.logmanager”模块,在“standalone.sh”文件中添加“-Dorg.jboss.logging.provider=slf4j”,位置相同。
顺便说一句,我发现如果这样做会丢失一些日志记录,因为如果这样做,Wildfly 本身仍然使用自己的日志记录工具。
玩得开心。 :-)
【讨论】:
是否有可能在您的应用程序中包含配置?就像在交付时将它放在 EAR/WAR 文件中一样?如果您通过jboss-deployment-structure.xml
禁用记录器,对我来说似乎是正确的方法。以上是关于覆盖 WildFly 中的日志记录的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse、Spring、Wildfly log4j 日志记录
如何在Wildfly 8.2.0中的server.log文件中禁用日志记录应用程序日志
如何配置 WildFly 8.2.0 日志记录以仅在调试级别显示应用程序