【问题标题】:Logback and Jboss 7 - don't work together?Logback 和 Jboss 7 - 不一起工作?
【发布时间】:2012-03-01 15:13:39
【问题描述】:

我有一个奇怪的问题。我有这个 Java 应用程序,它以前部署在 tomcat 中,并愉快地使用 logback classic 作为 slf4j 实现。现在,当我们尝试在 jboss 7.1.final 服务器中部署相同的应用程序时,它甚至没有部署应用程序 maoning about java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext 这是有问题的代码行

final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

拥有他的类是弹簧注入的并且失败了 - 因此无法部署整个应用程序。有人对此有解决方案吗?提前致谢

查看此站点和其他论坛后,我意识到 Jboss 7 捆绑了它自己的 slf4j 实现,并实现了与 logback 中的 LoggerContext 相同的 ILoggerFactory 接口。我们的应用程序试图获取相同的实例,但应用程序服务器强加了它自己的 slf4j 实现。

我尝试修改 jboss\modules\org\slf4j\impl\main 中的 module.xml 并将其指向 logback jars。

<resources>
    <resource-root path="logback-classic-0.9.28.jar"/>
    <resource-root path="logback-core-0.9.28.jar"/>
</resources>

现在当我启动应用程序时出现严重错误

Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext

我束手无策。任何 jboss 和 logback 专家都可以提供帮助吗? 提前致谢

【问题讨论】:

  • 您是否在/lib 目录和EAR/WAR 中都有logback*.jar
  • 嗨,托马斯。我的war文件的WEB-INF/lib目录中有logback jars。如上所述,我已将 jboss org.slf4j.Impl 模块中的 module.xml 更改为指向 logback jar(经典和核心),它们都与 module.xml 位于同一文件夹中。

标签: jboss7.x logback


【解决方案1】:

您需要从部署中排除 slf4j 的服务器版本。创建一个jboss-deployment-structure.xml 文件并将其放在您的WARS META-INFWEB-INF 目录中。

文件的内容应该是这样的:

<jboss-deployment-structure>
    <deployment>
        <!-- Exclusions allow you to prevent the server from automatically adding some dependencies     -->
        <exclusions>
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

【讨论】:

  • 辛苦了!谢谢。我想我们可以排除任何我们不想使用这个文件的模块。再次感谢
  • @James R. Perkins 我也遇到了这个问题,但这是我赢得的课程。示例com.java.User。当我重新部署war文件而不重新启动Jboss 7 Server时,我遇到了问题。怎么解决?
  • @CycDemo 它应该可以工作。如果不是,如果您获得 ClassCastException,则可能会泄漏一些东西。什么版本的 JBoss AS 7?
  • @James R. Perkins,我使用 JBoss AS 7.1.1 Final
  • 对于 EAR,它需要位于 EAR/META-INF 目录中,并且需要定义 each subdeployment where the exclusion。对于 WIldFly 10,请查看 add-logging-api-dependencies 属性。
【解决方案2】:

如果您在应用中使用 jul 或 jcl 的桥接器,您也应该排除它们:

        <module name="org.slf4j" />
        <module name="org.slf4j.jcl-over-slf4j" />
        <module name="org.slf4j.impl" />
        <module name="org.jboss.logging.jul-to-slf4j-stub" />

