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

Java 配置log4j日志文件路徑 (附-獲取當(dāng)前類路徑的多種操作)

 更新時間:2020年10月19日 10:51:20   作者:瘦風(fēng)的南墻  
這篇文章主要介紹了Java 配置log4j日志文件路徑 (附-獲取當(dāng)前類路徑的多種操作),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1 日志路徑帶來的痛點

Java 項目中少不了要和log4j等日志框架打交道, 開發(fā)環(huán)境和生產(chǎn)環(huán)境下日志文件的輸出路徑總是不一致, 設(shè)置為絕對路徑的方式缺少了靈活性, 每次變更項目路徑都要修改文件, 目前想到的最佳實現(xiàn)方式是: 根據(jù)項目位置自動加載并配置文件路徑.

本文借鑒 Tomcat 的配置方式 “${catalina.home}/logs/catalina.out”, 通過相對路徑的方式設(shè)置日志的輸出路徑, 有其他解決方案的小伙伴, 請直接評論區(qū)交流哦😯

2 log4j.properties文件的配置

# 設(shè)置要輸出的日志的級別 - 注意: properties文件中的注釋信息只能處于行首, 不要跟在行尾
log4j.rootLogger=INFO,stdout,logfile

### 輸出到控制臺, Java程序運(yùn)行時的標(biāo)準(zhǔn)輸出信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# 2019-05-25 19:09:46
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%p] - %m%n

### 輸出到日志文件
# 按天滾動生成, 不支持MaxFileSize, 而RollingFileAppender支持
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
# 項目的logs目錄下
# log4j.appender.logfile.File=${base.dir}/logs/elastic-server.log
log4j.appender.logfile.Append=true
# 輸出INFO及以上的日志, 按日期滾動就無須配置單個日志文件的最大體積了
log4j.appender.logfile.Threshold=INFO
# log4j.appender.logfile.MaxFileSize=100MB
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%p] - %m%n

3 徹底解決痛點

3.1 單獨的Java程序包 (非Java Web項目)

單獨的Java程序包, 需要通過命令java -jar或java -cp的方式啟動;

我們可以在啟動命令中加入系統(tǒng)運(yùn)行時變量, 在log4j加載配置文件之前通過System.getProperties("path")讀取此變量, 即可實現(xiàn)靈活加載當(dāng)前路徑.

(1) 啟動腳本設(shè)置:

假設(shè)當(dāng)前項目的目錄結(jié)構(gòu)為:

/Projects/KafkaConsumer
丨 bin 項目的啟動腳本
丨 conf 項目的配置文件
丨 lib 項目的其他依賴包
丨 bogs 項目的日志輸出路徑

啟動腳本位于bin目錄下, 內(nèi)容示例如下:

# 獲取當(dāng)前腳本所處的目錄, 然后進(jìn)入其上級目錄, 最后pwd輸出該目錄, 最終的結(jié)果是/Project/KafkaConsumer
base_dir=$(cd `dirname $0`; cd ..; pwd)
# 獲取Java運(yùn)行程序的位置, 并指定主類
java_bin=$(which java)
main_class="org.shoufeng.elastic.ConsumerMain"

# 通過-cp、擴(kuò)展CLASSPATH、指定主類的方式啟動項目, 
# 并通過“-D”的方式向此程序的運(yùn)行時環(huán)境中設(shè)置當(dāng)前項目的路徑,
# 即可在程序中通過System.getProperty("base.dir")獲取此路徑 

