從網(wǎng)上簡單搜索了一下,發(fā)現(xiàn)有三種介紹的方法。總結(jié)在這里
1.
1.
解決的辦法自然是想辦法用相對路徑代替絕對路徑,其實(shí)log4j的FileAppender本身就有這樣的機(jī)制,如:
log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其中“${WORKDIR}/”是個變量,會被System Property中的“WORKDIR”的值代替。這樣,我們就可以在log4j加載配置文件之前,先用System.setProperty設(shè)置好根路徑。
在 沒有發(fā)現(xiàn)這個技巧之前,為了解決這個問題,我曾自己擴(kuò)展了log4j的RollingFileAppender類,其他的FileAppender同樣道 理。擴(kuò)展的方法,就是用一個子類去覆蓋setFile方法,這個方法在log4j讀取配置文件生成appender的時候調(diào)用,傳入的就是配置文件中的路 徑,這樣我就可以按照自己的想法在路徑前面加上根路徑了。
2.
可以使用環(huán)境變量
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.base}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB
3.具體實(shí)現(xiàn):一般在我們開發(fā)項(xiàng)目過程中,log4j日志輸出路徑固定到某個文件夾,這樣如果我換一個環(huán)境,日志路徑又需要重新修改,比較不方便,目前我采用了動態(tài)改變?nèi)罩韭窂椒椒▉韺?shí)現(xiàn)相對路徑保存日志文件
(1).在項(xiàng)目啟動時,裝入初始化類:?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);
??? }}(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>
最后決定 在項(xiàng)目中選擇第二種比較方便