log4j.xml引用Javaweb項目中配置文件的參數

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

由于最近用阿里云日志服務整合log4j,在配置com.aliyun.openservices.log.log4j.LoghubAppender需要設置一些參數,因為項目中有統一的配置文件,所以想要可以直接在log4j.xml中通過${}來獲取參數,參考下面的配置。

<appender name="AliyunSLS" class="com.aliyun.openservices.log.log4j.LoghubAppender"><param name="projectName" value="${Props.Log4j.AliyunSLS.projectName}"/><!-- 日志服務的project名,必選參數 --><param name="logstore" value="${Props.Log4j.AliyunSLS.logstore}"/><!-- 日志服務的logstore名,必選參數 --><param name="endpoint" value="${Props.Log4j.AliyunSLS.endpoint}"/><!-- 日志服務的http地址,必選參數 --><param name="accessKeyId" value="${Props.Log4j.AliyunSLS.accessKeyId}"/><!-- 用戶身份標識,必選參數 --><param name="accessKey" value="${Props.Log4j.AliyunSLS.accessKey}"/><!-- 用戶身份標識,必選參數 --><param name="packageTimeoutInMS" value="${Props.Log4j.AliyunSLS.packageTimeoutInMS}"/><!-- 被緩存起來的日志的發送超時時間,如果緩存超時,則會被立即發送,單位是毫秒,默認值為3000,最小值為10,可選參數 --><param name="logsCountPerPackage" value="${Props.Log4j.AliyunSLS.logsCountPerPackage}"/><!-- 每個緩存的日志包中包含日志數量的最大值,不能超過 4096,可選參數 --><param name="logsBytesPerPackage" value="${Props.Log4j.AliyunSLS.logsBytesPerPackage}"/><!-- 每個緩存的日志包的大小的上限,不能超過 3MB,單位是字節,可選參數 --><param name="memPoolSizeInByte" value="${Props.Log4j.AliyunSLS.memPoolSizeInByte}"/><!-- Appender 實例可以使用的內存的上限,單位是字節,默認是 100MB,可選參數 --><param name="maxIOThreadSizeInPool" value="${Props.Log4j.AliyunSLS.maxIOThreadSizeInPool}"/><!-- 指定I/O線程池最大線程數量,主要用于發送數據到日志服務,默認是8,可選參數 --><param name="retryTimes" value="${Props.Log4j.AliyunSLS.retryTimes}"/><!-- 指定發送失敗時重試的次數,如果超過該值,會把失敗信息通過log4j的LogLog進行輸出,默認是3,可選參數 --><param name="topic" value="${Props.Log4j.AliyunSLS.topic}"/><!-- 指定日志主題,可選參數 --><!--<param name="source" value="Props.Log4j.AliyunSLS.source"/>--><!-- 指定日志來源,可選參數 --><param name="timeFormat" value="${Props.Log4j.AliyunSLS.timeFormat}"/><!-- 設置時間格式,可選參數 --><param name="timeZone" value="${Props.Log4j.AliyunSLS.timeZone}"/><!-- 設置時區,可選參數 --><param name="Threshold" value="${Props.Log4j.AliyunSLS.Threshold}"/><!-- 輸出WARN級別及以上的消息 --></appender>

log4j.xml中通過${}引用的變量是系統變量,即通過System.getProperty()獲取,顯然這里我們只需要將我們需要的變量設置到系統變量中即可,第一種方法就是在啟動的時候指定系統變量,這種方法不方便,每次啟動都要手動輸入變量的值。第二種就是我們只要確保在日志服務啟動前將參數設置到系統變量中就可以了。這里介紹一種通過自定義LoggerFactory的方式來實現。

通過查看源碼知道,log4j在解析log4j.xml的時候最先解析的是<loggerFactory/>節點,該節點代表的是日志生成工廠接口org.apache.log4j.spi.LoggerFactory,代碼如下:

package org.apache.log4j.spi;import org.apache.log4j.Logger;public interface LoggerFactory {Logger makeNewLoggerInstance(String var1);
}

默認情況下,log4j會加載LoggerFactory的默認實現類org.apache.log4j.DefaultCategoryFactory,代碼如下:

package org.apache.log4j;import org.apache.log4j.spi.LoggerFactory;class DefaultCategoryFactory implements LoggerFactory {DefaultCategoryFactory() {}public Logger makeNewLoggerInstance(String name) {return new Logger(name);}
}

DefaultCategoryFactory.makeNewLoggerInstance(name)直接生成Logger,需要注意的是Logger的構造方法是受保護的,也就是我們沒辦法在其他包中通過new?Logger(name)來生成一個Logger實例,代碼如下:

public class Logger extends Category {private static final String FQCN;protected Logger(String name) {super(name);}...
}

由源碼可以看出,LoggerFactory的實現非常簡單,接下來看一下如何實現。

?

1、由于Logger的構造方法是受保護的,所以我們只要通過自定義Logger子類,就可以使用Logger的功能了

public class Log4jLogger extends Logger {public Log4jLogger(String name) {super(name);}
}

