Spring boot 使用log4j2.xml将日志写入spring引导项目中的文件和控制台

Spring boot 使用log4j2.xml将日志写入spring引导项目中的文件和控制台,spring-boot,log4j2,Spring Boot,Log4j2,我试图创建一个简单的spring启动应用程序,在这个应用程序中,日志应该同时在控制台和项目文件夹之外的文件中打印。日志可以在控制台中打印,但不能写入文件。我指定了文件位置(文件未创建,我认为文件会自动生成) 这是添加的依赖项 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr

我试图创建一个简单的spring启动应用程序,在这个应用程序中,日志应该同时在控制台和项目文件夹之外的文件中打印。日志可以在控制台中打印,但不能写入文件。我指定了文件位置(文件未创建,我认为文件会自动生成)

这是添加的依赖项

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- Add Log4j2 Dependency -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
</dependencies>
这是控制台:

我要做的第一件事是尝试从类路径中删除logback绑定,如所述

因此,您的
pom.xml
配置最终将包含一个排除项,如:


org.springframework.boot
应用程序编程接口。SpringBoot已经配置为将SL4J与您在类路径上配置的任何绑定器一起使用(在本例中是log4j)

因此,我不会使用
org.apache.logging.log4j.Logger
而是将
org.slfj.Logger
用于您的Logger类,并使用
org.slf4j.LoggerFactory.getLogger()创建它。直接使用log4j类的好处是,您可以在slf4j下切换绑定,而无需更改所有代码。以防万一您以后决定使用logback或其他方法


如果您对pom进行更改,并使用slf4j API,我认为spring boot自动配置将加载您的配置并开始记录到文件appender和控制台。

请遵循以下方法,这里我为单个记录器配置了两个appender。如果使用该记录器名称记录任何内容,所有日志消息都将发送到这两个位置。在您的情况下,控制台和文件

 <logger name="pushnotification" level="debug" additivity="false">
            <appender-ref ref="NOTIFICATION-FILE-APPENDER" />
    <appender-ref ref="NOTIFICATION-CONSOLE-APPENDER" />
        </logger>

    <appender name="NOTIFICATION-CONSOLE-APPENDER" class="ch.qos.logback.core.ConsoleAppender">
            <encoder
        class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>[%date{yyyy-MM-dd HH:mm:ss}][%level][%c][%t] - %msg%n
        </pattern>
    </encoder>
        </appender>

    <appender name="NOTIFICATION-FILE-APPENDER"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${logs.home}/applogs/notification.log</file>
            <append>true</append>
        </appender>

[%date{yyyyy-MM-dd HH:MM:ss}][%level][%c][%t]-%msg%n
${logs.home}/applogs/notification.log
真的

您可以执行以下操作:

应用程序属性
您也可以在应用程序中使用AOP进行中心日志记录…

我将尝试从类路径中删除logback绑定,如所述。在文档中,他们建议从maven依赖项中排除logging starter。我要做的另一件事是使用来自的logger API,而不是直接使用
log4j
。Spring boot已经配置为将slf4j与类路径上的任何绑定一起使用。因此,输出中会出现重复绑定错误。因此,我将为您的Logger类使用
org.slfj.Logger
,并使用
org.slf4j.LoggerFactory.getLogger()
创建它。这样做的好处是直接使用Log4J类,您可以在不改变所有代码的情况下切换SLF4J下的绑定。@ Tayl Oror Cor考虑将注释归纳为答案,因为它们是正确的,并且将有利于该职位的未来读者。<代码>日志。文件< /代码>应该是“代码>日志记录。文件。
    import org.apache.logging.log4j.LogManager;

    import org.apache.logging.log4j.Logger;

    import org.springframework.boot.SpringApplication;

    import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LoggingApplication {

    private static final Logger logger = LogManager.getLogger(LoggingApplication.class);


    public static void main(String[] args) {
        logger.info("in main class");
        logger.info("info logging is printed");
        logger.debug("logger debud is worked");
        logger.warn("logging warn is worked");
        SpringApplication.run(LoggingApplication.class, args);
    }

}
 <logger name="pushnotification" level="debug" additivity="false">
            <appender-ref ref="NOTIFICATION-FILE-APPENDER" />
    <appender-ref ref="NOTIFICATION-CONSOLE-APPENDER" />
        </logger>

    <appender name="NOTIFICATION-CONSOLE-APPENDER" class="ch.qos.logback.core.ConsoleAppender">
            <encoder
        class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>[%date{yyyy-MM-dd HH:mm:ss}][%level][%c][%t] - %msg%n
        </pattern>
    </encoder>
        </appender>

    <appender name="NOTIFICATION-FILE-APPENDER"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${logs.home}/applogs/notification.log</file>
            <append>true</append>
        </appender>
#####LOGGING. . . .
logging.level.org.springframework.web=ERROR
logging.level.com.hsc.adauth.*=DEBUG

# Logging pattern for the console
logging.pattern.console="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"

# Logging pattern for file
logging.pattern.file= "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"

#output to a temp_folder/file(give your file path here)
logging.file=${java.io.tmpdir}/application.log