log4j2 springboot 特点与使用方法

Posted clnsx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j2 springboot 特点与使用方法相关的知识,希望对你有一定的参考价值。

Apache Log4j2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.

既然Log4j2相比Log4j和Logback有了这么多的优势,那么用就完事了。

log4j2 特点

  • The Log4j API supports logging Messages instead of just Strings.
  • The Log4j API supports lambda expressions.
  • The Log4j API provides many more logging methods than SLF4J.
  • Improved Performance,使用多线程,相比log4j和logback,效率提高18倍。
  • Automatic Reloading of Configurations

log4j2配置结构

一句话概括Loggers和Appenders之间的关系:Appenders指定输出文件的级别和输出文件的位置,Loggers指定哪些包的log由哪一个Appeders输出

  • Configuration
    • Appenders
      • RollingFile
      • File
      • Console
    • Loggers
  1. configuration
    根节点,有两个属性,status 和 monitorinterval
    • status
      status 用来指定打印的级别(trace,debug,info,warn,error,fatal)
    • monitorinterval
      用来默认加载log4j2配置文件,单位为秒,如设置
      <configuration monitorinterval="30">
      代表每30秒会加载一次配置文件,所以在30秒内修改配置文件可以修改log的使用
  2. Appenders
    输出源,定义日志输出的地方。
    • 输出方式:

      %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间
      %-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
      %c : logger的名称(%logger)
      %t : 输出当前线程名称
      %p : 日志输出格式
      %m : 日志内容,即 logger.info("message")
      %n : 换行符
      %C : Java类名(%F)
      %L : 行号
      %M : 方法名
      %l : 输出语句所在的行数, 包括类名、方法名、文件名、行数
      hostName : 本地机器名
      hostAddress : 本地ip地址
      摘自https://www.cnblogs.com/keeya/p/10101547.html

    • 输出源类别
      Console,File,RollingFile等
      公共部分
      name:指定Appender的名字.
      fileName:指定输出日志的目的文件带全路径的文件名.
      PatternLayout:输出格式,不设置默认为:%m%n.

      RollingFile特有Policies 来确定什么时候生成文件。

       <RollingFile name="RollingFileRoot" fileName="/opt/logs/api/root.log"
                   filePattern="/opt/logs/api/root-%d{yyyy-MM-dd}-%i.log">
          <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
          <PatternLayout charset="UTF-8"
                         pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
          <Policies>
              <!--按天分配-->
              <TimeBasedTriggeringPolicy interval="1"/>
              <!--按大小分配-->
              <SizeBasedTriggeringPolicy size="1GB"/>
          </Policies>
      </RollingFile>
      
  3. Loggers
    给不同的包自定义日志级别。在Loggers中配置哪些包输出到哪些文件里(使用AppenderRef去指定appender中设置的输出位置
    • root
      • root为根记录器,不手动设置默认在 LoggerConfig,级别为ERROR且输出在 Console(控制台)
      • root 没有name和additivity属性
    • Logger
      • Logger 有name属性,为具体的包(com.xxx.api.dao)
      • Logger level属性(trace/warn/error等) 可以控制输出的级别
      • Logger additivity属性(true/false) 可以控制是否将这些包中输出的信息也写到root对应的Log中去。建议使用false来不写入。

springboot 使用 log4j2

在maven 中引入依赖

<!--取消在starter.web中自带的spring-boot-starter-logging,在starter.web中采用的是logback-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--添加log4J2依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <RollingFile name="RollingFileRoot" fileName="/opt/logs/api/root.log"
                     filePattern="/opt/logs/api/root-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <PatternLayout charset="UTF-8"
                           pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="1GB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="/opt/logs/api/warn.log"
                     filePattern="/opt/logs/api/warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8"
                           pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="1GB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <!--<DefaultRolloverStrategy max="20"/>-->
        </RollingFile>
        <RollingFile name="RollingFileError" fileName="/opt/logs/api/error.log"
                     filePattern="/opt/logs/api/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8"
                           pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="1GB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="MyBatisFile" fileName="/opt/logs/api/dao.log"
                     filePattern="/opt/logs/api/dao-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <PatternLayout charset="UTF-8"
                           pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="1GB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="requestLog" fileName="/opt/logs/api/request.log"
                     filePattern="/opt/logs/api/request-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <PatternLayout charset="UTF-8"
                           pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="1GB"/>
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFileRoot"/>
            <AppenderRef ref="RollingFileWarn"/>
            <AppenderRef ref="RollingFileError"/>
        </Root>
        <Logger name="com.xxx.api.dao" level="WARN" additivity="false">
            //为dao mapper所在的包,level为TRACE
            <AppenderRef ref="MyBatisFile"/>
        </Logger>

        <Logger name="requestLogger" level="TRACE" additivity="false">
            <AppenderRef ref="requestLog"/>
        </Logger>
    </Loggers>
</Configuration>

以上是关于log4j2 springboot 特点与使用方法的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot2.0 基础案例(02):配置Log4j2,实现不同环境日志打印

SpringBoot2.0 基础案例(02):配置Log4j2,实现不同环境日志打印

SpringBoot日志框架选型——Log4j2的配置与使用

[SpringBoot] Spring Boot(10)Logback和Log4j2集成与日志发展史

[SpringBoot] Spring Boot(10)Logback和Log4j2集成与日志发展史

为啥 Sleuth 在我的 Spring Boot 服务中不能与 Log4j2 一起使用