【讨论】:

    【解决方案3】:

    还有其他方法:

    • 您在战争中配置了日志记录
    • 你在你的战争中得到了所有的依赖
    • 你没有在 JBoss 服务器目录中配置任何东西,甚至没有额外的 JBoss 模块

    完全禁用 JBoss 日志记录并依赖战争中的依赖项。编辑您的jboss-deployment-structure.xml 如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
        <deployment>
            <exclusions>
                <module name="org.apache.commons.logging" />
                <module name="org.apache.log4j" />
                <module name="org.jboss.logging" />
                <module name="org.jboss.logging.jul-to-slf4j-stub" />
                <module name="org.jboss.logmanager" />
                <module name="org.jboss.logmanager.log4j" />
                <module name="org.slf4j" />
                <module name="org.slf4j.impl" />
                <module name="org.slf4j.jcl-over-slf4j" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>
    

    部署应用后,引导日志记录 (boot.log) 会继续工作,server.log 也会显示部署日志记录。但是您的所有应用程序都通过您的(在此示例中)slf4j+logback 记录在您的战争中。

    请注意,您不需要使用-Dorg.jboss.logging.provider=slf4j 运行 JBoss,如果您指定此选项,您将需要提供 JBoss 模块(通常是 slf4j-api、logback-classic 和 logback-core),但这并不值得努力,因为 JBoss 日志记录现在仅用于引导 (boot.log) 和部署信息 (server.log)。

    参考资料:
    http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
    https://stackoverflow.com/a/19695680/2587343

    【讨论】:

      【解决方案4】:

      要在 JBoss EAP 7.0 中使用 Logback + Json 进行独立日志记录,我还需要排除过时的 Jackson 实现:

      jboss-deployment-structure.xml

      <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
          <deployment>
              <!-- https://docs.jboss.org/author/display/AS7/Class%20Loading%20in%20AS7.html -->
              <!-- https://docs.wildfly.org/16/Developer_Guide.html -->
              <exclusions>
                  <!-- Rely on WAR's SLF4j + Logback instead of JBoss logmananger. -->
                  <module name="org.apache.commons.logging" />
                  <module name="org.apache.log4j" />
                  <module name="org.jboss.as.logging" />
                  <module name="org.jboss.logging" />
                  <module name="org.jboss.logging.jul-to-slf4j-stub" />
                  <module name="org.jboss.logmanager" />
                  <module name="org.jboss.log4j.logmanager" />
                  <module name="org.slf4j" />
                  <module name="org.slf4j.ext" />
                  <module name="org.slf4j.impl" />
                  <module name="org.slf4j.jcl-over-slf4j" />
                  <!-- Built-in Jackson is without the field: Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING, need to bundle own version. -->
                  <!-- https://docs.jboss.org/resteasy/docs/3.0.2.Final/userguide/html/json.html -->
                  <module name="org.jboss.resteasy.resteasy-jackson-provider"/>
                  <module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
              </exclusions>
          </deployment>
      </jboss-deployment-structure>
      

      pom.xml

      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>log4j-over-slf4j</artifactId>
          <version>${slf4j.version}</version>
      </dependency>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jcl-over-slf4j</artifactId>
          <version>${slf4j.version}</version>
      </dependency>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jul-to-slf4j</artifactId>
          <version>${slf4j.version}</version>
      </dependency>
      <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.2.9</version>
      </dependency>
      <dependency>
          <groupId>net.logstash.logback</groupId>
          <artifactId>logstash-logback-encoder</artifactId>
          <version>7.0.1</version>
      </dependency>
      

      logback.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration debug="true">
          <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
              <encoder>
                  <charset>UTF-8</charset>
                  <pattern>%d{HH:mm:ss.SSS} %5p [%15.15t] %logger %m%ex</pattern>
              </encoder>
          </appender>
      
          <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <encoder>
                  <charset>UTF-8</charset>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40.40logger{39} %m%n%ex</pattern>
              </encoder>
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>${my.log.dir}/test-servlet-logging-%d{yyyy-MM-dd}.log</fileNamePattern>
                  <maxHistory>30</maxHistory>
                  <totalSizeCap>500MB</totalSizeCap>
              </rollingPolicy>
          </appender>
      
          <appender name="JSON-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>${my.log.dir}/test-servlet-logging-%d{yyyy-MM-dd}.ndjson</fileNamePattern>
                  <maxHistory>30</maxHistory>
                  <totalSizeCap>500MB</totalSizeCap>
                  <cleanHistoryOnStart>true</cleanHistoryOnStart>
              </rollingPolicy>
              <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                  <includeContext>false</includeContext>
                  <includeMdc>true</includeMdc>
                  <timestampPattern>uuuu-MM-dd'T'HH:mm:ss.SSSxxx</timestampPattern>
                  <fieldNames>
                      <timestamp>@timestamp</timestamp>
                      <message>message</message>
                      <thread>thread</thread>
                      <logger>logger</logger>
                      <level>level</level>
                      <levelValue>[ignore]</levelValue>
                      <version>[ignore]</version>
                      <stackTrace>ex</stackTrace>
                  </fieldNames>
              </encoder>
          </appender>
          <root level="INFO">
              <appender-ref ref="CONSOLE" />
              <appender-ref ref="FILE" />
              <appender-ref ref="JSON-FILE" />
          </root>
      </configuration>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 2012-09-13
        • 2020-11-20
        • 1970-01-01
        • 2017-09-03
        • 1970-01-01
        相关资源
        最近更新 更多