從網(wǎng)上簡(jiǎn)單搜索了一下,發(fā)現(xiàn)有三種介紹的方法??偨Y(jié)在這里
法一、 解決的辦法自然是想辦法用相對(duì)路徑代替絕對(duì)路徑,其實(shí)log4j的FileAppender本身就有這樣的機(jī)制,如:log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其中“${WORKDIR}/”是個(gè)變量,會(huì)被System Property中的“WORKDIR”的值代替。這樣,我們就可以在log4j加載配置文件之前,先用System.setProperty("WORKDIR", WORKDIR);設(shè)置好根路徑,此操作可通過(guò)一初始的servlet進(jìn)行,具體方法略。
在沒(méi)有發(fā)現(xiàn)這個(gè)技巧之前,為了解決這個(gè)問(wèn)題,我曾自己擴(kuò)展了log4j的RollingFileAppender類(lèi),其他的FileAppender同樣道理。擴(kuò)展的方法,就是用一個(gè)子類(lèi)去覆蓋setFile方法,這個(gè)方法在log4j讀取配置文件生成appender的時(shí)候調(diào)用,傳入的就是配置文件中的路徑,這樣我就可以按照自己的想法在路徑前面加上根路徑了。
法二、可以使用服務(wù)器環(huán)境變量
log4j的配置文件支持服務(wù)器的vm的環(huán)境變量,格式類(lèi)似${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系統(tǒng)的環(huán)境變量,這個(gè)環(huán)境變量就不需要在Windows系統(tǒng)的環(huán)境變量中設(shè)置。之所以這樣,你可以看看tomcat\bin\catalina.bat(startup,shutdown都是調(diào)用這個(gè))里面自帶有-Dcatalina.home="%CATALINA_HOME%" 。繼承這個(gè)思想,所以你也可以自己設(shè)定一個(gè)參數(shù)-Dmylog.home="D:/abc/log"到對(duì)應(yīng)的服務(wù)器java啟動(dòng)的vm參數(shù)中
法三、通過(guò)servlet初始化init()方法中加載file屬性實(shí)現(xiàn)相對(duì)路徑
具體實(shí)現(xiàn):做一個(gè)servlet,在系統(tǒng)加載的時(shí)候,就把properties的文件讀到一個(gè)properties文件中.那個(gè)file的屬性值(我使用的是相對(duì)目錄)改掉(前面加上系統(tǒng)的根目錄),讓后把這個(gè)properties對(duì)象設(shè)置到propertyConfig中去,這樣就初始化了log的設(shè)置.在后面的使用中就用不著再配置了
一般在我們開(kāi)發(fā)項(xiàng)目過(guò)程中,log4j日志輸出路徑固定到某個(gè)文件夾,這樣如果我換一個(gè)環(huán)境,日志路徑又需要重新修改,比較不方便,目前我采用了動(dòng)態(tài)改變?nèi)罩韭窂椒椒▉?lái)實(shí)現(xiàn)相對(duì)路徑保存日志文件
(1).在項(xiàng)目啟動(dòng)時(shí),裝入初始化類(lèi):
public class Log4jInit extends HttpServlet {
static Logger logger = Logger.getLogger(Log4jInit.class);
public Log4jInit() {
}
public void init(ServletConfig config) throws ServletException {
String prefix = config.getServletContext().getRealPath("/");
String file = config.getInitParameter("log4j");
String filePath = prefix + file;
Properties props = new Properties();
try {
FileInputStream istream = new FileInputStream(filePath);
props.load(istream);
istream.close();
//toPrint(props.getProperty("log4j.appender.file.File"));
String logFile = prefix + props.getProperty("log4j.appender.file.File");//設(shè)置路徑
props.setProperty("log4j.appender.file.File",logFile);
PropertyConfigurator.configure(props);//裝入log4j配置信息
} catch (IOException e) {
toPrint("Could not read configuration file [" + filePath + "].");
toPrint("Ignoring configuration file [" + filePath + "].");
return;
}
}
public static void toPrint(String content) {
System.out.println(content);
}
}
實(shí)際上log4j的配置文件log4j.properties如為默認(rèn)名,可放置在JVM能讀到的classpath里的任意地方,一般是放在WEB-INF/classes目錄下。當(dāng)log4j的配置文件不再是默認(rèn)名,則需要另外加載并給出參數(shù),如上“ropertyConfigurator.configure(props);//裝入log4j配置信息”
(2).Web.xml中的配置
<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>Log4jInit</servlet-class>
<init-param>
<param-name>log4j</param-name>
<param-value>WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
注意:上面的load-on-startup設(shè)為0,以便在Web容器啟動(dòng)時(shí)即裝入該Servlet。log4j.properties文件放在根的properties子目錄中,也可以把它放在其它目錄中。應(yīng)該把.properties文件集中存放,這樣方便管理。
(3).log4j.properties中即可配置log4j.appender.file.File為當(dāng)前應(yīng)用的相對(duì)路徑。
聯(lián)系客服