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

时间:2019-04-27 09:26:30

标签: spring-boot log4j2

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

这是添加的依赖项

<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>

这是log4j.xml文件(位置src / main / resources / log4j2.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
        </Property>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT"
            follow="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </Console>

        <!-- Rolling File Appender -->
        <RollingFile name="FileAppender"
            fileName="/home/ubuntu/Documents/eclipse/logs/log4j2-demo.log"
            filePattern="logs/log4j2-demo-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" />
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>

    <Loggers>

        <Root level="debug">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="FileAppender" />
        </Root>
    </Loggers>
</Configuration>

我在主类中添加了日志记录功能

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

}

这是控制台: enter image description here

3 个答案:

答案 0 :(得分:1)

我要做的第一件事是尝试按照in the documentation所述从类路径中删除登录绑定。

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

此外,我建议不要直接使用log4j API类,而应使用sfl4j API。已经将spring-boot配置为将SL4J与在类路径上配置的任何绑定程序一起使用(在本例中为log4j)。

因此,我将org.apache.logging.log4j.Logger用于记录器类,而不是使用org.slfj.Logger,并使用org.slf4j.LoggerFactory.getLogger()创建它。与直接使用log4j类相比,这样做的好处是您可以在slf4j下切换绑定程序,而无需更改所有代码。以防万一您稍后决定要使用Logback或其他功能。

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

答案 1 :(得分:0)

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

 <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>

答案 2 :(得分:0)

您可以执行以下操作:

application.properties

#####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

您也可以使用AOP在应用程序中进行集中登录。.....