log4j中配置日誌檔案相對路徑方法
總結了上面的三個方法,可取的是方法三,但是還是繁瑣,要寫個servlet,寫一大堆程式碼
下面這個方法比較實用我覺得,大家可以試下:
log4j.appender.AFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.AFile.DatePattern='.'yyyy-MM-dd'.html'
log4j.appender.AFile.File=..//webapps//專案//logs//d1cm_log.html
log4j.appender.AFile.layout=org.apache.log4j.HTMLLayout
log4j.appender.AFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c %m %n
預設生成的日誌檔案是在伺服器的bin目錄下(我使用的是Tomcat),這樣通過相對路徑 ..//webapps//專案名稱//日誌目錄//日誌檔案(或../webapps/專案名稱/日誌目錄/日誌檔案),就能在你的專案中自動建立日誌目錄和日誌檔案。
方法一:用相對路徑代替絕對路徑
主要是擴充套件了log4j的RollingFileAppender類,其他的FileAppender同樣道理。擴充套件的方法,就是用一個子類去覆蓋setFile方法,這個方法在log4j讀取配置檔案生成appender的時候呼叫,傳入的就是配置檔案中的路徑,這樣我就可以按照自己的想法在路徑前面加上根路徑了。這種方法可以在log4j.properties中用相對路徑自由配置log4j.appender.A1.File屬性來決定生成的日誌相對web應用根目錄的位置。
舉例:ZxmDailyRollingFileAppender.java
log4j.properties檔案
log4j.appender.AFile=com.common.config.ZxmDailyRollingFileAppender
#log4j.appender.AFile=org.apache.log4j.DailyRollingFileAppender
public class ZxmDailyRollingFileAppender extends DailyRollingFileAppender {
public void setFile(String filetype, boolean arg2, boolean arg3, int arg4) throws IOException {
String path = getServletConfig().getServletContext().getRealPath("/logs/");
String fuhao = File.separator;
String filepath = path + fuhao + "log.html";
super.setFile(filepath, arg2, arg3, arg4);
}
}
方法二:使用伺服器環境變數
是利用伺服器vm中已經存在的環境變數如${catalina.home}或者${catalina.base}來設定相對於${catalina.home}或者${catalina.base}的日誌路徑,日誌只能放到伺服器子目錄裡,而且如果是用的其它伺服器,則要改對應的環境變數。此方法平臺移植不方便。
舉例:log4j.appender.file.file=${catalina.base}/logs/psp_error.log
catalina.home指向公用資訊的位置,就是bin和lib的父目錄。
catalina.base指向每個Tomcat目錄私有資訊的位置,就是conf、logs、temp、webapps和work的父目錄。
僅執行一個Tomcat例項時,這兩個屬性指向的位置是相同的。
方法三:通過servlet初始化init()方法中載入file屬性實現相對路徑
是擴充套件ActionServlet類,覆蓋其init()方法,新方法中載入log4j.properties位置的引數,可以自由配置log4j的配置檔案的名字和存放位置。也可自由配置log4j日誌檔案的相對於當前應用的路徑。
舉例:
web.xml
<!-- 系統初始化配置資訊 servlet -->
<servlet>
<servlet-name>configServlet</servlet-name>
<servlet-class>com.common.config.ConfigServlet</servlet-class>
<init-param>
<param-name>Log4jFile</param-name>
<param-value>/WEB-INF/config/log4j.properties</param-value>
</init-param>
<init-param>
<param-name>Log4jFileSavePath</param-name>
<param-value>/logs</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
ConfigServlet.java檔案
public class ConfigServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
super.init(config);
//初始化log4j日誌元件
initLogConfig(config);
}
private void initLogConfig(ServletConfig config) {
String prifix = getServletContext().getRealPath("/");
//System.out.println(prifix);
//獲取log4j配置檔案地址
String Log4jFile = config.getInitParameter("Log4jFile");
//System.out.println(Log4jFile);
String filePath = prifix + Log4jFile;
//System.out.println(filePath);
PropertyConfigurator.configure(filePath);
Properties props = new Properties();
try {
String Log4jFileSavePath = config.getInitParameter("Log4jFileSavePath");
//System.out.println(Log4jFileSavePath);
FileInputStream log4jStream = new FileInputStream(filePath);
props.load(log4jStream);
log4jStream.close();
//設定日誌儲存地址
String logFile = prifix + Log4jFileSavePath + File.separator + "d1cm_log.html" ;
//System.out.println(logFile);
props.setProperty("log4j.appender.AFile.File", logFile);
PropertyConfigurator.configure(props); //裝入log4j配置資訊
} catch (IOException e) {
e.printStackTrace();
}
System.err.println("初始化log4j日誌元件");
}
}