Spring boot 集成log4j2

关于日志的级别

log4j2 总共有 8 个级别, 按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

 ThresholdFilter:
        level: info
        onMatch: ACCEPT #表示匹配该级别及其以上的级别
        onMismatch: DENY#表示不匹配该级别以下的级别

onMatch=“ACCEPT"匹配>=该级别; onMatch=“DENY"不匹配>=该级别;

onMismatch=“ACCEPT” 表示匹配< 该级别; onMismatch=“DENY” 表示不匹配< 该级别;

在 Spring boot 中引入 log4j2

  1. 首先在 pom.xml 文件中去掉 Spring boot 自带的日志,然后引入 log4j2 的日志,如果是使用 yaml 来配置的话,还需要额外引入包。
<!--移除自带的日志-->
        <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-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<!--添加log4j2依赖,在比较新的Spring starter版本中,只有log4j2了-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-log4j2</artifactId>
		</dependency>

		<dependency>  <!-- 如果是使用log4j2.yml文件格式来配置,需要引入如下的包 -->
			<groupId>com.fasterxml.jackson.dataformat</groupId>
			<artifactId>jackson-dataformat-yaml</artifactId>
		</dependency>
  1. 然后在 Spring boot 的application.properties文件中指定 log4j2 的配置文件
#Spring boot的`application.properties`文件中指定log4j2的配置文件
logging.config=classpath:log4j2.yml
  1. 在程序中使用 log4j2
Logger logger = LoggerFactory.getLogger(Application.class);

如果使用了 lombook 的插件可以直接使用@Log4j2注解

log4j2.yml 配置文件参考

Configuration:
  status: warn

  Properties: # 定义全局变量
    Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
      #测试:-Dlog.level.console=warn -Dlog.level.xjj=trace
      #生产:-Dlog.level.console=warn -Dlog.level.xjj=info
      - name: log.level.console
        value: trace
      - name: log.level.xjj
        value: trace
      - name: log.path
        value: /temp/logs
      - name: project.name
        value: adressextraction

  Appenders:
    Console:  #输出到控制台
      name: CONSOLE
      target: SYSTEM_OUT
      ThresholdFilter:
        level: ${sys:log.level.console} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值
        onMatch: ACCEPT
        onMismatch: DENY
      PatternLayout:
        pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"
    RollingFile: # 输出到文件,超过128MB归档
      - name: ROLLING_FILE
        ignoreExceptions: false
        fileName: ${log.path}/${project.name}.log
        filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
        PatternLayout:
          pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"
        Policies:
          SizeBasedTriggeringPolicy:
            size: "128 MB"
        DefaultRolloverStrategy:
          max: 1000

  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: CONSOLE
        - ref: ROLLING_FILE
    Logger: # 为com.xjj包配置特殊的Log级别,方便调试
      - name: com.britecloud
        additivity: false
        level: ${sys:log.level.xjj}
        AppenderRef:
          - ref: CONSOLE
          - ref: ROLLING_FILE

log4j2 文件参考

# 共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。

Configuration:
  status: warn
  monitorInterval: 30

  Properties: # 定义全局变量
    Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
      #测试:-Dlog.level.console=warn -Dlog.level.trace=trace
      #生产:-Dlog.level.console=warn -Dlog.level.trace=info
      - name: log.level.console
        value: debug
      - name: log.level.trace
        value: trace
      - name: log.path
        value: /var/log/projectname
      - name: project.name
        value: projectname
      - name: log.pattern
        value: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"

  Appenders:
    Console: #输出到控制台
      name: CONSOLE
      target: SYSTEM_OUT
      ThresholdFilter:
        level: ${sys:log.level.console} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值
        onMatch: ACCEPT #匹配大于等于该级别的日志
        onMismatch: DENY # 不匹配低于该级别的日志
      PatternLayout:
        pattern: ${log.pattern}

    RollingFile: # 输出到文件,超过64MB归档
      - name: ROLLING_FILE
        ignoreExceptions: false
        fileName: ${log.path}/${project.name}.log
        filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
        PatternLayout:
          pattern: ${log.pattern}
        Policies:
          SizeBasedTriggeringPolicy:
            #按照文件的大小分割,也可以按照日期分割
            size: "16 MB"
            #TimeBasedTriggeringPolicy:
            # 按天分类
            #modulate: true
            #interval: 1
        DefaultRolloverStrategy:
          #文件最多100个
          max: 100

      #错误日志
      - name: ERROR_ROLLING_FILE
        ignoreExceptions: false
        fileName: ${log.path}/error/output.log
        filePattern: "${log.path}/error/error-%d{yyyy-MM-dd}-%i.log.gz"
        PatternLayout:
          pattern: ${log.pattern}
        Policies:
          SizeBasedTriggeringPolicy:
            size: "16 MB"
        ThresholdFilter:
          - level: debug
            onMatch: ACCEPT
            onMisMatch: DENY
        #          - level: FATAL
        #            onMatch: DENY
        #            onMisMatch: ACCEPT
        DefaultRolloverStrategy:
          max: 100

      #DEBUG日志
      - name: DEBUG_ROLLING_FILE
        ignoreExceptions: false
        fileName: ${log.path}/debug/output.log
        filePattern: "${log.path}/debug/error-%d{yyyy-MM-dd}-%i.log.gz"
        PatternLayout:
          pattern: ${log.pattern}
        Policies:
          SizeBasedTriggeringPolicy:
            size: "16 MB"
        DefaultRolloverStrategy:
          max: 100

      #INFO日志
      - name: INFO_FOLLING_FILE
        ignoreExceptions: false
        fileName: ${log.path}/info/output.log
        filePattern: "${log.path}/info/error-%d{yyyy-MM-dd}-%i.log.gz"
        PatternLayout:
          pattern: ${log.pattern}
        Policies:
          SizeBasedTriggeringPolicy:
            size: "16 MB"
        ThresholdFilter:
          - level: info
            onMatch: ACCEPT
            onMisMatch: DENY
        #          - level: WARN
        #            onMatch: DENY
        #            onMisMatch: ACCEPT
        DefaultRolloverStrategy:
          max: 100

  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: CONSOLE
        - ref: ROLLING_FILE
    Logger: # 为com.begevent包配置特殊的Log级别,方便调试
      - name: com.begevent
        additivity: false #不要继承
        level: ${sys:log.level.trace}
        AppenderRef:
          - ref: ROLLING_FILE

log4j2.xml 文件参考

<?xml version="1.0" encoding="UTF-8"?>
<!--设置log4j2的自身log级别为warn-->
<configuration status="warn">

    <appenders>
        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>

        <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/hpaasvc/info.log"
                     filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/hpaasvc/warn.log"
                     filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/hpaasvc/error.log"
                     filePattern="${sys:user.home}/logs/hpaasvc/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>

    </appenders>

    <loggers>
        <!--过滤掉spring和hibernate的一些无用的debug信息-->
        <logger name="org.springframework" level="INFO">
        </logger>
        <logger name="org.hibernate" level="INFO">
        </logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

</configuration>