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

标签 java spring-boot logback

我在 Spring Boot 应用程序中使用 Logback。我的配置位于 logback.xml 中。我正在尝试为应用程序中的不同进程编写单独的日志文件。

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

<!-- 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);

它向我显示记录器的上下文是根记录器本身,并且没有附加文件(因此控制台写入。)我需要对配置进行哪些更改才能将信息写入文件而不是控制台?

最佳答案

解决方案分为两部分。首先,在 main method() 中,日志记录需要在应用程序启动后进行:

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

其次,Logger 需要是 ch.qos.logback.classic.Logger 的实例,而不是 org.slf4j.Logger:

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

关于Java - Logback 和 Spring Boot - 仅写入控制台而不写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30240367/

相关文章:

c# - 内部录音程序

java - Selenium 测试用例中的循环 - java

java - 带大圆圈的单选按钮组 Java

java - Spring boot - 如何获取 WARN 的框架日志记录和 DEBUG 的应用程序日志记录

java - Logback - 过滤堆栈跟踪

Java App Engine - 排名计数器

java - 不兼容的类型不允许在 JOOQ dsl 中合并子查询

java - Spring Boot 和 Spring Security,无法在 AuthenticationEntryPoint 中使用自定义消息发送错误

java - 如何在 JHipster 中调试 'Your request cannot be processed'?

java - 记录模式 - 不记录原因