【问题标题】:PropertyConfigurator.configure doesn't work with springPropertyConfigurator.configure 不适用于 spring
【发布时间】:2017-08-06 11:07:31
【问题描述】:

我尝试使用 spring IOC 初始化 log4j 记录器并使用 PropertyConfigurator.configure 来配置记录器,但 PropertyConfigurator.configure 不起作用。 记录器是使用默认配置创建的,不会创建记录文件。

我的问题是如何将配置(log4j.properties)传递给 Logger 类?

pom.xml

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
          <version>1.5.5.RELEASE</version>
    </dependency>
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
          <version>1.5.5.RELEASE</version>
    </dependency> 

配置类

@Configuration 
public class CommonConfig {

@Autowired
private Environment env;

@PostConstruct
public void init() {
   PropertyConfigurator.configure("log4j.properties");
}

@Bean(name = "debugLogger")
public Logger debugLogger() {
    return Logger.getLogger("regDebug");
}

@Bean(name = "infoLogger")
public Logger infoLogger() {
    return Logger.getLogger("regOperational");
}

@Bean(name = "errorLogger")
public Logger errorLogger() {
  ic Logger infoLogger() {
    return Logger.getLogger("regError");
}}

log4j.properties

log4j.logger.regDebug=DEBUG , stdout, regDebug
log4j.logger.regOperational=INFO, stdout , regOperational
log4j.logger.regError=ERROR , stdout , regError
log4j.rootLogger = INFO, console, regDebug, regOperational, regErro
log4j.appender.fileAppener=org.apache.log4j.RollingFileAppender

# STDOUT appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

#DEBUG LEVEL
log4j.appender.regDebug.Append=true
log4j.appender.regDebug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.regDebug.Append=true
log4j.appender.regDebug.File=D:/Code/log/COMMON_DEBUG.log
log4j.appender.regDebug.MaxFileSize=10MB
log4j.appender.regDebug.MaxBackupIndex=10
log4j.appender.regDebug.DatePattern='.'yyyy-MM-dd-HH'.log'
log4j.appender.regDebug.layout=org.apache.log4j.PatternLayout
log4j.appender.regDebug.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss.SSS} || %5p || %t || %C{1} || %M:%L || %m%n

#INFO LEVEL

log4j.appender.regOperational=org.apache.log4j.DailyRollingFileAppender
log4j.appender.regOperational.Append=true
log4j.appender.regOperational.File=D:/Code/log/COMMON_ERROR.log
log4j.appender.regOperational.DatePattern='.'yyyy-MM-dd-HH'.log'
log4j.appender.regOperational.layout=org.apache.log4j.PatternLayout
log4j.appender.regOperational.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss.SSS} || %5p || %t || %m%n

#ERROR LEVEL

log4j.appender.regError=org.apache.log4j.DailyRollingFileAppender
log4j.appender.regError.Append=true
log4j.appender.regError.File=D:/Code/log/COMMON_ERROR.log
log4j.appender.regError.DatePattern='.'yyyy-MM-dd-HH'.log'
log4j.appender.regError.layout=org.apache.log4j.PatternLayout
log4j.appender.regError.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss.SSS} || %5p || %t || %C{1} || %M:%L || %m%n

【问题讨论】:

  • 可以将init方法修改为静态,看看效果。
  • 同样的问题,没有什么不同

标签: java spring maven logging log4j


【解决方案1】:

Spring Boot 通过 spring-boot-starter-log4j 依赖提供与 Log4J 的集成:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-log4j</artifactId>
   <version>1.3.8.RELEASE</version>
</dependency>   

但首先你需要排除默认的 Spring Boot 的日志机制:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
   <exclusions>
      <exclusion>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-logging</artifactId>
      </exclusion>
   </exclusions>
</dependency>

另外,请确保您的 log4j.properties 位于 src/main/resources 下。在这种情况下,您不需要将文件的路径显式指定为PropertyConfigurator,并且可以安全地删除init() 方法。

请注意,Log4J 1.2.17 已经过时了 - reached the end of life in 2015。您可能需要考虑改用 Log4J2 或继续使用 Logback - Spring Boot 使用的默认日志记录机制。

【讨论】:

  • 最后,我看到 pom.xml 声明了spring-context 依赖,这可能会导致Spring版本之间的冲突。 Spring Boot 已经依赖 Spring Core 和 Spring Context,所以不需要显式声明。
  • 感谢@Aleksei Budiak
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2015-11-03
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 2013-06-20
  • 2017-05-24
相关资源
最近更新 更多