nohup ${java_bin} -Dbase.dir=${base_dir} -cp ${CLASSPATH}:${base_dir}/conf:${base_dir}/lib/* ${main_class} >> /dev/null &

(2) Java程序讀取變量:

實log4j的FileAppender本身支持動態(tài)設(shè)置文件路徑, 如:

log4j.appender.logfile.File=${base.log}/logs/app.log

其中“${base.log}”是一個變量, 會被System Property中的base.log的值代替, 代碼中的使用方式為:

public static void main(String[] args) {
 // 獲取系統(tǒng)運(yùn)行時變量中的日志文件的輸出路徑
 // 此變量需要在啟動命令中通過-D的方式設(shè)置
 String baseDir = System.getProperty("base.dir");
 if (baseDir == null) {
  // 開發(fā)環(huán)境中使用
  baseDir = System.getProperty("user.dir");
  System.setProperty("base.dir", baseDir);
 }
 log.info("==== 系統(tǒng)運(yùn)行路徑: " + System.getProperty("base.dir") + " ====");
 // 其他處理邏輯......
}

需要注意的是, 這種方式設(shè)置的環(huán)境變量只在當(dāng)前Java進(jìn)程(也就是當(dāng)前項目)中有效, 并不會影響到其他項目.

3.2 Web項目

如果是Web項目, 可通過修改Web容器的環(huán)境變量方式實現(xiàn). 以 Tomcat 為例:

# log4j的配置文件支持服務(wù)器的vm環(huán)境變量, 格式類似${catalina.home} 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log 
log4j.appender.R.MaxFileSize=100MB 

${catalina.home}是在${tomcat_home}/bin/catalina.sh中通過-D參數(shù)設(shè)置的:

-Dcatalina.home="$CATALINA_HOME"

基于這個思路, 我們也可以向Web容器的VM參數(shù)中設(shè)置一個參數(shù), 比如-Dmylog.home="/Project/logs", 創(chuàng)建日志對象時即可使用.

4 附錄 - 獲取當(dāng)前項目、類路徑的幾種方式

public static void main(String[] args) {
 // 獲取 class 文件的絕對路徑, 定位到具體的包名, 結(jié)果如: 
 // /Projects/KafkaConsumer/target/classes/org/shoufeng/consumer/
 System.out.println(KafkaConsumer.class.getResource(""));

 // 獲取 class 文件的絕對路徑, 如: /Projects/KafkaConsumer/target/classes/,
 // 如果在bin目錄下通過java -jar等命令啟動時, 結(jié)果就是 /Projects/KafkaConsumer/bin/
 System.out.println(ClassLoader.getSystemResource(""));
 System.out.println(KafkaConsumer.class.getResource("/"));
 System.out.println(KafkaConsumer.class.getClassLoader().getResource(""));
 System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
 // 說明: 上述4種用法的返回結(jié)果類型都是URL, 其toString()返回的內(nèi)容以"file:"開頭, 可通過“.toString().substring(5)”去除
 // 推薦: 使用“.getPath()”就可以直接獲取到路徑

 // 獲取工程的絕對路徑, 如: /Projects/KafkaConsumer,
 // 若在bin中通過java -jar等命令啟動, 路徑就變成了: /Projects/KafkaConsumer/bin
 System.out.println(System.getProperty("user.dir"));
}

補(bǔ)充知識:在web中使用log4j時,配置日志文件的存放位置

廢話不多說,直接上代碼。

log4j.properties配置如下

log4j.rootLogger = info,out1,out2
log4j.appender.out1=org.apache.log4j.FileAppender
log4j.appender.out1.File=test.log

log4j.appender.out1.layout=org.apache.log4j.PatternLayout
log4j.appender.out1.layout.ConversionPattern=%d %-5p - %m at %l%n

log4j.appender.out2=org.apache.log4j.ConsoleAppender
log4j.appender.out2.layout=org.apache.log4j.PatternLayout
log4j.appender.out2.layout.ConversionPattern=%d %-5p - %m at %l%n

問題一:這個test.log文件會存放在哪呢?

經(jīng)測試發(fā)現(xiàn),test.log這個相對路徑相對的是user.dir系統(tǒng)參數(shù)的值。

假如我的tomcat的安裝路徑為D:\apache-tomcat-6.0.16,則user.dir=D:\apache-tomcat-6.0.16\bin,當(dāng)不確定時,我們可以用System.getProperties()將所有的系統(tǒng)參數(shù)在jsp中打印出來。

問題二:

如果我們將test.log改為絕對路徑/test.log,這個test.log文件又會存放在哪呢?

經(jīng)測試發(fā)現(xiàn),/test.log這個絕對路徑的根路徑是user.dir系統(tǒng)參數(shù)的根路徑,即test.log會存放在D:\test.log。

補(bǔ)充:

我們在log4j.properties文件中還可以通過${系統(tǒng)參數(shù)}的方式來指明日志文件存放路徑。

log4j.appender.out1.File=${user.dir}/logs/test.log

以上這篇Java 配置log4j日志文件路徑 (附-獲取當(dāng)前類路徑的多種操作)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 簡單了解java標(biāo)識符的作用和命名規(guī)則

    簡單了解java標(biāo)識符的作用和命名規(guī)則

    這篇文章主要介紹了簡單了解java標(biāo)識符的作用和命名規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • startJVM錯誤Unable to load native library: libjvm.so解決方法

    startJVM錯誤Unable to load native library: libjvm.so解決方法

    這篇文章主要介紹了startJVM錯誤Unable to load native library: libjvm.so解決方法,需要的朋友可以參考下
    2014-07-07
  • Jenkins一鍵打包部署SpringBoot應(yīng)用

    Jenkins一鍵打包部署SpringBoot應(yīng)用

    本文主要介紹了Jenkins一鍵打包部署SpringBoot應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Java實現(xiàn)合并多個升序鏈表

    Java實現(xiàn)合并多個升序鏈表

    本文主要介紹了Java實現(xiàn)合并多個升序鏈表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • SpringBoot整合模板引擎過程代碼實例

    SpringBoot整合模板引擎過程代碼實例

    這篇文章主要介紹了SpringBoot整合模板引擎過程代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java類加載基本過程詳細(xì)介紹

    Java類加載基本過程詳細(xì)介紹

    這篇文章主要介紹了Java類加載基本過程詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • java文件上傳技術(shù)深入剖析

    java文件上傳技術(shù)深入剖析

    這篇文章主要為大家詳細(xì)介紹了java文件上傳技術(shù)深入剖析,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Spring Data JPA中 in 條件參數(shù)的傳遞方式

    Spring Data JPA中 in 條件參數(shù)的傳遞方式

    這篇文章主要介紹了Spring Data JPA中 in 條件參數(shù)的傳遞方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot2整合Redis實現(xiàn)讀寫操作

    SpringBoot2整合Redis實現(xiàn)讀寫操作

    Redis,對于大家來說應(yīng)該不陌生,是經(jīng)常使用的開發(fā)技術(shù)之一。本文將結(jié)合實例代碼,介紹SpringBoot2整合Redis實現(xiàn)讀寫操作,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Spring中BeanFactoryPostProcessors是如何執(zhí)行的

    Spring中BeanFactoryPostProcessors是如何執(zhí)行的

    BeanFactoryPostProcessor是Spring容器提供的一個擴(kuò)展機(jī)制,它允許開發(fā)者在Bean的實例化和初始化之前對BeanDefinition進(jìn)行修改和處理,這篇文章主要介紹了你知道Spring中BeanFactoryPostProcessors是如何執(zhí)行的嗎,需要的朋友可以參考下
    2023-11-11

最新評論