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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

log4j中配置日志文件相对路径方法

發布時間:2024/9/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 log4j中配置日志文件相对路径方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提醒:本文并不是本人的原創,轉載自 http://www.zxbc.cn/html/20080402/33022_4.html?,將原文中的代碼和讀取來別扭的語句略作修改以使讀者更容易理解作者的意思,在此感謝本文的原作者。

解決的辦法自然是用相對路徑代替絕對路徑,有如下三種方法:

方法一、?讓 log4j 從 System 中讀取對應的 property 屬性值
其實 log4j 的 FileAppender 本身就有這樣的機制,如:log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其中 "${WORKDIR}" 表示引用了一個變量 WORKDIR,這個表達式會被 System?Property 中的 "WORKDIR" 的值代替。這樣,我們就可以在 log4j 加載配置文件之前,先用 System.setProperty?("WORKDIR",?WORKDIR);設置好根路徑,此操作可通過一初始的servlet進行。

方法二、可以使用服務器環境變量
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=10KB
其中的 ${catalina.home} 并非 windows 系統的環境變量,這個環境變量就不需要在 Windows 系統的環境變量中設置。之所以這樣,你可以看看tomcat\\bin\\catalina.bat(startup, shutdown都是調用這個)里面自帶有 -Dcatalina.home="%CATALINA_HOME%"。繼承這個思想,所以你也可以自己設定一個參數 -Dmylog.home="D:/abc/log" 到對應的服務器 java 啟動的 vm 參數中

方法三、通過 servlet 初始化 init() 方法中加載 file 屬性實現相對路徑
具體實現:編寫一個 servlet, 在系統加載的時候, 就把 properties 的文件讀到一個 properties 文件中。那個 file 的屬性值(我使用的是相對目錄)改掉(前面加上系統的根目錄),然后把這個 properties 對象設置到 propertyConfig 中去,這樣就初始化了 log 的設置。在后面的使用中就用不著再配置了。
一般在我們開發項目過程中,log4j 日志輸出路徑固定到某個文件夾,這樣如果我換一個環境,日志路徑又需要重新修改,比較不方便,目前我采用了動態改變日志路徑的方法來實現相對路徑保存日志文件
(1)? 在項目啟動時,裝入初始化類:

Log4jInit 類源代碼
?1public?class?Log4jInit?extends?HttpServlet?{
?2
?3?????????static?Logger?logger?=?Logger.getLogger(Log4jInit.class);
?4
?5?????????public?Log4jInit()?{?
?6?????????}
?
?7
?8?????????public?void?init(ServletConfig?config)?throws?ServletException?{?
?9?????????????String?prefix?=?config.getServletContext().getRealPath("/");?
10?????????????String?file?=?config.getInitParameter("log4j");?
11?????????????String?filePath?=?prefix?+?file;
12?????????????Properties?props?=?new?Properties();
13?????????????try?{?
14?????????????????FileInputStream?istream?=?new?FileInputStream(filePath);
15?????????????????props.load(istream);?
16?????????????????istream.close();?
17?????????????????//toPrint(props.getProperty("log4j.appender.file.File"));
18?????????????????String?logFile?=?prefix?+?props.getProperty("log4j.appender.file.File");//設置路徑
19????????????????????props.setProperty("log4j.appender.file.File",logFile);
20?????????????????PropertyConfigurator.configure(props);//裝入log4j配置信息?
21?????????????}
?catch?(IOException?e)?{?
22?????????????????toPrint("Could?not?read?configuration?file?["?+?filePath?+?"].");?
23?????????????????toPrint("Ignoring?configuration?file?["?+?filePath?+?"].");?
24?????????????????return;?
25?????????????}
?
26?????????}
?
27
28?????????public?static?void?toPrint(String?content)?{?
29?????????????System.out.println(content);?
30?????????}
?
31}


