电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:42日期:2022-08-22 14:52:46
1 日志路徑帶來的痛點

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

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

2 log4j.properties文件的配置

# 設置要輸出的日志的級別 - 注意: properties文件中的注釋信息只能處于行首, 不要跟在行尾log4j.rootLogger=INFO,stdout,logfile### 輸出到控制臺, Java程序運行時的標準輸出信息log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout# 2019-05-25 19:09:46log4j.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.loglog4j.appender.logfile.Append=true# 輸出INFO及以上的日志, 按日期滾動就無須配置單個日志文件的最大體積了log4j.appender.logfile.Threshold=INFO# log4j.appender.logfile.MaxFileSize=100MBlog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%p] - %m%n3 徹底解決痛點

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

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

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

(1) 啟動腳本設置:

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

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

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

# 獲取當前腳本所處的目錄, 然后進入其上級目錄, 最后pwd輸出該目錄, 最終的結果是/Project/KafkaConsumerbase_dir=$(cd `dirname $0`; cd ..; pwd)# 獲取Java運行程序的位置, 并指定主類java_bin=$(which java)main_class='org.shoufeng.elastic.ConsumerMain'# 通過-cp、擴展CLASSPATH、指定主類的方式啟動項目, # 并通過“-D”的方式向此程序的運行時環(huán)境中設置當前項目的路徑,# 即可在程序中通過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)設置文件路徑, 如:

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

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

public static void main(String[] args) { // 獲取系統(tǒng)運行時變量中的日志文件的輸出路徑 // 此變量需要在啟動命令中通過-D的方式設置 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)運行路徑: ' + System.getProperty('base.dir') + ' ===='); // 其他處理邏輯......}

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

3.2 Web項目

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

# log4j的配置文件支持服務器的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ù)設置的:

-Dcatalina.home='$CATALINA_HOME'

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

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'));}

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

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

log4j.properties配置如下

log4j.rootLogger = info,out1,out2log4j.appender.out1=org.apache.log4j.FileAppenderlog4j.appender.out1.File=test.loglog4j.appender.out1.layout=org.apache.log4j.PatternLayoutlog4j.appender.out1.layout.ConversionPattern=%d %-5p - %m at %l%nlog4j.appender.out2=org.apache.log4j.ConsoleAppenderlog4j.appender.out2.layout=org.apache.log4j.PatternLayoutlog4j.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.16bin,當不確定時,我們可以用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。

補充:

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

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

以上這篇Java 配置log4j日志文件路徑 (附-獲取當前類路徑的多種操作)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關文章:
主站蜘蛛池模板: 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 27PR跨境电商导航 | 专注外贸跨境电商 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 模具硅橡胶,人体硅胶,移印硅胶浆厂家-宏图硅胶科技 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 范秘书_懂你的范文小秘书| 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 光照全温振荡器(智能型)-恒隆仪器| PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 找培训机构_找学习课程_励普教育 | 复合肥,化肥厂,复合肥批发,化肥代理,复合肥品牌-红四方 | 贴片电感_贴片功率电感_贴片绕线电感_深圳市百斯特电子有限公司 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 日本东丽膜_反渗透膜_RO膜价格_超滤膜_纳滤膜-北京东丽阳光官网 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 东莞注册公司-代办营业执照-东莞公司注册代理记账-极刻财税 | 棉柔巾代加工_洗脸巾oem_一次性毛巾_浴巾生产厂家-杭州禾壹卫品科技有限公司 | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 |