Java - Logback和Spring Boot - 只写入控制台而不是文件

问题描述:

我在Spring Boot应用程序中使用Logback。我在logback.xml中有我的配置。我正在尝试为应用程序中的不同进程编写单独的日志文件。Java - Logback和Spring Boot - 只写入控制台而不是文件

在配置我创建额外的记录如下所示:

<!-- Each can be broken off into its own appender. --> 
<logger name="reportsLogger" level="info" 
     additivity="false"> 
    <appender-ref ref="REPORTS_APPENDER" /> 
</logger> 
<root level="ERROR"> 
    <appender-ref ref="GATEWAY_APPENDER" /> 
</root> 

报告记录器中创建使用下面的附加器节点:

<appender name="REPORTS_APPENDER" 
      class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${DEV_HOME}/reports.log</file> 
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
     <Pattern> 
      %d{yyyy-MM-dd HH:mm:ss} - %msg%n 
     </Pattern> 
    </encoder> 

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>${DEV_HOME}/archived/reports.%d{yyyy-MM-dd}.%i.log 
     </fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy 
       class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
      <maxFileSize>10MB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
    </rollingPolicy> 
</appender> 

的GATEWAY_APPENDER类似地定义。 DEV_HOME节点在配置中定义为:

<property name="DEV_HOME" value="c:/app-logs" /> 

当应用程序启动时,会在DEV_HOME目录中创建两个日志文件。在应用程序代码中,我获得了日志,如下的实例:

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    static Logger logger = LoggerFactory.getLogger("reportsLogger"); 

    public static void main(String[] args) { 
     logger.info("*** REPORTING SERVICE STARTED ***"); 
     SpringApplication.run(Application.class, args); 
    } 
} 

任何方式,当我尝试登录到它总是写入到控制台的文件,它不会写入任何文件本身。如果我尝试检查记录器实例本身(转换为一的logback Logger实例后):

LoggerContext loggerContext = logger.getLoggerContext(); 
URL mainURL = ConfigurationWatchListUtil.getMainWatchURL(loggerContext); 

这让我发现,记录器的上下文是根记录本身,而且也没有连接到它的文件(因此控制台写入)。我需要对配置进行哪些更改,以便将信息写入文件而不是写入控制台?

解决方案有两部分。首先,在主方法()日志记录之后,需要应用程序是starterd发生:

SpringApplication.run(Application.class, args); 
logger.info("*** REPORTING SERVICE STARTED ***"); 

其次,记录器必须的实例ch.qos.logback.classic.Logger代替org.slf4j .Logger:

static Logger logger = (Logger) LoggerFactory.getLogger("reportsLogger");