實際上 log4j 的配置文件如果為默認名稱: log4j.properties,則可放置在 JVM 能讀到的 classpath 里的任意地方,一般是放在 WEB-INF/classes 目錄下。當log4j 的配置文件不再是默認名稱,則需要另外加載并給出參數,如上 "PropertyConfigurator.configure(props);//裝入log4j配置信息"。

(2) ?web.xml 中的配置

web.xml 中相關配置
1???????<servlet>?
2?????????<servlet-name>log4j-init</servlet-name>?
3?????????<servlet-class>Log4jInit</servlet-class>
4?????????<init-param>?
5???????????<param-name>log4j</param-name>?
6???????????<param-value>WEB-INF/classes/log4j.properties</param-value>?
7?????????</init-param>?
8?????????<load-on-startup>1</load-on-startup>?
9???????</servlet>


注意:上面的 load-on-startup 設為 0 ,以便在 Web 容器啟動時即裝入該 Servlet 。log4j.properties 文件放在根的properties子目錄中,也可以把它放在其它目錄中。應該把 .properties 文件集中存放,這樣方便管理。

(3)? log4j.properties 中即可配置 log4j.appender.file.File 為當前應用的相對路徑

以上是網上 log4j 日志文件相對路徑配置的三種方法(我能找到的就三種),分析:

方法一主要是擴展了 log4j 的 RollingFileAppender 類,其他的 FileAppender 同樣道理。擴展的方法,就是用一個子類去覆蓋 setFile 方法,這個方法在 log4j讀取配置文件生成 appender 的時候調用,傳入的就是配置文件中的路徑,這樣我就可以按照自己的想法在路徑前面加上根路徑了。這種方法可以 log4j.properties中用相對路徑自由配置 log4j.appender.A1.File 屬性來決定生成的日志文件相對 web 應用根目錄的位置。

方法二是利用服務器 vm 中已經存在的環境變量如 ${catalina.home} 來設置相對于 ${catalina.home} 的日志路徑,日志只能放到服務器子目錄里,而且如果用的是其它服務器,則要改對應的環境變量。此方法平臺移植不方便。

方法三是擴展 ActionServlet 類,覆蓋其 init() 方法,新方法中載入 log4j.properties 位置的參數,可以自由配置 log4j 的配置文件的名字和存放位置。也可自由配置 log4j 日志文件的相對于當前應用的路徑。詳細代碼如下:

Code
package?wbb.bysxxglxt.util;?

import?org.apache.struts.action.
*;?
import?org.apache.commons.logging.LogFactory;?
import?org.apache.commons.logging.Log;?
import?javax.servlet.ServletException;?
import?java.util.Properties;?
import?java.io.InputStream;?
import?org.apache.log4j.PropertyConfigurator;?
import?java.io.FileInputStream;?
import?java.io.IOException;?

public?class?ExtendedActionServlet?extends?ActionServlet?{

?????????
private?Log?log?=?LogFactory.getLog(this.getClass().getName());

?????????
public?ExtendedActionServlet()?{}?

?????????
public?void?init()?throws?ServletException?{
?????????????log.info(
"Initializing,?My?MyActionServlet?init?this?System’s?Const?Variable");?
?????????????String?prefix?
=?this.getServletConfig().getServletContext().getRealPath("/");
?????????????String?file?
=?this.getServletConfig().getInitParameter("log4j");?
?????????????String?filePath?
=?prefix?+?file;?
?????????????Properties?props?
=?new?Properties();?
?????????????System.
out.println(prefix);?
?????????????System.
out.println(file);?
?????????????System.
out.println(filePath);?

?????????????
try?{?
?????????????????FileInputStream?log4jStream?
=?new?FileInputStream(filePath);?
?????????????????props.load(log4jStream);
?????????????????log4jStream.close();?
?????????????????String?logFile?
=?prefix?+?
?????????????????????????????????props.getProperty(
"log4j.appender.A1.File");?//設置路徑]
?????????????????System.out.println(logFile);?
?????????????????props.setProperty(
"log4j.appender.A1.File",?logFile);
?????????????????PropertyConfigurator.configure(props);?
//裝入log4j配置信息?
?????????????}?catch?(IOException?e)?{?
?????????????????e.printStackTrace();?
????????????}?
?????????????log.info(
"Initializing,?end?My?Init");
?????????????super.init();?
//應用了struts,此方法不能省,ActionServlet覆蓋了的此方法中有很多重要操作?
?????????}?
}


