最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在logback.xml中自定義動態(tài)屬性的方法

 更新時間:2019年08月21日 08:55:16   作者:【空山新雨】  
這篇文章主要介紹了在logback.xml中自定義動態(tài)屬性的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

當使用logback來記錄Web應(yīng)用的日志時,我們通過在logback.xml中配置appender來指定日志輸出格式及輸出文件路徑,這在一臺主機或一個文件系統(tǒng)上部署單個實例沒有問題,但是如果部署多個實例(比如通過容器的方式),多個實例同時往同一文件寫日志可能就會引起問題。這時可以將每個實例的日志文件加以區(qū)分,如IP或UUID,或兩者結(jié)合的形式。這其實就涉及如何在logback.xml中自定義動態(tài)屬性的問題。

可以有4種方式來實現(xiàn)logback.xml中獲取自定義變量值:

  • 通過設(shè)置環(huán)境變量或傳遞系統(tǒng)屬性(比如在程序啟動時通過-D傳遞)的方式,兩者是可以直接在logback.xml中通過 ${變量名} 獲取的。
  • 自定義logback.xml的加載時機,在其加載前將需要設(shè)置的屬性注入到logback的context中,這種方式相對復(fù)雜,本文不討論。
  • 通過實現(xiàn)PropertyDefiner接口來提供屬性值設(shè)置
  • 通過實現(xiàn)LoggerContextListener接口來設(shè)置屬性值

第一種方式簡單,但不能通過程序生成屬性值,第二種方式稍顯復(fù)雜,本文主要介紹后兩種方式。

PropertyDefiner方式

首先定義一個類,實現(xiàn)PropertyDefiner接口,可以通過繼承PropertyDefinerBase會更方便

import ch.qos.logback.core.PropertyDefinerBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.UUID;
/***
 * 將本地IP拼接到日志文件名中,以區(qū)分不同實例,避免存儲到同一位置時的覆蓋沖突問題
 * @Author ronwxy
 * @Date 2019/8/20 16:17  
 */
public class IPLogDefiner extends PropertyDefinerBase {
  private static final Logger LOG = LoggerFactory.getLogger(IPLogDefiner.class);
  private String getUniqName() {
    String localIp = null;
    try {
      localIp = InetAddress.getLocalHost().getHostAddress();
    } catch (UnknownHostException e) {
      LOG.error("fail to get ip...", e);
    }
    String uniqName = UUID.randomUUID().toString().replace("-", "");
    if (localIp != null) {
      uniqName = localIp + "-" + uniqName;
    }
    return uniqName;
  }
  @Override
  public String getPropertyValue() {
    return getUniqName();
  }
}

然后在logback.xml中,添加 <define> 配置,指定屬性名(本例中為localIP)及獲取屬性值的實現(xiàn)類,這樣就可以在配置中通過 ${localIP}來引用該屬性值了。在實現(xiàn)方法 getPropertyValue 中返回你需要生成的值,本例中是返回 本地IP-UUID 的形式。

<configuration>
  <define name="localIP" class="cn.jboost.common.IPLogDefiner"/>
  <appender name="interfaceLogFile"
       class="ch.qos.logback.core.rolling.RollingFileAppender">
    <encoding>UTF-8</encoding>
    <File>D:\\logs\\elk\\interface-${localIP}.log</File>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
# 省略了其它配置

LoggerContextListener方式

定義一個實現(xiàn)LoggerContextListener接口的類,在start方法中,將需要設(shè)置的屬性設(shè)置到logback的Context中,

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.spi.ContextAwareBase;
import ch.qos.logback.core.spi.LifeCycle;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.UUID;
/***
 * 第二種實現(xiàn)方式
 * @Author ronwxy
 * @Date 2019/8/20 18:45  
 */
