欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

log4j2的異步使用及添加自定義參數(shù)方式

 更新時間:2021年12月22日 17:14:14   作者:住街對面的查理  
這篇文章主要介紹了log4j2的異步使用及添加自定義參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

log4j2異步使用及添加自定義參數(shù)

關(guān)于log4j2的性能和原理就不贅述了,這篇主要講使用,配置文件解讀,和添加自定義參數(shù),偏應(yīng)用的一篇文章。

相比與其他的日志系統(tǒng),log4j2丟數(shù)據(jù)這種情況少;disruptor技術(shù),在多線程環(huán)境下,性能高于logback等10倍以上;利用jdk1.5并發(fā)的特性,減少了死鎖的發(fā)生;

目前看來,log4j2的性能最突出。

添加依賴(這里省略了版本號)

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

然后再各個項目中添加文件log4j2.xml,在要使用的類上添加@slf4j 注解(lombok的),即可使用log對象。

log4j 2.0與以往的1.x有一個明顯的不同,其配置文件只能采用.xml, .json或者 .jsn。在默認情況下,系統(tǒng)選擇configuration文件的優(yōu)先級如下:(classpath為src文件夾)

  • classpath下名為 log4j-test.json 或者log4j-test.jsn文件
  • classpath下名為 log4j2-test.xml
  • classpath下名為 log4j.json 或者log4j.jsn文件
  • classpath下名為 log4j2.xml

level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

下面寫一個生產(chǎn)可用的log4j2.xml的模板

<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration后面的status,這個用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,當設(shè)置成trace時,你會看到log4j2內(nèi)部各種詳細輸出-->
<!-- monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)-->
<configuration status="WARN">
<Properties>
<!--常用變量配置 供下文中使用-->
<property name="APP_NAME">項目名稱</property>
<property name="LOGGER_LEVEL">INFO</property>
<!--日志路徑 對應(yīng)服務(wù)器路徑-->
<property name="LOGGER_PATH">/data/logs</property> 
<Property name="LOG_HOME">${LOGGER_PATH}/${APP_NAME}</Property>
<!--文件大小-->
<Property name="FILE_SIZE">10M</Property>
<!--日志格式-->
<Property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n</Property>
<!--日志文件命名格式-->
<Property name="rolling_file_name">-%d{yyyy-MM-dd}.%i.zip</Property>
<!--日志留存最大文件數(shù)-->
<Property name="rollover_strategy_max">30</Property>
<Property name="LOG_HOME_PROJECT">${LOG_HOME}/${APP_NAME}-project</Property>
<Property name="LOG_HOME_PROJECT_ERROR">${LOG_HOME}/${APP_NAME}-project-error</Property>
<Property name="LOG_HOME_SQL">${LOG_HOME}/${APP_NAME}-sql</Property>
</Properties>
<appenders>
<!--控制臺打印 及格式-->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${log_pattern}" />
</Console>
<!--定義rolling() 供下文使用-->
<RollingRandomAccessFile name="projectRolling"
fileName="${LOG_HOME_PROJECT}.log"
filePattern="${LOG_HOME_PROJECT}${rolling_file_name}"
immediateFlush="false" append="true">
<PatternLayout>
<Pattern>${log_pattern}</Pattern>
<Charset>UTF-8</Charset>
</PatternLayout>
<Policies>
<!--滾動規(guī)則 時間或者文件大小 滾動后將按照filePattern命名-->
<!--interval屬性用來指定多久滾動一次,默認是1 hour-->
<TimeBasedTriggeringPolicy interval="24"/>
<SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy max="${rollover_strategy_max}" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="projectErrorRolling"
fileName="${LOG_HOME_PROJECT_ERROR}.log"
filePattern="${LOG_HOME_PROJECT_ERROR}${rolling_file_name}"
immediateFlush="false" append="true">
<Filters>
<!-- 只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)可以使用多個ThresholdFilter 達到精準過濾某個級別的日志-->
<ThresholdFilter level="${LOGGER_LEVEL}" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout>
<Pattern>${log_pattern}</Pattern>
<Charset>UTF-8</Charset>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy max="${rollover_strategy_max}" />
</RollingRandomAccessFile>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="sqlRolling"
fileName="${LOG_HOME_SQL}.log"
filePattern="${LOG_HOME_SQL}${rolling_file_name}"
immediateFlush="false" append="true">
<PatternLayout>
<Pattern>${log_pattern}</Pattern>
<Charset>UTF-8</Charset>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="${FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy max="${rollover_strategy_max}" />
</RollingRandomAccessFile>
</appenders>
<!--Logger節(jié)點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。-->
<loggers>
<!--異步日志 區(qū)別于普通使用的logger root 搭配-->
<!--name 為包名 對應(yīng)配置日志輸出等級level -->
<!--若是additivity設(shè)為false,則 子Logger 只會在自己的appender里輸出,而不會在 父Logger 的appender里輸出。-->
<!--將org.springframework包下的日志打印到Console控制臺,projectRolling文件,projectErrorRolling(error級別單獨一個文件)-->
<AsyncLogger name="org.springframework" level="${LOGGER_LEVEL}" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="projectRolling"/>
<appender-ref ref="projectErrorRolling"/>
</AsyncLogger>
<AsyncLogger name="com.alibaba.dubbo" level="${LOGGER_LEVEL}" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="projectRolling"/>
<appender-ref ref="projectErrorRolling"/>
</AsyncLogger>
<AsyncLogger name="druid.sql" level="${LOGGER_LEVEL}" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="sqlRolling"/>
</AsyncLogger>
<AsyncLogger name="org.mybatis" level="${LOGGER_LEVEL}" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="sqlRolling"/>
</AsyncLogger>
<AsyncLogger name="com.項目包名" level="${LOGGER_LEVEL}" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="projectRolling"/>
<appender-ref ref="projectErrorRolling"/>
</AsyncLogger>
<AsyncRoot level="${LOGGER_LEVEL}">
<appender-ref ref="Console"/>
<appender-ref ref="projectRolling" />
<appender-ref ref="projectErrorRolling" />
</AsyncRoot>
</loggers>
</configuration>