web.xml 相關配置:

web.xml 中相關配置
?1???????<servlet>?
?2?????????<servlet-name>action</servlet-name>?
?3?????????<servlet-class>wbb.bysxxglxt.util.ExtendedActionServlet</servlet-class>?
?4?????????<init-param>?
?5???????????<param-name>config</param-name>?
?6???????????<param-value>/WEB-INF/struts-config.xml</param-value>?
?7?????????</init-param>?
?8?????????<init-param>?
?9?????????????<param-name>log4j</param-name>?
10?????????????<param-value>properties\\log4j.properties</param-value>?????????????????????
11???????????</init-param>?
12?????????<init-param>?
13???????????<param-name>debug</param-name>?
14???????????<param-value>0</param-value>?
15?????????</init-param>?[Page]
16?????????<init-param>?
17???????????<param-name>application</param-name>?
18???????????<param-value>ApplicationResources</param-value>?
19?????????</init-param>?
20?????????<load-on-startup>0</load-on-startup>?
21???????</servlet>?
22???????<servlet-mapping>?
23?????????<servlet-name>action</servlet-name>?
24?????????<url-pattern>*.do</url-pattern>?
25???????</servlet-mapping>


注意 log4j 參數中相對路徑的斜杠線的寫法,而且 log4j 的配置文件如果放置在 WEB-INF/classes 目錄或 WEB-INF 等目錄中最好改名,因為在加載此 Servlet之前,服務器如tomcat 啟動時會自動搜索 WEB-INF 目錄和 WEB-INF/classes 目錄中的 log4j.properties 文件,如有則自動加載。log4j 屬性文件(即配置文件)加載后,由于該屬性文件中 log4j.appender.A1.File 的值用的是相對路徑,自動加載配置便會出錯:
log4j:ERROR?setFile(null,true)?call?failed.
java.io.FileNotFoundException:?WEB-INF\\logs\\bysxxglxt.log?(系統找不到指定的路徑。)
不知道 log4j 為什么會這么早自動啟動。盡管后面加載的?ExtendedActionServlet 中正確設置了 log4j 屬性文件并正常加載了,但報的這個錯還是怪不爽的,于是只有更改 log4j 屬性文件名字或者更改其存放位置,讓其不能自動加載了,不過還是有兩個警告:
log4j:WARN?No?appenders?could?be?found?for?logger?(org.apache.commons.digester.Digester.sax).?
log4j:WARN?Please?initialize?the?log4j?system?properly.
這樣做就算是掩耳盜鈴了,如果你有更好的解決辦法,希望能在此貼出來,大家一起研究。

log4j.properties 文件的內容:

Code
###?設置logger級別?###
log4j.rootLogger
=DEBUG,stdout,A1?

###?appender.stdout輸出到控制臺?###
log4j.appender.stdout
=org.apache.log4j.ConsoleAppender?
log4j.appender.stdout.Target
=System.out?
log4j.appender.stdout.layout
=org.apache.log4j.PatternLayout?
log4j.appender.stdout.layout.ConversionPattern
=?[%5p]?[BYSXXGLXT]?%d{yyyy-MM-dd?HH:mm:ss}:?%-4r?[%-5p]?[%t]?(?%F,%L?)?-?%m%n?