public class LoggerStartupListener extends ContextAwareBase 
  implements LoggerContextListener, LifeCycle {
  private boolean started = false;
  @Override
  public void start() {
    if (started) {
      return;
    }
    Context context = getContext();
    context.putProperty("localIP", getUniqName());
    started = true;
  }
  private String getUniqName() {
    String localIp = null;
    try {
      localIp = InetAddress.getLocalHost().getHostAddress();
    } catch (UnknownHostException e) {
      //LOG.error("fail to get ip...", e);
    }
    String uniqName = UUID.randomUUID().toString().replace("-", "");
    if (localIp != null) {
      uniqName = localIp + "-" + uniqName;
    }
    return uniqName;
  }
//省略了其它函數(shù)

 然后在logback.xml中,配置如上監(jiān)聽器類,這樣就可以通過 ${localIP} 獲取到上面 context.putProperty("localIP", getUniqName()); 設(shè)置的值了。

<configuration>

  <!--<define name="localIP" class="com.cnbot.common.IPLogDefiner"/>-->
  <contextListener class="cn.jboost.common.LoggerStartupListener"/>
  <define name="localIP" class="com.cnbot.common.IPLogDefiner"/>
  <appender name="interfaceLogFile"
       class="ch.qos.logback.core.rolling.RollingFileAppender">
    <encoding>UTF-8</encoding>
    <File>D:\\logs\\elk\\interface-${localIP}.log</File>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
# 省略了其它配置

這種方式能設(shè)置任意個數(shù)的屬性值,比前一種方式靈活。

總結(jié)

在logback.xml中獲取自定義屬性值,主要是需要在加載前將對應(yīng)的屬性值進行設(shè)置,這樣加載時才能有效獲取。本文雖是自定義日志文件名稱,但不局限于此,所有需要動態(tài)獲取的變量都可以按這種方式實現(xiàn)。

相關(guān)文章

  • MyBatisPlus深入探究映射匹配的兼容性

    MyBatisPlus深入探究映射匹配的兼容性

    在最近的工作中,碰到一個比較復(fù)雜的返回結(jié)果,發(fā)現(xiàn)簡單映射已經(jīng)解決不了這個問題了,只好去求助百度,學習mybatis映射匹配應(yīng)該怎么寫,將學習筆記結(jié)合工作碰到的問題寫下本文,供自身查漏補缺,同時已被不時之需
    2022-08-08
  • 淺談在JAVA項目中LOG4J的使用

    淺談在JAVA項目中LOG4J的使用

    下面小編就為大家?guī)硪黄獪\談在JAVA項目中LOG4J的使用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • spring如何解決循環(huán)依賴問題

    spring如何解決循環(huán)依賴問題

    Spring在單例模式下用三級緩存設(shè)計解決setter方法注入bean屬性循環(huán)依賴問題,但無法解決多例Bean和構(gòu)造方法注入?yún)?shù)的循環(huán)依賴,三級緩存通過A、B兩對象互相注入屬性的過程解決循環(huán)依賴,其中,構(gòu)造方法的循環(huán)依賴無法解決是因為創(chuàng)建對象會走構(gòu)造方法
    2024-10-10
  • Java 中的 NoSuchMethodException 異常及解決思路(最新推薦)

    Java 中的 NoSuchMethodException 異常及解決思路(最新推薦)

    NoSuchMethodException異常是Java中使用反射機制時常見的錯誤,它通常由方法名或參數(shù)不匹配、訪問權(quán)限問題、方法簽名不匹配等原因引發(fā),解決方法包括核實方法名及其參數(shù)類型、確認方法訪問權(quán)限、檢查方法簽名和重載問題、確保方法存在于正確的類中,感興趣的朋友一起看看吧
    2025-01-01
  • Java中的流式編程問題

    Java中的流式編程問題

    這篇文章主要介紹了Java中的流式編程問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 一文詳解mybatis二級緩存執(zhí)行流程

    一文詳解mybatis二級緩存執(zhí)行流程

    本文主要詳細介紹了mybatis二級緩存執(zhí)行流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考價值,感興趣的朋友們下面隨著小編來一起學習吧
    2024-02-02
  • 聊聊SpringBoot中組件無法被注入的問題

    聊聊SpringBoot中組件無法被注入的問題

    這篇文章主要介紹了SpringBoot中組件無法被注入的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 什么是Java布隆過濾器?如何使用你知道嗎

    什么是Java布隆過濾器?如何使用你知道嗎

    這篇文章主要為大家詳細介紹了Java布隆過濾器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 幾句話說清session,cookie和token的區(qū)別及說明

    幾句話說清session,cookie和token的區(qū)別及說明

    這篇文章主要介紹了幾句話說清session,cookie和token的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 一篇文章帶你入門java注解

    一篇文章帶你入門java注解

    這篇文章主要介紹了Java注解詳細介紹,本文講解了Java注解是什么、Java注解基礎(chǔ)知識、Java注解類型、定義Java注解類型的注意事項等內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論

建水县| 崇义县| 南汇区| 东阿县| 马边| 台山市| 庆云县| 利川市| 浦东新区| 万盛区| 江达县| 定陶县| 乐安县| 揭东县| 瑞安市| 新绛县| 侯马市| 万年县| 秦安县| 老河口市| 神木县| 晋宁县| 建德市| 海南省| 新野县| 乐都县| 渑池县| 自治县| 滦平县| 仙居县| 永春县| 青川县| 南澳县| 灵川县| 兴宁市| 永顺县| 岳阳市| 台前县| 瑞金市| 凭祥市| 北碚区|