java log輸出到文件路徑_Java - 配置log4j的日志文件路徑 (附-獲取當前類路徑的多種方法)...

1 日志路徑帶來的痛點

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

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

2 log4j.properties文件的配置

# 設置要輸出的日志的級別 - 注意: properties文件中的注釋信息只能處于行首, 不要跟在行尾

log4j.rootLogger=INFO,stdout,logfile

### 輸出到控制臺, Java程序運行時的標準輸出信息

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的方式啟動;

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

(1) 啟動腳本設置:

假設當前項目的目錄結構為:

/Projects/KafkaConsumer

丨 bin 項目的啟動腳本

丨 conf 項目的配置文件

丨 lib 項目的其他依賴包

丨 bogs 項目的日志輸出路徑

啟動腳本位于bin目錄下, 內容示例如下:

# 獲取當前腳本所處的目錄, 然后進入其上級目錄, 最后pwd輸出該目錄, 最終的結果是/Project/KafkaConsumer

base_dir=$(cd `dirname $0`; cd ..; pwd)

# 獲取Java運行程序的位置, 并指定主類

java_bin=$(which java)

main_class="org.shoufeng.elastic.ConsumerMain"

# 通過-cp、擴展CLASSPATH、指定主類的方式啟動項目,

# 并通過“-D”的方式向此程序的運行時環境中設置當前項目的路徑,

# 即可在程序中通過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本身支持動態設置文件路徑, 如:

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

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

public static void main(String[] args) {

// 獲取系統運行時變量中的日志文件的輸出路徑

// 此變量需要在啟動命令中通過-D的方式設置

String baseDir = System.getProperty("base.dir");

if (baseDir == null) {

// 開發環境中使用

baseDir = System.getProperty("user.dir");

System.setProperty("base.dir", baseDir);

}

log.info("==== 系統運行路徑: " + System.getProperty("base.dir") + " ====");

// 其他處理邏輯......

}

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

3.2 Web項目

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

# log4j的配置文件支持服務器的vm環境變量, 格式類似${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參數設置的:

-Dcatalina.home="$CATALINA_HOME"

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

4 附錄 - 獲取當前項目、類路徑的幾種方式

public static void main(String[] args) {

// 獲取 class 文件的絕對路徑, 定位到具體的包名, 結果如:

// /Projects/KafkaConsumer/target/classes/org/shoufeng/consumer/

System.out.println(KafkaConsumer.class.getResource(""));

// 獲取 class 文件的絕對路徑, 如: /Projects/KafkaConsumer/target/classes/,

// 如果在bin目錄下通過java -jar等命令啟動時, 結果就是 /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種用法的返回結果類型都是URL, 其toString()返回的內容以"file:"開頭, 可通過“.toString().substring(5)”去除

// 推薦: 使用“.getPath()”就可以直接獲取到路徑

// 獲取工程的絕對路徑, 如: /Projects/KafkaConsumer,

// 若在bin中通過java -jar等命令啟動, 路徑就變成了: /Projects/KafkaConsumer/bin

System.out.println(System.getProperty("user.dir"));

}

版權聲明

感謝閱讀, 如果文章有幫助或啟發到你, 點個[好文要頂👆] 或 [推薦👍] 吧😜

本文版權歸博主所有, 歡迎轉載, 但 [必須在文章頁面明顯位置標明原文鏈接], 否則博主保留追究相關人員法律責任的權利.

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

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

相關文章

常用數據結構

字典:即map,映射,通過key>value的方式直接查找與之對應的值,實現一般是hash表或二叉樹跳躍表:本質是鏈表,只不過將數據進行提取分層,將總數據置為底層,提取2、4、的倍數為第一二層…

java jasypt_Jasypt

軟件簡介Jasypt這個Java類包為開發人員提供一種簡單的方式來為項目增加加密功能,包括:密碼Digest認證,文本和對象加密,集成hibernate,SpringSecurity(Acegi)來增強密碼管理。Jasypt開發團隊推出了Java加密工具Jasypt 1…

ZABBIX監控JAVA日志文件

最近開發人員有一個需求,監控java程序的報錯日志,如日志中包含“ERROR”關鍵字的信息,就郵件告警,以下是具體實現方法。 一、創建模板以上是已經創建好的模板,名為“Template App Java logs”創建應用集二、創建監控項…

如何快速把音樂轉成MP3格式

身邊有這樣一群朋友經常搞音樂,仿佛生活的樂趣只有音樂,不能也能理解,誰沒有點自己的愛好呢?但是如果想要在茫茫人海中成為佼佼者,并不是這么容易的,但是我們要在速度上贏更多的人,所以寫了這篇…

new URI(zk_servers_1) 路徑包含下劃線無法獲取host的問題

spring cloud gateway使用zookeeper作為注冊中心調用其它服務的時候報了下面這個錯誤: ava.lang.NullPointerException: nullat io.netty.util.NetUtil.isValidIpV4Address(NetUtil.java:648) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]at io.netty.util.NetUt…

java ee 值范圍_JAVAEE之內置對象和屬性范圍

內置對象和屬性范圍四種屬性范圍九個內置對象1.內置對象如果說想要使用一個對象,必須new 出來,但是在我們的jsp操作中,發現我們使用過的out,request對象沒有進行實例化,類似于這樣的對象,我們叫做jsp的內置對象&#x…

