【问题标题】:Adding slf4j-log4j12 started logging to server.log添加 slf4j-log4j12 开始记录到 server.log
【发布时间】:2017-02-08 23:03:26
【问题描述】:

amqps(RabbitMQ client) jar 需要包含 slf4j-log4j12 的实现,否则它将在他的日志中抛出NoSuchMethodError。所以,我将它添加到pom.xml。现在日志在 jboss 5.1 中被搞砸了,所有应用程序日志现在都记录在 console/server.log 文件中。

我们对位于 DOMAIN/log 文件夹中的所有应用程序使用 jboss 默认日志记录。

jar 不包含在应用中时出错

Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;

POM

<dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>4.0.2</version>
        </dependency>
         <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>

        </dependency>

【问题讨论】:

    标签: java maven jboss slf4j


    【解决方案1】:

    这意味着不仅仅是依赖于拉一个不同版本的 slf4j。类加载器正在加载没有 StaticLoggerBinder.getSingleton() 方法的版本。要检查哪些依赖项正在拉入不同版本的 slf4j,请使用 maven dependency:tree

    确切的命令是

    mvn 依赖:tree -DoutputFile=/somepath/file.txt

    最新的maven依赖是:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.7</version>
    </dependency>
    

    【讨论】:

    • 如何修复我的 jboss 日志记录?在我将依赖项放入 pom 之后,看起来 slf4j 1.7.x 正在被彻底使用。
    【解决方案2】:

    您必须从 jboss 中排除日志记录默认服务。

    要实现这一点,您可以在用于 JAR 或 WAR 的 WEB-INF 中,在用于 EAR 的 META-INF 中添加一个名为 jboss-deployment-structure.xml 的文件。

    您可以在其中添加:

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
        <deployment>
            <exclude-subsystems>
                <subsystem name="logging" />
            </exclude-subsystems>
            <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" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>
    

    不要忘记将 xml 文件添加到您的类路径(为 EAR 提供的示例):

                   <plugin>
                        <artifactId>maven-ear-plugin</artifactId>
                        <version>2.8</version>
                        <configuration>
                            <defaultLibBundleDir>lib</defaultLibBundleDir>
                            <earSourceDirectory>ear</earSourceDirectory>
                            <earSourceIncludes>META-INF/*</earSourceIncludes>
                            <modules>
                                <webModule>
                                    <groupId>your group id</groupId>
                                    <artifactId>your artifact</artifactId>
                                    <contextRoot>/yourcontext</contextRoot>
                                </webModule>
                            </modules>
                        </configuration>
                    </plugin>
    

    如果您在 pom.xml 中添加正确的依赖项并在您的应用中使用正确的记录器,那么日志记录应该可以正常工作。

    【讨论】:

    • 嘿汤姆,我还是喜欢使用 Jboss 默认日志,我希望 slf4j 停止登录到 jboss 控制台/server.log
    • 此解决方案不会阻止默认日志记录工作。您将始终拥有 server.log 文件。它的作用是,允许您的单独文件仅包含您选择的应用程序日志记录。
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2017-02-06
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多