從網上簡單搜索了一下,發現有三種介紹的方法。總結在這里
1.
解決的辦法自然是想辦法用相對路徑代替絕對路徑,其實log4j的FileAppender本身就有這樣的機制,如:
log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其中“${WORKDIR}/”是個變量,會被System Property中的“WORKDIR”的值代替。這樣,我們就可以在log4j加載配置文件之前,先用System.setProperty設置好根路徑。
在 沒有發現這個技巧之前,為了解決這個問題,我曾自己擴展了log4j的RollingFileAppender類,其他的FileAppender同樣道 理。擴展的方法,就是用一個子類去覆蓋setFile方法,這個方法在log4j讀取配置文件生成appender的時候調用,傳入的就是配置文件中的路 徑,這樣我就可以按照自己的想法在路徑前面加上根路徑了。
2.
可以使用環境變量
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.base}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB
3.具體實現:
一般在我們開發項目過程中,log4j日志輸出路徑固定到某個文件夾,這樣如果我換一個環境,日志路徑又需要重新修改,比較不方便,目前我采用了動態改變日志路徑方法來實現相對路徑保存日志文件
(1).在項目啟動時,裝入初始化類:
public class Log4jInit extends HttpServlet {
static Logger logger = Logger.getLogger(Log4jInit.class);
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");//設置路徑
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;
}
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");//設置路徑
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);
}
System.out.println(content);
}
}
(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>
最后決定 在項目中選擇第二種比較方便
<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>
最后決定 在項目中選擇第二種比較方便
轉http://www.blogjava.net/kxx129/archive/2006/10/10/74280.html
