如何在春季启动时使用log4j将INFO记录到一个文件中并将ERROR记录到另一个文件中。

时间:2018-05-09 12:58:25

标签: java

我尝试过 application.properties

logging.level.org.springframework.security= DEBUG
logging.level.org.hibernate= DEBUG
logging.file=D:/LogDemo/DemoDebug.log

logging.level.root= WARN
logging.file=D:/LogDemo/DemoWarn.log

但是日志仅附加在最后一个文件中(此处为demoinfo.log) 如果ERROR级别是最后一级,则只有日志才会附加到指定的文件中。

我也尝试了log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <appender name="DEBUG-LOG-FILE" class="org.apache.log4j.rolling.RollingFileAppender"> 
        <param name="file" value="D:/LogDemo/Debug.log"/> 
        <param name="append" value="true" /> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
      <!-- daily rollover -->
      <param name="FileNamePattern" value="Debug.%d{yyyy-MM-dd}.log.zip"/> 
      <!-- keep 30 days' worth of history 
      <param name="MaxBackupIndex" value="30"/> -->
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
        <!--<Pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{35} - %msg%n</Pattern>-->
        <param name="ConversionPattern" value="%d %-5p %logger{35} - %m%n"/> 
    </layout> 
    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
        <param name="LevelToMatch" value="debug"/> 
        <param name="AcceptOnMatch" value="true"/> 
        </filter>  
        <filter class="org.apache.log4j.varia.DenyAllFilter"/> 
  </appender> 

  <appender name="ERROR-LOG-FILE" class="org.apache.log4j.rolling.RollingFileAppender"> 
        <param name="file" value="D:/LogDemo/Error.log"/> 
        <param name="append" value="true" /> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
      <!-- daily rollover -->
      <param name="FileNamePattern" value="Error.%d{yyyy-MM-dd}.log.zip"/> 
      <!-- keep 30 days' worth of history 
      <param name="MaxBackupIndex" value="30"/> -->
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <!--<Pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{35} - %msg%n</Pattern>-->
      <param name="ConversionPattern" value="%d %-5p %logger{35} - %m%n"/> 
    </layout> 
        <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
                <param name="LevelToMatch" value="error" /> 
                <param name="AcceptOnMatch" value="true"/> 
        </filter> 
        <filter class="org.apache.log4j.varia.DenyAllFilter" /> 
  </appender> 

  <appender name="INFO-LOG-FILE" class="org.apache.log4j.rolling.RollingFileAppender"> 
        <param name="file" value="D:/LogDemo/Info.log"/> 
        <param name="append" value="true" /> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
      <!-- daily rollover -->
      <param name="FileNamePattern" value="Info.%d{yyyy-MM-dd}.log.zip"/> 
      <!-- keep 30 days' worth of history 
      <param name="MaxBackupIndex" value="30"/> -->
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <!--<Pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{35} - %msg%n</Pattern>-->
      <param name="ConversionPattern" value="%d %-5p %logger{35} - %m%n"/> 
    </layout> 
        <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
                <param name="LevelToMatch" value="info" /> 
                <param name="AcceptOnMatch" value="true"/> 
        </filter> 
        <filter class="org.apache.log4j.varia.DenyAllFilter" /> 
  </appender> 

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d %-5p %logger{35} - %m%n"/> 
    </layout> 
        <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
                <param name="LevelToMatch" value="debug" /> 
                <param name="AcceptOnMatch" value="true"/> 
        </filter> 
        <filter class="org.apache.log4j.varia.DenyAllFilter" /> 
  </appender> 

  <root> 
    <level value="debug" /> 
    <appender-ref ref="DEBUG-LOG-FILE" /> 
    <appender-ref ref="ERROR-LOG-FILE" /> 
    <appender-ref ref="INFO-LOG-FILE" /> 
    <appender-ref ref="STDOUT" /> 
  </root> 

但是我无法看到任何与log4j2.xml相关的结果(需要任何配置吗?)

请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:1)

问题

  1. 您是否已将spring-boot-starter-logging排除在外并spring-boot-starter-log4j2作为项目的依赖项添加了?
  2. 你的log4j2.xml看起来不合适 - 它是相当的logback语法而不是log4j2的语法。
  3. 要在不同文件之间拆分日志条目 - 使用log4j2,您需要:

    排除日志记录并添加log4j2依赖项:

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

    在log4j2.xml中进行更改。这个想法是过滤掉所有其他级别。请注意,我将WARN和INFO分组到同一个文件中

    <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>
    
            <RollingFile name="File-DEBUG" fileName="logs/app-debug.log" filePattern="logs/app-debug-%d{MM-dd-yyyy}.log.gz"
                         ignoreExceptions="false">
                <PatternLayout>
                    <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
                </PatternLayout>
                <TimeBasedTriggeringPolicy/>
                <Filters>
                    <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
                    <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
                </Filters>
            </RollingFile>
    
            <RollingFile name="File-INFO" fileName="logs/app-info.log" filePattern="logs/app-info-%d{MM-dd-yyyy}.log.gz"
                         ignoreExceptions="false">
                <PatternLayout>
                    <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
                </PatternLayout>
                <TimeBasedTriggeringPolicy/>
                <Filters>
                    <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                    <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
                    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                </Filters>
            </RollingFile>
    
    
            <RollingFile name="File-ERROR" fileName="logs/app-error.log" filePattern="logs/app-error-%d{MM-dd-yyyy}.log.gz"
                         ignoreExceptions="false">
                <PatternLayout>
                    <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
                </PatternLayout>
                <TimeBasedTriggeringPolicy/>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </RollingFile>
        </Appenders>
    
        <Loggers>
            <Root level="debug">
                <AppenderRef ref="File-INFO"/>
                <AppenderRef ref="File-ERROR"/>
                <AppenderRef ref="File-DEBUG"/>
            </Root>
        </Loggers>
    </Configuration>
    

    测试它:

    package com.example.demo;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class DemoApplication implements CommandLineRunner {
    
        private static final Logger logger = LogManager.getLogger(DemoApplication.class);
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            logger.error("this is an error");
            logger.warn("this is a warning");
            logger.info("this is an info");
            logger.debug("this is debug");
        }
    }
    
相关问题