日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

log4j自定义配置文件路径

發布時間:2024/8/1 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 log4j自定义配置文件路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 約定優于配置

約定優于配置(convention over configuration),也稱作按約定編程,是一種軟件設計范式,旨在減少軟件開發人員需做決定的數量,獲得簡單的好處,而又不失靈活性。大量的配置文件,確實可以讓程序在一定程度上具有很大的靈活性,但是也要有度的限制,并不是越多越好;約定一些默認的配置,有助于減少配置文件的數量。當然,全部使用約定而不支持配置也是不可取的,必然有失靈活性;因此約定優于配置不代表不是用配置,而是一種要同時提供約定和配置兩種方式。

rootAppender約定:
使用log4j打印日志,需要配置日志實例得輸出樣式以及目的地等等信息,不是必須配置的。
log4j約定了一種無須配置的日志實例的輸出方式,提供了一個基本的控制臺appender,所有創建的日志實例打印的日志都會按照這個appender輸出。
只需要在創建日志實例之前調用默認初始化即可:

static {BasicConfigurator.configure();logger = LogManager.getLogger(Log4jOneTest.class); }

控制臺輸出格式如下,不輸出trace級別日志:

配置文件路徑的約定:
log4j約定了配置文件在類路徑種的位置,無需在程序中指定配置文件路徑,log4j會在其指定的默認類路徑下尋找配置,也就是在classpath得根路徑:

二 配置文件如何加載

有時約定在classpaht根路徑下的配置文件多了,會導致配置文件沒有層次結構,很難發現配置文件的功能;因此此時需要自定義log4j配置文件的路徑。
尋找配置文件:
通常,log4j在創建日志實例時都是通過調用LogManager的getLogger(String/Class)方法,分析LogManager的源碼,LogManager在初始化時做了以下操作:

static {// By default we use a DefaultRepositorySelector which always returns 'h'.Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));repositorySelector = new DefaultRepositorySelector(h);/** Search for the properties file log4j.properties in the CLASSPATH. */// 獲取名為log4j.defaultInitOverride的vm變量,該變量決定日志的初始化是否被重載String override = OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY,null);// if there is no default init override, then get the resource// specified by the user or the default config file.if (override == null || "false".equalsIgnoreCase(override)) {// DEFAULT_CONFIGURATION_KEY的值為log4j.configuration,獲取名為log4j.configuration的vm變量String configurationOptionStr = OptionConverter.getSystemProperty(DEFAULT_CONFIGURATION_KEY,null);String configuratorClassName = OptionConverter.getSystemProperty(CONFIGURATOR_CLASS_KEY,null);URL url = null;// if the user has not specified the log4j.configuration// property, we search first for the file "log4j.xml" and then// "log4j.properties"// 如果在vm系統變量中沒有找到log4j.configuration,則先在classpath根目錄找log4j.xml,// 再尋找log4j.properties文件if (configurationOptionStr == null) {url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);if (url == null) {url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);}} else {// 若配置了vm系統變量log4j.configuration,則使用該變量的值作為配置文件的類路徑try {url = new URL(configurationOptionStr);} catch (MalformedURLException ex) {// so, resource is not a URL:// attempt to get the resource from the class pathurl = Loader.getResource(configurationOptionStr);}}// If we have a non-null url, then delegate the rest of the// configuration to the OptionConverter.selectAndConfigure// method.if (url != null) {LogLog.debug("Using URL [" + url + "] for automatic log4j configuration.");try {OptionConverter.selectAndConfigure(url, configuratorClassName,LogManager.getLoggerRepository());} catch (NoClassDefFoundError e) {LogLog.warn("Error during default initialization", e);}} else { // 沒有找到配置文件則報錯LogLog.debug("Could not find resource: [" + configurationOptionStr + "].");}} else {LogLog.debug("Default initialization of overridden by " +DEFAULT_INIT_OVERRIDE_KEY + "property.");}}

因此,LogManager在初始化時:

1.查找log4j.defaultInitOverrideVM系統變量,確認初始化是否重載;
2.沒要被重載的情況下,查找log4j.configurationVM系統變量,確認是否自定義配置文件路徑;
3.沒要配置log4j.configurationVM系統變量,順序查找根類路徑下的log4j.xml,log4j.properties

使用配置文件:
分析LogManager,在查找到配置文件后,調用了:

OptionConverter.selectAndConfigure(url, configuratorClassName, LogManager.getLoggerRepository());

來處理配置,其中url就是配置文件。

staticpublic void selectAndConfigure(URL url, String clazz, LoggerRepository hierarchy) {Configurator configurator = null;String filename = url.getFile();// 根據配置文件名后綴選擇使用DOMConfigurator還是PropertyConfigurator來處理if (clazz == null && filename != null && filename.endsWith(".xml")) {clazz = "org.apache.log4j.xml.DOMConfigurator";}if (clazz != null) {LogLog.debug("Preferred configurator class: " + clazz);configurator = (Configurator) instantiateByClassName(clazz,Configurator.class,null);if (configurator == null) {LogLog.error("Could not instantiate configurator [" + clazz + "].");return;}} else {configurator = new PropertyConfigurator();}// 處理配置configurator.doConfigure(url, hierarchy);}

最后看看DOMConfigurator處理配置文件的doConfigure方法:

publicvoid doConfigure(final URL url, LoggerRepository repository) {ParseAction action = new ParseAction() {public Document parse(final DocumentBuilder parser) throws SAXException, IOException {URLConnection uConn = url.openConnection();uConn.setUseCaches(false);InputStream stream = uConn.getInputStream();try {InputSource src = new InputSource(stream);src.setSystemId(url.toString());return parser.parse(src);} finally {stream.close();}}public String toString() {return "url [" + url.toString() + "]";}};doConfigure(action, repository);}

可以看到讀取了配置文件內容。PropertyConfigurator也是一樣的

三 自定義配置文件路徑

了解了log4j如何加載配置文件之后,就可以自定義配置文件路徑了;

設值vm系統變量:
簡單的,在獲取logManager初始化值前,通過設置vm系統變量log4j.configuration的值為配置文件路徑,可以達到目的:

static {String customizedPath = "log/log4j.xml";System.setProperty("log4j.configuration", customizedPath);logger = LogManager.getLogger(Log4jOneTest.class); }

PropertyConfigurator或DOMConfigurator:
DOMConfigurator中有一個doConfigure()的static版本,對應xml配置方式,PropertyConfigurator也一樣,對應properties配置方式,通過調用這個方法也能指定配置文件位置:

static public void configure(URL url) throws FactoryConfigurationError {new DOMConfigurator().doConfigure(url, LogManager.getLoggerRepository()); }

具體如下:

static {String customizedPath = "log/log4j.xml";DOMConfigurator.configure(getResource(customizedPath));logger = LogManager.getLogger(Log4jOneTest.class); }

參考: 《 關于Log4j的初始化》

總結

以上是生活随笔為你收集整理的log4j自定义配置文件路径的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。