Spring Boot和JBoss 8 Wildfly日志配置应用程序

9

我有一个准备成为WAR的Spring Boot应用程序。它可以在Tomcat 8(嵌入式或独立)以及JBoss 8 Wildfly上无问题部署。
但是,尽管在Tomcat上我们已经配置了可工作的logback配置,在JBoos上却不再工作了。

我尝试了一些不同的解决方案:
https://dev59.com/rWEh5IYBdhLWcg3w7nWW#21887529
https://dev59.com/JmAg5IYBdhLWcg3w3eNi#23080264

我找到的最好的方法是向项目添加WEB-INF/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>

但这仍然不能完全解决问题。在日志中,我有一行重复出现了两次(这不是因为logback配置引起的,因为在Tomcat上可以正常工作),并且第一条记录中打印了关于时间、级别、线程的重复信息。

[2014-11-26 15:28:42,605] [INFO ] [MSC service thread 1-3        ] [stdout] [NONE      ] [2014-11-26 15:28:42.605  INFO 8228 --- [vice thread 1-3] o.s.boot.SpringApplication               : Starting application on LCJLT306 with PID 8228 (started by Piotr.Konczak in D:\servers\wildfly-8.2.0.Final\bin)
]
[2014-11-26 15:28:42,605] [INFO ] [MSC service thread 1-3        ] [o.s.boot.SpringApplication] [NONE      ] [Starting application on LCJLT306 with PID 8228 (started by Piotr.Konczak in D:\servers\wildfly-8.2.0.Final\bin)]

正如您在上面的示例中所看到的,第一条记录包含了某种额外的时间戳、级别和线程信息(我猜是Wildfly在某些重定向过程中添加的),而第二行是正确且符合预期的。

我的logback配置有两个部分 - 第一个部分在应用内部,第二个部分在应用外部,以便在不同环境中重新配置。
在类路径内:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <include file="/opt/appName/config/appNameLogConfig.xml" />
</configuration>

应用外(包括应用内):

<?xml version="1.0" encoding="UTF-8"?>
<included>

    <property name="DESTINATION_FOLDER" value="/opt/appName/logs" />
    <property name="FILE_NAME" value="AppName" />

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DESTINATION_FOLDER}/${FILE_NAME}.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--daily rollover-->
            <fileNamePattern>${DESTINATION_FOLDER}/${FILE_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>

        <encoder>
            <pattern>%-5level %date %-30thread %-30logger{30} [%-10mdc{requestId:-NONE}] %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.springframework" level="INFO"/>
    <logger name="org.hibernate" level="INFO"/>
    <logger name="com.wordnik" level="INFO"/>
    <logger name="com.mangofactory" level="INFO"/>
    <logger name="com.company.appName" level="INFO"/>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</included>

有人看到可能的原因或配置错误吗?

你使用的日志门面是什么? - James R. Perkins
我不知道Spring Boot是什么,它是启动WildFly还是部署到WildFly中? - James R. Perkins
我在WildFly容器上部署应用程序。 - Piotr Kończak
这个示例日志输出是来自 server.log 吗?它看起来不像默认格式,更符合您的 logback 配置中的格式。 - James R. Perkins
很遗憾,我们没有这样做。虽然允许混合来自不同应用程序的日志是不可接受的,但我们无法使其正常工作,因此我们决定放弃使用WildFly,转而使用独立Tomcat上的容器化Spring Boot应用程序。我们使用ELK堆栈来收集和管理分布式环境中的日志。个人认为,离开WildFly寻找Java EE解决方案并为Spring应用程序使用更轻量级的东西是最好的想法。此外,ELK也给了我们相当不错的体验。 - Piotr Kończak
显示剩余2条评论
2个回答

7
我知道现在有点晚了,但是如果你们中的一些人遇到了这个问题,有一个替代方案:不要禁用整个日志记录子系统,而是仅排除由 JBoss/Wildfly 提供的 slf4j 库,以使用 spring-boot 使用的库。
<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name='org.slf4j'/>
      <module name='org.slf4j.impl'/>
    </exclusions>
  </deployment>
</jboss-deployment-structure>

希望对某些人有所帮助。


2
这个可以工作。对于其他人,你需要在WEB-INF\jboss-deployment-structure.xml文件中添加答案,如果不存在就创建一个新的。 - Jose-Rdz

0

我正在使用自己的日志配置,log4j2 xml 替代 spring 的日志,并在 Wildfly 上遇到了同样的问题。我注释掉了整个子系统以覆盖它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接