亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在logback.xml中自定義動態屬性的方法

發布時間:2020-08-24 07:40:35 來源:腳本之家 閱讀:212 作者:【空山新雨】 欄目:編程語言

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

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

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

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

PropertyDefiner方式

首先定義一個類,實現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拼接到日志文件名中,以區分不同實例,避免存儲到同一位置時的覆蓋沖突問題
 * @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)及獲取屬性值的實現類,這樣就可以在配置中通過 ${localIP}來引用該屬性值了。在實現方法 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方式

定義一個實現LoggerContextListener接口的類,在start方法中,將需要設置的屬性設置到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;
/***
 * 第二種實現方式
 * @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;
  }
//省略了其它函數

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

<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>
# 省略了其它配置

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

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新宁县| 永康市| 宁城县| 临武县| 灵台县| 崇州市| 宣城市| 吴桥县| 太白县| 宜兰市| 兴仁县| 旌德县| 黄平县| 洪洞县| 伊春市| 饶平县| 米林县| 收藏| 广德县| 桑植县| 伊宁市| 深泽县| 潮州市| 广元市| 仁怀市| 雷州市| 邵东县| 格尔木市| 棋牌| 贵定县| 渝中区| 綦江县| 嘉善县| 贵德县| 东兰县| 赤壁市| 大丰市| 玛纳斯县| 崇州市| 桐庐县| 岳普湖县|