###?appender.A1輸出到日志文件?###?
log4j.appender.A1
=org.apache.log4j.DailyRollingFileAppender?[Page]
log4j.appender.A1.File
=WEB-INF\\\\logs\\\\bysxxglxt.log?
##注意上面日志文件相對應用根目錄路徑的寫法?
log4j.appender.A1.DatePattern
=’.’yyyy-MM-dd’.log’?
log4j.appender.A1.Append
=true?
##?輸出DEBUG級別以上的日志?
log4j.appender.A1.Threshold
=DEBUG?
log4j.appender.A1.layout
=org.apache.log4j.PatternLayout?
log4j.appender.A1.layout.ConversionPattern
=?[%5p]?[BYSXXGLXT]?%d{yyyy-MM-dd?HH:mm:ss}:?%-4r?????[%t]?(?%F,%L?)?-?%m%n

?

轉載于:https://www.cnblogs.com/huangtugaopo/archive/2009/07/13/1522577.html

總結

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

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

主站蜘蛛池模板: 国产高清无密码一区二区三区 | 成年人网站av | 日韩中文字幕在线观看 | 日韩91av | 国产色网址 | 免费不卡av在线 | 国产日韩一区二区三区 | 亚洲一区二区三区四区不卡 | 一级黄色a视频 | 国产精品午夜福利视频234区 | 日日夜夜精品 | 丝袜脚交国产在线观看 | 亚洲午夜网 | 天天久久 | 国产综合在线观看视频 | 免费色网址| 在线观看成人网 | 波多野结衣1区 | 美女三级视频 | 欧美性猛交xxxx偷拍洗澡 | 中文字幕.com | 在线高清免费观看 | 色婷婷久久一区二区三区麻豆 | 亚洲美女自拍偷拍 | 亚洲人成无码www久久久 | 免费观看色 | 美女网站免费观看视频 | 9久9久9久女女女九九九一九 | 床戏高潮呻吟声片段 | 色呦呦在线视频 | 成人av免费看 | 黄色片免费视频 | 少妇影院在线观看 | 伊人网视频在线 | 欧美色亚洲色 | 瑟瑟视频在线看 | 蜜色av| 视频网站在线观看18 | 国产123| 中文字幕第5页 | 九九天堂 | 在线观看欧美亚洲 | 四虎一国产精品一区二区影院 | 少妇一级免费 | 免费网站www在线观看 | 男女www | 国产精品主播视频 | 欧美黄在线观看 | 色牛影院 | 美女久久久久久久 | 国产性生活视频 | 黑人巨大精品欧美一区二区蜜桃 | 男女视频在线免费观看 | 国产拍拍视频 | 关之琳三级做爰 | 亚洲在线免费观看 | 嫩草视频一区二区三区 | 爱爱视频免费看 | 免费观看a毛片 | 青青操原| 免费国产91 | 中文字幕有码在线视频 | 日中文字幕 | 天天澡天天狠天天天做 | 日本一区二区高清不卡 | 男人午夜影院 | 亚洲欧美在线观看视频 | 无码国模国产在线观看 | 麻豆精品自拍 | 久久澡| 成人免费看片 | 中文字幕观看 | 欧美最猛黑人xxxx黑人猛交 | 日韩视频免费观看高清完整版 | 国产精品视频久久久久久久 | 国产伦精品一区二区三区免费迷 | 日韩视频在线一区 | 91国偷自产一区二区三区观看 | 久久久青 | 一区二区欧美精品 | 亚洲一区二区三区在线观看视频 | 欧美日韩亚洲二区 | 波多野结av衣东京热无码专区 | 欧美久久久精品 | 在线成人日韩 | 久久狠狠高潮亚洲精品 | 日韩精品资源 | 综合图区亚洲 | 欧美 亚洲 另类 激情 另类 | 69堂免费视频 | 91丨porny丨海角社区 | 97人妻精品一区二区三区 | 日韩社区 | 麻豆国产在线视频 | 亚洲国产日韩在线一区 | 日韩黄页网站 | 污视频大全| 日本a在线观看 | 久久综合伊人77777麻豆 |