JavaWeb學習筆記(九)--HttpServletResponse

web服務器接收到客戶端的HTTP請求,會針對每一次請求,分別創建一個用于代表請求的request對象和代表響應的response對象。 request和response對象既然代表請求和響應,那我們要獲取客戶端提交過來的數據,只需要找request對象即可。要…

java html5 上傳_HTML5結合ajax實現文件上傳以及進度顯示

基于原生html5實現,不需要falsh支持,進度可以自定義顯示,控制靈活, 本來打算使用jquery插件進行異步文件上傳,比如uploadfy但是需要額外的支持,也有人用iframe模仿異步上傳機制,感覺都比較別扭。…

7天玩轉機器學習

7天玩轉機器學習 人工智能時代,數據迎來大爆發,數據對于提升業務價值的重要性與日俱增。但面對海量數據,傳統分析方法已經顯得無能為力,而機器學習的成熟為企業帶來了強大的分析引擎,可在眾多領域幫助企業挖掘數據價值…

centos 6.5 yum java_Centos6.5 yum 安裝jdk1.8

centos 6.5 安裝卸載jdk-- 查看有沒有預裝jdk版本java -version-- 查看已安裝的版本rpm -qa|grep java-- 卸載預裝版本 rpm -e --nodeps 命令卸載rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64-- 查找可以安裝的jdk列表yum search java | grep -i --color J…

java 中使用mongodb_mongodb在java中的使用

agg Aggregation.newAggregation(Aggregation.match(new Criteria().andOperator(Criteria.where("timeStamp").lte(TypeChange.dateToLong(times[1])).gte(TypeChange.dateToLong(times[0])),new Criteria().orOperator(ruleCr))),//篩選符合條件的記錄Aggregation…

一次面試總結(記錄)

1,從一個數組里找重復出現次數最多的一個數?2,常用的linux命令3.垃圾收集器有哪些 ?垃圾收集算法?4,線上服務器變慢了你是如何定位問題并處理的?5,你自己實現一個本地緩存,淘汰最久未使用,你怎么設計6,用棧實現計算器7,剔除二叉樹…

java 累加 0-9 a-z_JAVA獲得包含0-9、a-z、A-Z范圍內字符串的的隨機數實例

一、獲得0-9,a-z,a-z范圍的隨機字符串/*** java獲得0-9,a-z,a-z范圍的隨機數* param length 隨機數長度* return string*/public static string getrandomchar(int length) {char[] chr {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r,…

【PHP 擴展開發】Zephir 基礎篇

上一篇 《Zephir 簡介》 簡單介紹了環境搭建,編寫了一個的簡單示例。這一篇繼續介紹 Zephir 基礎。 基本語法Zephir 中,每個文件都必須有且只有一個類,每個類都必須有一個命名空間,目錄結構必須與所使用的類和命名空間的名稱相匹配…

java常見排序算法有哪些_Java中常用的6種排序算法詳細分解

排序算法很多地方都會用到,近期又重新看了一遍算法,并自己簡單地實現了一遍,特此記錄下來,為以后復習留點材料。廢話不多說,下面逐一看看經典的排序算法:1. 選擇排序選擇排序的基本思想是遍歷數組的過程中&…

python range函數

這個函數很簡單,就不寫例子了,看看語法,拿來即用 python range() 函數可創建一個整數列表,一般用在 for 循環中。 函數語法 range(start, stop[, step]) 參數說明: start: 計數從 start 開始。默認是從 0 開始。例如ra…

java tomcat重啟linux_Linux下tomcat重啟

進入Tomcat下的bin目錄cd/user/local/tomcat/bin關閉tomcat./shutdown.sh查看tomcat是否關閉ps -ef|grep java顯示以下信息,則Tomcat還未關閉root 7010 1 0 Apr19 ? 00:30:13 /usr/local/java/bin/java -Djava.util.logging.config.file/usr/loca…

左偏樹 P3377【模板】左偏樹(可并堆)

題目傳送門 代碼&#xff1a; /* code by: zstu wxk time: 2019/03/01 */ #include<bits/stdc.h> using namespace std; #define Fopen freopen("testdata.in","r",stdin); freopen("_out.txt","w",stdout); #define LL long lo…

lock 線程 java_JAVA多線程-基礎Lock Condition 并發集合

跟上一篇文章比較,這次改進了之前的代碼,使用了Lock Condition 和并發集合.代碼量減了一些,并且更加容易讀了.這篇代碼是上一篇的改進版,邏輯在前篇有說明,以防大家看不到,我再重現貼一遍.后續會使用高階的線程工具再次改進,以求代碼更簡單.代碼的邏輯:1)SProducer不停的產生nu…

mycat mysql ha 方案_7、基于 HA 機制的 Mycat 高可用--mycat

在實際項目中&#xff0c;Mycat 服務也需要考慮高可用性&#xff0c;如果 Mycat 所在服務器出現宕機&#xff0c;或 Mycat 服務故障&#xff0c;需要有備機提供服務&#xff0c;需要考慮 Mycat 集群。1、 高可用方案使用 HAProxy Keepalived 配合兩臺 Mycat 搭起 Mycat 集群&a…