Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 我如何配置Spring和SLF4J,以便获得日志记录?_Java_Spring_Logging_Log4j_Slf4j - Fatal编程技术网

Java 我如何配置Spring和SLF4J,以便获得日志记录?

Java 我如何配置Spring和SLF4J,以便获得日志记录?,java,spring,logging,log4j,slf4j,Java,Spring,Logging,Log4j,Slf4j,我有一个maven&spring应用程序,我想登录。我热衷于使用SLF4J 我想将所有配置文件放入一个目录{classpath}/config,包括log4j.xml,然后使用Springbean初始化 e、 g classpath:config/log4j.xml 然而,我得到这个警告,没有日志记录 log4j:WARN找不到记录器(org.springframework.context.support.ClassPathXmlApplicationContext)的追加器。 log4j:

我有一个maven&spring应用程序,我想登录。我热衷于使用SLF4J

我想将所有配置文件放入一个目录{classpath}/config,包括log4j.xml,然后使用Springbean初始化

e、 g


classpath:config/log4j.xml
然而,我得到这个警告,没有日志记录

log4j:WARN找不到记录器(org.springframework.context.support.ClassPathXmlApplicationContext)的追加器。 log4j:警告请正确初始化log4j系统。 log4j:有关更多信息,请参阅警告

我在谷歌上搜索过,找不到一个简单的例子。有什么想法吗?

你可以在网站上找到一个例子。您需要在POM文件中包含一些依赖项以启用日志记录

<!-- Logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
        <scope>runtime</scope>
    </dependency>

org.slf4j
slf4j api
${org.slf4j.version}
org.slf4j
jcl-over-slf4j
${org.slf4j.version}
运行时
org.slf4j
slf4j-log4j12
${org.slf4j.version}
运行时
log4j
log4j
1.2.16
运行时

将log4j文件保存在默认包中

除了Jatin的答案之外:

Spring使用Jakarta Commons日志作为日志API。为了登录到slf4j,您需要确保
commons logging
不在类路径上
jcl-over-slf4j
是一个用于commons日志的替代jar

如果您使用的是maven,那么可以使用
mvn dependency:tree
检测commons日志记录的来源,并使用dependency Exclutions将其从所有需要它的依赖项中排除。不过,您可能需要多次运行
mvn dependency:tree
,因为它只显示第一次出现的可传递依赖项

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${org.springframework.version}</version>
  <exclusions>
    <exclusion>
      <artifactId>commons-logging</artifactId>
      <groupId>commons-logging</groupId>
    </exclusion>
  </exclusions>
</dependency>

org.springframework
spring上下文
${org.springframework.version}
公用记录
公用记录

使用blow配置在
类路径上实现
JCL API

<dependencies>
       <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>3.0.0.RELEASE</version>
          <scope>runtime</scope>
          <exclusions>
             <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
             </exclusion>
          </exclusions>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jcl-over-slf4j</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.14</version>
          <scope>runtime</scope>
       </dependency>
    </dependencies> 

org.springframework

为了完整起见,一个
logback classic
变体:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.6</version>
    <scope>runtime</scope>
</dependency>

回写
回归经典
1.0.0
org.slf4j
jcl-over-slf4j
1.6.6
运行时

但是,不要忘记禁用
公共日志记录
依赖关系,该依赖关系源自Spring依赖关系,如已接受的(Stijn)回答中所述。

我喜欢回写方式,而对于slf4j,我们做了类似的配置:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
    </dependency>

org.slf4j
slf4j-log4j12
org.slf4j
jcl-over-slf4j
slf4j-log4j12将自动引入slf4j api和log4j,因此不需要放置太多依赖项,只需添加
lazy init=“false”
即可在根上下文中急切地加载用于log4j配置的bean。这将解决警告消息
log4j:WARN找不到记录器的附加器

例如:

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="false">


更好的方法是将配置放在web.xml中,或者作为JVM参数(
-Dlog4j.configuration=…/conf/log4j.xml
,或者使用'file:'前缀作为
-Dlog4j.configuration=file:conf/log4j.properties
,在某些情况下)

我猜。如果您尝试一个完整的路径C:/config/log4j.xmlNope,它是否会有任何不同。硬编码没有帮助=(该示例将log4j config文件直接放在类路径中,而不是我想要的配置目录下。事实上,这确实有点帮助。我现在已经登录到我的应用程序中,只是spring在抱怨。如果某个特定类抱怨,您需要将所需的包添加到向记录器注册的包列表中。你也可以把它放在一个配置文件夹中,并将该文件夹添加到类路径中。我认为警告是只启动的。一旦log4j配置器bean运行,我就会得到我需要的所有日志记录。能够消除警告会很好,但我想我可以保留它。我喜欢这里建议的第三种方法——使用空工件。T在当前版本的Spring参考手册中建议使用该选项。
<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="false">