如上配置會產(chǎn)生3個日志文件

  • 項目名稱-project.log
  • 項目名稱-project-error.log
  • 項目名稱-sql.log

補充知識

onMatch和onMismatch都有三個屬性值,分別為Accept、DENY和NEUTRAL

分別介紹這兩個配置項的三個屬性值:

  • onMatch=“ACCEPT” 表示匹配該級別及以上
  • onMatch=“DENY” 表示不匹配該級別及以上
  • onMatch=“NEUTRAL” 表示該級別及以上的,由下一個filter處理,如果當前是最后一個,則表示匹配該級別及以上
  • onMismatch=“ACCEPT” 表示匹配該級別以下
  • onMismatch=“NEUTRAL” 表示該級別及以下的,由下一個filter處理,如果當前是最后一個,則不匹配該級別以下的
  • onMismatch=“DENY” 表示不匹配該級別以下的

自定義日志格式

  • %d{HH:mm:ss.SSS} 表示輸出到毫秒的時間
  • %logger{36} 簡單理解為類名
  • %thread 輸出當前線程名稱
  • %-5level 輸出日志級別,-5表示左對齊并且固定輸出5個字符,如果不足在右邊補0
  • %logger 輸出logger名稱,因為Root Logger沒有名稱,所以沒有輸出
  • %msg 日志文本
  • %n 換行
  • %X{xxx} xxx為自定義參數(shù)

如何在日志中添加自己想傳的參數(shù)?

定義攔截器(web服務(wù)攔controller,dubbo服務(wù)攔api),每次請求過來,攔住,然后將自定義參數(shù)傳入。至于自定義參數(shù)怎么存,就是另一個問題了。

eg: traceId 跟蹤號 對應(yīng)log4j2.xml中的 %X{traceId}

下面是關(guān)鍵代碼:

public class ContextFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String traceId = UUID.randomUUID().toString().replaceAll("-", "");
// org.slf4j.MDC 
        MDC.put(CommonConsts.TRACE_ID_LOG, traceId);// 用來給日志文件使用
// org.apache.logging.log4j.ThreadContext
    ThreadContext.put(CommonConsts.TRACE_ID_LOG, traceId); //經(jīng)測試,這兩行都可行。
    filterChain.doFilter(servletRequest, servletResponse);
}

最后的日志打印效果如下:

2019-05-29 12:04:30.122 [http-nio-8080-exec-2] [2333333] INFO com.core.web.filter.ContextFilter - 接口調(diào)用時間:245毫秒

log4j 輸入自定義參數(shù)

使用log4j、log4j2輸入日志時,有時想追加打印自定義參數(shù)(比如客戶端環(huán)境:手機型號、瀏覽器數(shù)據(jù),request數(shù)據(jù)、用戶數(shù)據(jù)等),以便于快速定位問題所在。

