1. 程式人生 > >log4j中配置日誌檔案相對路徑方法

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日誌元件");
 }
}