2、實現LoggerFactory接口

public class Log4jLoggerFactory implements LoggerFactory {private static final String LOG4J_PROPERTY_PREFIX_KEY = "log4jPropertyPrefix";//默認以Props.Log4j.開頭的參數加載到系統變量中private static final String DEFAULT_LOG4J_PROPERTY_PREFIX = "Props.Log4j.";static {loadLog4jPropsToSystem();}//加載參數到系統變量中//PropertiesUtils由系統自定義的獲取配置文件的工具類,根據自己的需要自行實現private static void loadLog4jPropsToSystem() {//如果配置了log4jPropertyPrefix,則以該參數作為參數開頭標識String prefixsParam = PropertiesUtils.getStringValue(LOG4J_PROPERTY_PREFIX_KEY);String[] prefixs = null;if (StringUtil.isNotBlank(prefixsParam)) {prefixs = prefixsParam.split(",");} else {prefixs = new String[] {DEFAULT_LOG4J_PROPERTY_PREFIX};}//獲取所有系統配置文件信息Map<Object, Object> allProperties = PropertiesUtils.getAllProperties();if (allProperties != null && !allProperties.isEmpty()) {for (Map.Entry<Object, Object> e : allProperties.entrySet()) {String key = e.getKey().toString();for (String pf : prefixs) {if (key.startsWith(pf)) {System.setProperty(key, e.getValue().toString());System.out.println("Set log4j property[" + key + "=" + e.getValue().toString() + "] into System. ");break;}}}}}@Overridepublic Logger makeNewLoggerInstance(String name) {return new Log4jLogger(name);}}

3、在log4j.xml中配置自定義LoggerFactory,<loggerFactory/>配置在最前面

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'><!-- 自定義log4j日志生成工廠,可以加載配置文件中參數設置到系統參數中,默認加載以Props.Log4j.開頭的參數,可以通過log4jPropertyPrefix配置加載哪些參數,有多個的話用逗號分隔 --><loggerFactory class="自己的包路徑.Log4jLoggerFactory"/>...
</log4j:configuration>

到這里就完畢了,配置文件中的參數就可以給log4j.xml使用了。

轉載于:https://my.oschina.net/linchuhao23/blog/2248889

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277060.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277060.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

……

快瘋了快瘋了…… 我無非是想找人說話。已經幾天沒有講話了。 轉載于:https://www.cnblogs.com/belial/archive/2007/04/13/711429.html

時間換算單位

時鐘周期是一個時間的量&#xff0c;人們規定10納秒&#xff08;ns&#xff09;為一個時鐘周期。時鐘周期表示了SDRAM所能運行的最高頻率。更小的時鐘周期就意味著更高的工作頻率。對于PC100規格的內存來說&#xff0c;它的運行時鐘周期應該不高于10納秒。納秒與工作頻率之間的…

砂 即懶且忙 只有隨筆

B同學說&#xff1a;砂&#xff0c;你已經好久沒更新你的博了。是啊&#xff0c;我即懶且忙。上周六爬了青云山&#xff0c;公司組織的。一直懶得處理照片。拍了將近300張的照片&#xff0c;可到現在也就才弄了那么幾張。我自戀。照片是自拍的。娘說&#xff1a;天吶&#xff0…

.Net Core創建Docker鏡像

1、.Net Core項目【Lails.Server.Demo】發布到目錄下Lails.Server.Demo\bin\Release\netcoreapp2.1\publish2、上面目錄下新建文件Dockerfile&#xff1a;# 父鏡像FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base# 設置工作目錄WORKDIR /app# 復制發布文件到/app下COPY …

[原]變參函數原理詳解

/*變參函數原理說明:va_start就是求得第一個可變參的地址.下面幾個宏的作用:保是來確定可變參數的列表中每個參數的地址.實現變參函數的要點,就是想辦法取得每個參數的地址.*/#include <stdio.h> #include <stdarg.h>#if 0#define va_list void*#define va_arg(arg…

Web服務器的配置方法

Web服務器的配置方法 一、 安裝IIS 1. 進入[控制面板]-[新增/移除Windows元件]&#xff0c;勾選Internet Information Servers(IIS)如圖&#xff0c;在安裝過程中需要插入windows操作系統光盤2. 建立虛擬目錄 右擊[我的電腦]--管理&#xff0c;找到[…

2018年開發者生態體系狀態調查報告(第一部分)

在2018年年初&#xff0c;jetbrains公司通過調查6000名開發者來了解開發者的生態狀態&#xff0c;最近&#xff0c;調查結果終于整理完畢&#xff0c;以下是得出的結果。一、 日常工作1.1&#xff09;流行語言&#xff1a;今年&#xff0c;使用最受歡迎、最常用與最有前途的語言…

面向對象三大基本特性,五大基本原則

透切理解面向對象三大基本特性是理解面向對象五大基本原則的基礎. 三大特性是&#xff1a;封裝,繼承,多態 所謂封裝&#xff0c;也就是把客觀事物封裝成抽象的類&#xff0c;并且類可以把自己的數據和方法只讓可信的類或者對象操作&#xff0c;對不可信的進行信息隱藏。封裝是…

人事薪資管理系統V1.00功能簡介(適用于工廠)c#.net+SQL Server2000

1. 統計管理1.1 工廠員工綜合統計1.2 按月統計生產訂單總金額1.3 按月統計員工工資1.4 按月統計員工計件工資1.5 員工生日排行榜2. 人事管理2.1 增加員工信息2.2 上傳或更換員工照片2.3 確認員工基本薪資&#xff08;含包月&#xff0c;計件&#xff0c;計…

運維工程師主要工作是做什么?

總結兩句話&#xff1a; 1、保障業務長期穩定運行&#xff08;如網站服務器、游戲服務器等&#xff09;。 2、保障數據安全可靠&#xff08;如用戶名密碼、游戲數據、博客文章、交易數據等&#xff09;。 由這兩句話推演運維工程師要學些什么&#xff1f; 一、保障業務長期穩定…

python3.7 安裝cx_Freeze

遇到的問題簡單描述&#xff1a; 1&#xff0c;直接 pip install cz_freeze 安裝失敗 2&#xff0c;pip cx_Free-*.*.*.tar.gz 安裝失敗 解決辦法&#xff1a; 1&#xff0c;下載 cx_Freeze-5.1.1-cp37-cp37m-win_amd64.whl &#xff08;地址&#xff1a;https://www.lfd.uci…

SiteMesh參考

SiteMesh參考 作者&#xff1a;kongxx (kongxxgmail.com)安裝 首先從sitemesh下載安裝包&#xff0c;這里使用的是2.2.1版本。 創建一個Web應用程序&#xff0c;這里我創建一個名為myapp的Web應用程序&#xff1b; 復制sitemesh-2.2.1.jar文件到{myapp}/WEB-INF/lib目錄下&am…

精通Spring Boot——第十一篇:使用自定義配置

2019獨角獸企業重金招聘Python工程師標準>>> 今天這篇文章給大家介紹自定義配置的兩種方式 第一式&#xff1a; 使用ConfigurationProperties&#xff0c;且看代碼 package com.developlee.customconfig.config;import org.springframework.boot.context.properties…

MySQL 高可用架構在業務層面的應用分析

MySQL 高可用架構在業務層面的應用分析 http://mp.weixin.qq.com/s?__bizMzAxNjAzMTQyMA&mid208312443&idx1&snf9a0d03dd9a1cf3b3575c0241291e421&scene22&srcidseLU5tmZumKLzwVBIHzM#rd http://mp.weixin.qq.com/s?__bizMzAxNjAzMTQyMA&mid20831244…

使用Expresso學習.net正則表達式

什么是RE?想必各位大大在做文件查找的時侯都有使用過萬用字符”*”&#xff0c;比如說想查找在Windows目錄下所有的Word文件時&#xff0c;你可能就會用”*.doc”這樣的方式來做查找&#xff0c;因為”*”所代表的是任意的字符。RE所做的就是類似這樣的功能&#xff0c;但其功…

數據結構與算法學習筆記之 從0編號的數組

數據結構與算法學習筆記之 從0編號的數組前言數組看似簡單&#xff0c;但掌握精髓的卻沒有多少&#xff1b;他既是編程語言中的數據類型&#xff0c;又是最基礎的數據結構&#xff1b;一個小問題&#xff1a;為什么數據要從0開始編號&#xff0c;而不是 從1開始呢&#xff1f;正…

JAVA四種基本排序總結

JAVA四種基本排序,包括冒泡法,插入法,選擇法,SHELL排序法.其中選擇法是冒泡法的改進,SHELL排序法是 插入法的改進.所以從根本上來說可以歸納為兩種不同的排序方法:即:插入法&#xff06;冒泡法一 插入法:遍歷排序集合&#xff0c;每到一個元素時&#xff0c;都要將這個元素與所…

Windows 故障轉移+Hyper-V 虛機自動遷移高 可用

Windows 故障轉移Hyper-V 虛機自動遷移高 可用 Windows 故障轉移Hyper-V 虛機自動遷移高... 1一、系統原理... 31.1 高效率的 VMbus 架構... 31.2 完美支持 Linux 系統... 4二、架構拓樸... 52.1 網絡及系統架構拓樸... 52.2 域結構拓樸... 5三、實驗資源列表... 63.1 網絡設備…

MSSqlServer基礎學習01

1.新建登陸用戶名&#xff0c;須賦予數據庫訪問權限方可訪問已有的數據庫&#xff0c;可以參考如下圖片轉載于:https://www.cnblogs.com/MyVision/p/11242417.html

js,java時間處理

1.JS獲取時間格式為“yyyy-MM-dd HH:mm:ss”的字符串 function getTimeStr(){var myDate new Date();var year myDate.getFullYear(); //獲取完整的年份(4位,1970-????)var month myDate.getMonth(); //獲取當前月份(0-11,0代表1月)month month > 9 ? month : &quo…