zoukankan      html  css  js  c++  java
  • Spring Boot 使用 Log4j2

    Java 中比较常用的日志工具类,有 Log4j、SLF4j、Commons-logging(简称jcl)、Logback、Log4j2(Log4j 升级版)、Jdk Logging。

    Spring Boot 默认使用 Logback,但相比较而言,Log4j2 在性能上面会更好。

    Spring Boot(版本1.5.10.RELEASE)中使用 Log4j2 非常简单,添加如下依赖:

    <!-- Exclude Spring Boot's Default Logging -->
    <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>
    
    <!-- Add Log4j2 Dependency -->
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    
    <!-- Needed for Async Logging with Log4j 2 -->
    <dependency>
      <groupId>com.lmax</groupId>
      <artifactId>disruptor</artifactId>
      <version>3.3.6</version>
    </dependency>
    
    <!-- 使用jsonLayout必须依赖jackson -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.7.4</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.7.4</version>
    </dependency>
    

    然后在src/main/resources中添加log4j2.xml配置文件(Spring Boot 还会识别log4j2.jsonlog4j2.yaml):

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- status表示log4j2本身的日志信息打印级别,和下面的level,不是一个概念 -->
    <!--TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF-->
    <Configuration status="OFF" monitorInterval="30">
        <Properties>
            <Property name="LOG_PATTERN">
                %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} -&#45;&#45; [%15.15t] %-40.40c{1.} : %m%n%ex
            </Property>
            <Property name="LOG_FILE_PATH">/var/log/spring-boot-log4j2</Property>
        </Properties>
        <Appenders>
            <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
                <PatternLayout pattern="${LOG_PATTERN}"/>
            </Console>
            <!-- Rolling File Appender -->
            <RollingFile name="FileAppender" fileName="${LOG_FILE_PATH}/spring-boot-log4j2-demo.log"
                         filePattern="${LOG_FILE_PATH}/spring-boot-log4j2-demo-%d{yyyy-MM-dd}-%i.log">
                <PatternLayout>
                    <Pattern>${LOG_PATTERN}</Pattern>
                </PatternLayout>
                <!--<JsonLayout complete="false" compact="true">
                    <KeyValuePair key="timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}" />
                </JsonLayout>-->
                <Filters>
                    <!-- 只记录ERROR级别日志信息,程序打印的其他信息不会被记录 -->
                    <!-- 此level设置的日志级别,是过滤日志文件中打印出的日志信息,和Root的level有所区别 -->
                    <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
                </Filters>
                <Policies>
                    <SizeBasedTriggeringPolicy size="10MB" />
                    <!-- 每天创建一个日志文件 -->
                    <TimeBasedTriggeringPolicy interval="1" />
                </Policies>
                <DefaultRolloverStrategy max="10"/>
            </RollingFile>
        </Appenders>
        <Loggers>
            <!-- 用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。 -->
            <!--<Logger name="com.easyjijin.demo.springbootlog4j2" level="debug" additivity="false">
                <AppenderRef ref="ConsoleAppender" />
                <AppenderRef ref="FileAppender"/>
            </Logger>-->
    
            <!-- AsyncRoot - 异步记录日志 - 需要LMAXDisruptor的支持 -->
            <!-- <AsyncRootlevel="info" additivity="false">
              <AppenderRef ref="Console"/>
              <AppenderRef ref="FileAppender"/>
            </AsyncRoot> -->
    
            <!-- All < Trace < Debug < Info < Warn < Error < Fatal < OFF. -->
         <!-- 程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。-->
            <!-- 此level设置的日志级别,是过滤项目中输出的日志信息,和ThresholdFilter的level有所区别 -->
            <Root level="ERROR">
                <AppenderRef ref="ConsoleAppender" />
                <AppenderRef ref="FileAppender"/>
            </Root>
        </Loggers>
    </Configuration>
    

    这边需要注意几个日志的级别:

    • Configuration status="OFF":这个status配置的是,Log4j2 组件本身日志级别,指的是如果 Log4j2 本身出错,打印出的日志级别配置。
    • Root level="ERROR":这个level配置的是,程序输入的日志级别,对应log.error("this is a error"),程序会打印高于或等于所设置级别的日志。
    • ThresholdFilter level="ERROR":这个level配置的是,输出到日志文件(或是其他)的日志日志级别,也就是在日志文件只输出ERROR级别的日志,其他无关信息不输出。

    在程序中使用 Log4j2 打印日志信息:

    @SpringBootApplication
    public class Log4j2DemoApplication implements ApplicationRunner {
        private static final Logger logger = LogManager.getLogger(Log4j2DemoApplication.class);
    
        public static void main(String[] args) {
            SpringApplication.run(Log4j2DemoApplication.class, args);
        }
    
        @Override
        public void run(ApplicationArguments applicationArguments) throws Exception {
            logger.debug("Debugging log");
            logger.info("Info log");
            logger.warn("Hey, This is a warning!");
            logger.error("Oops! We have an Error. OK");
            logger.fatal("Damn! Fatal error. Please fix me.");
        }
    }
    

    或者使用Lombok,可以更方便的使用 Log4j2,需要添加依赖:

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    

    使用代码:

    import lombok.extern.log4j.Log4j2;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @Log4j2
    @RestController
    public class HelloController {
    
        @RequestMapping("/home")
        public String home() {
    
            log.error("Hi ! We have an Error. Hello World");
    
            return "Hello World ----spring-boot-log4j2";
        }
    }
    

    注意:如果 IDEA 报错(找不到log),IDEA 设置中添加 Lombok 插件,即可。

    参考资料:

  • 相关阅读:
    Y2K Accounting Bug(POJ 2586)
    Power of Cryptography(POJ 2109 math )
    codeforces C. Valera and Tubes
    codeforces C. Devu and Partitioning of the Array
    codeforces C. Ryouko's Memory Note
    codeforces C. k-Tree
    codeforces C. Prime Swaps
    codeforces C. Xor-tree
    codeforces B. Prison Transfer
    codeforces C. Sereja and Swaps
  • 原文地址:https://www.cnblogs.com/xishuai/p/spring-boot-log4j2.html
Copyright © 2011-2022 走看看