無廢話7小時學會使用Spring Cloud Alibaba(8)整合log4j2日誌

一 log4j2的優勢
相比與其他的日誌系統,log4j2丟數據這種情況少;disruptor技術,在多線程環境下,性能高於logback等10倍以上;利用jdk1.5併發的特性,減少了死鎖的發生。簡單來說,log4j2優越的性能其原因在於log4j2使用了LMAX,一個無鎖的線程間通信庫代替了,logback和log4j之前的隊列. 併發性能大大提升。

二 整合步驟
1.引入Jar包
springboot默認是用logback的日誌框架的,所以需要排除logback,不然會出現jar依賴衝突的報錯。

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-web</artifactId>  
    <!-- 去掉springboot默認配置 -->  
    <exclusions>
        <exclusion>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-logging</artifactId>  
        </exclusion>  
    </exclusions>  
</dependency> 
 
<!-- 引入log4j2依賴 -->  
<dependency> 
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-log4j2</artifactId>  
</dependency>

2.配置文件
如果自定義了文件名,需要在application.yml中配置
logging:
  config: xxxx.xml
但是我這裏一般用的是默認名log4j2-spring.xml,就不需在application.yml中配置了。


3.配置日誌文件模版

<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
<configuration monitorInterval="5">
  <!--日誌級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
 
  <!--變量配置-->
  <Properties>
    <!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日誌消息,%n是換行符-->
    <!-- %logger{36} 表示 Logger 名字最長36個字符 -->
    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
    <!-- 定義日誌存儲的路徑,不要配置相對路徑 -->
    <property name="FILE_PATH" value="更換爲你的日誌路徑" />
    <property name="FILE_NAME" value="更換爲你的項目名" />
  </Properties>
 
  <appenders>
 
    <console name="Console" target="SYSTEM_OUT">
      <!--輸出日誌的格式-->
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <!--控制檯只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
      <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
    </console>
 
    <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用-->
    <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
      <PatternLayout pattern="${LOG_PATTERN}"/>
    </File>
 
    <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
    <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
      <!--控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
      <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <Policies>
        <!--interval屬性用來指定多久滾動一次,默認是1 hour-->
        <TimeBasedTriggeringPolicy interval="1"/>
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下7個文件開始覆蓋-->
      <DefaultRolloverStrategy max="15"/>
    </RollingFile>
 
    <!-- 這個會打印出所有的warn及以下級別的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
    <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
      <!--控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
      <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <Policies>
        <!--interval屬性用來指定多久滾動一次,默認是1 hour-->
        <TimeBasedTriggeringPolicy interval="1"/>
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下7個文件開始覆蓋-->
      <DefaultRolloverStrategy max="15"/>
    </RollingFile>
 
    <!-- 這個會打印出所有的error及以下級別的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
    <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
      <!--控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
      <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <Policies>
        <!--interval屬性用來指定多久滾動一次,默認是1 hour-->
        <TimeBasedTriggeringPolicy interval="1"/>
        <SizeBasedTriggeringPolicy size="10MB"/>
      </Policies>
      <!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下7個文件開始覆蓋-->
      <DefaultRolloverStrategy max="15"/>
    </RollingFile>
 
  </appenders>
 
  <!--Logger節點用來單獨指定日誌的形式,比如要爲指定包下的class指定不同的日誌級別等。-->
  <!--然後定義loggers,只有定義了logger並引入的appender,appender纔會生效-->
  <loggers>
 
    <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
    <logger name="org.mybatis" level="info" additivity="false">
      <AppenderRef ref="Console"/>
    </logger>
    <!--監控系統信息-->
    <!--若是additivity設爲false,則 子Logger 只會在自己的appender裏輸出,而不會在 父Logger 的appender裏輸出。-->
    <Logger name="org.springframework" level="info" additivity="false">
      <AppenderRef ref="Console"/>
    </Logger>
 
    <root level="info">
      <appender-ref ref="Console"/>
      <appender-ref ref="Filelog"/>
      <appender-ref ref="RollingFileInfo"/>
      <appender-ref ref="RollingFileWarn"/>
      <appender-ref ref="RollingFileError"/>
    </root>
  </loggers>
 
</configuration>

4.使用
引入@Slf4j標籤就可以使用,非常方便

@RestController
@Slf4j
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping(value = "/user/make/{id}")
    public JsonVo<User> make(@PathVariable("id") String id) {

        log.info("=================="+id);

        User user = User.builder()
                .id(UUID.randomUUID().toString().replaceAll("-",""))
                .phone("123")
                .createTime(new Date())
                .build();

        userService.save(user);

        JsonVo<User> result = JsonVo.<User>builder()
                .code(200)
                .message("ok1")
                .data(user)
                .build();

        log.info("=================="+ JSON.toJSONString(result));

        return result;
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章