亦或在多線程環(huán)境中,快速定位哪些日志是由同一用戶輸出,便于其他工具進行日志分析。

log4j提供了ThreadContext 線程上下文類,用于存儲自定義數(shù)據(jù),以便在輸入日志時,包含指定數(shù)據(jù)。

測試代碼如下

package com.howtodoinjava.log4j2.examples;
import java.util.UUID;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
 
public class Log4j2HelloWorldExample {
    private static final Logger LOGGER = LogManager.getLogger(Log4j2HelloWorldExample.class.getName());
    public static void main(String[] args) {
        //Add context information
        ThreadContext.put("id", UUID.randomUUID().toString());
        ThreadContext.put("ipAddress", "192.168.21.9");
 
        LOGGER.debug("Debug Message Logged !!");
        LOGGER.info("Info Message Logged !!");
        LOGGER.debug("Another Debug Message !!");
 
        //Clear the map
        ThreadContext.clearMap();
		
        LOGGER.debug("Thread Context Cleaned up !!");
        LOGGER.debug("Log message with no context information !!");
    }
}

而后在 log4j.xml 中指定上述參數(shù),

單獨使用%X以包含地圖的全部內(nèi)容。

使用%X{key}包括指定的鍵。

使用%x包括堆棧的全部內(nèi)容。

在實際應(yīng)用時,一般是在過濾器、攔截器進行上述操作,方法之前,將數(shù)據(jù)綁定到線程中,方法完成后,清理線程數(shù)據(jù)。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java代碼實現(xiàn)微信頁面滾動防露底(核心代碼)

    Java代碼實現(xiàn)微信頁面滾動防露底(核心代碼)

    這篇文章主要介紹了Java代碼實現(xiàn)微信頁面滾動防露底的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • JAVA抽象類,接口,內(nèi)部類詳解

    JAVA抽象類,接口,內(nèi)部類詳解

    這篇文章主要給大家介紹了關(guān)于Java中抽象類,接口,內(nèi)部類的相關(guān)資料,文中通過示例代碼介紹的非常詳細,,需要的朋友們下面隨著小編來一起學習學習吧
    2021-09-09
  • Java正則表達式——group方法的使用

    Java正則表達式——group方法的使用

    這篇文章主要介紹了Java正則表達式group方法的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • java編程進階小白也能手寫HashMap代碼

    java編程進階小白也能手寫HashMap代碼

    這篇文章是一篇java小白進階篇本文教大家手寫一個HashMap實現(xiàn)的示例代碼,有需要的朋友可以借鑒參考下,希望對大家能夠有所進益,祝大家早日升職加薪
    2021-10-10
  • JAVA使用JDBC技術(shù)操作SqlServer數(shù)據(jù)庫實例代碼

    JAVA使用JDBC技術(shù)操作SqlServer數(shù)據(jù)庫實例代碼

    本篇文章主要介紹了JAVA使用JDBC技術(shù)操作SqlServer數(shù)據(jù)庫實例代碼,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • springboot項目監(jiān)控開發(fā)小用例(實例分析)

    springboot項目監(jiān)控開發(fā)小用例(實例分析)

    這篇文章主要介紹了springboot項目監(jiān)控開發(fā)小用例,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java NIO實現(xiàn)群聊系統(tǒng)

    Java NIO實現(xiàn)群聊系統(tǒng)

    這篇文章主要為大家詳細介紹了Java NIO實現(xiàn)群聊系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • mybatis中一對一關(guān)系association標簽的使用

    mybatis中一對一關(guān)系association標簽的使用

    這篇文章主要介紹了mybatis中一對一關(guān)系association標簽的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot MongoDB詳細使用教程

    SpringBoot MongoDB詳細使用教程

    這篇文章主要介紹了SpringBoot整合Mongodb實現(xiàn)簡單的增刪查改,MongoDB是一個以分布式數(shù)據(jù)庫為核心的數(shù)據(jù)庫,因此高可用性、橫向擴展和地理分布是內(nèi)置的,并且易于使用。況且,MongoDB是免費的,開源的,感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • Mybatis-Plus的saveOrUpdateBatch(null)問題及解決

    Mybatis-Plus的saveOrUpdateBatch(null)問題及解決

    這篇文章主要介紹了Mybatis-Plus的saveOrUpdateBatch(null)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論