log4j記錄檔路徑問題

來源:互聯網
上載者:User

做了一個最簡單的servlet項目,只有一個servlet,然後想在servlet把日誌記錄到項目下的logs檔案夾中的logRecord.log和logRecorderror.log。

然而路徑問題弄了我一天,找了很多資料,絕對路徑是可以解決,但是如果移植的話,那麼絕對路徑改起來會很麻煩。所以最好用相對路徑。


但是網上的相關資料都無法解決我的問題,後來一不做二不休,瞎弄,發現路徑直接寫logs/logRecord.log竟然成功的把日誌寫入進去了。


好了,話不多說   直接上代碼。


1.首先我們把

commons-logging-1.1.3.jar
log4j-1.2.17.jar

匯入到項目中。


2.配置log4j.properties

### set log levels ###log4j.rootLogger = INFO, stdout, D, E#log4j.rootLogger = INFO, stdout#log.path = /mylog###ãè¾åºå°æ§å¶å° ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern =  %d{yyyy/MM/dd-HH:mm:ss} [%-5p] [%c] [%F] - %m %n### è¾åºå°æ¥å¿æä»¶ ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = logs/logRecord.loglog4j.appender.D.DatePattern='.'yyyy-MM-ddlog4j.appender.D.Threshold = INFOlog4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %d{yyyy/MM/dd-HH:mm:ss} [%-5p] [%c] [%F] - %m %nlog4j.appender.D.layout.Encoding=UTF-8### ä¿å­å¼å¸¸ä¿¡æ¯å°åç¬æä»¶ ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppender##å¼å¸¸æ¥å¿æä»¶log4j.appender.E.File = logs/logRecorderror.loglog4j.appender.E.Append = true##åªè¾åºERROR级å«ä»¥ä¸çæ¥å¿log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %d{yyyy/MM/dd-HH:mm:ss} [%-5p] [%c] [%F] - %m %nlog4j.appender.E.DatePattern='.'yyyy-MM-ddlog4j.appender.E.Encoding=UTF-8



這個是servlet,裡面的main方法是來把日誌寫入檔案中。

package com.pingpay.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class PingPayLogServlet extends HttpServlet {// 在任何需要記錄日誌的類中Log log = LogFactory.getLog(this.getClass());/** * 記錄ping++返回的資料 *  */public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//response.setContentType("text/html");//request.setCharacterEncoding("utf-8");//response.setCharacterEncoding("utf-8");log.info("into one method");try {System.out.println(9 / 0);} catch (RuntimeException e) {log.error(e.getMessage());}log.info("out one method");}public static void main(String[] args) throws Exception {new PingPayLogServlet().doPost(null, null);System.out.println("1");}}


項目結構如圖。


因為我們在log4j.properties中設定了log4j.appender.D.Threshold = INFO,log4j.appender.E.Threshold = ERROR 。

所以error的日誌會儲存在logRecorderror.log檔案中,

但是由於:DEBUG < INFO < WARN < ERROR < FATAL層級

log4j.appender.D.Threshold = INFO這句話 
它的作用是輸出INFO層級以上的內容到logRecord.log中,所以logRecord.log檔案中包含了ERROR層級的檔案。


如有錯誤,請指出,謝謝。


周一回來發現上面的方法不行了。我也是醉了,然後換了一種方法。

將記錄檔輸出到自己程式WEB-INF\logs目錄中

1、在web.xml配置一個servlet

<servlet> <servlet-name>lo4jInit</servlet-name> <servlet-class>com.linder.util.log4j.init.Lo4jInit</servlet-class> <init-param> <param-name>log4j_init_path</param-name> <param-value>WEB-INF\classes\log4j.properties</param-value> </init-param> <init-param> <param-name>log4j_file_path</param-name> <param-value>WEB-INF\logs\</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet>

2、編寫一個初始化log4j的Servlet

package com.linder.util.log4j.init;import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class Lo4jInit   extends HttpServlet {/** *  */private static final long serialVersionUID = 1L;private static Logger logger=Logger.getLogger(Lo4jInit.class);public void init(){String path=this.getServletContext().getRealPath("/");String file=this.getInitParameter("log4j_init_path");String logFile=this.getInitParameter("log4j_file_path");if(file!=null){Properties prop = new Properties(); try{prop.load(new FileInputStream(path+file)); //載入log4j.propertiesprop.setProperty("log4j.appender.R.File", path+logFile+ prop.getProperty("log4j.appender.R.File")); //設定記錄檔的輸出路徑PropertyConfigurator.configure(prop); //載入配置項}catch(Exception e){logger.info("初始化log4j日誌輸入路徑異常,請檢查web.xml參數配置是否正常,異常發生在"+this.getClass().getName()+"類的public void init()方法,異常的願意是:"+e.getMessage(), e.fillInStackTrace());}}}protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}}

 3、log4j.properties的配置資訊

# Set root category priority to info and its only appender to console. log4j.rootCategory=info,console,R#log4j.debug=true# console is set to be a ConsoleAppender using a PatternLayout. log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Threshold=info log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=- %m%n# R is set to be a File appender using a PatternLayout.log4j.appender.R=org.apache.log4j.RollingFileAppenderlog4j.appender.R.Append=truelog4j.appender.R.Threshold=info log4j.appender.R.MaxFileSize=1024KB log4j.appender.R.MaxBackupIndex=10log4j.appender.R.File=abc.loglog4j.appender.R.layout=org.apache.log4j.PatternLayoutlog4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%c]-[%p] %m%n

abc.log位於你項目的WEB-INF/logs的檔案夾下。


 我項目的XML配置為:

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><servlet><servlet-name>lo4jInit</servlet-name><servlet-class>com.pingpay.servlet.Lo4jInit</servlet-class><init-param><param-name>log4j_init_path</param-name><param-value>WEB-INF\classes\log4j.properties</param-value></init-param><init-param><param-name>log4j_file_path</param-name><param-value>WEB-INF\logs\</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet><description>This is the description of my J2EE component</description><display-name>This is the display name of my J2EE component</display-name><servlet-name>PingPayServlet</servlet-name><servlet-class>com.pingpay.servlet.PingPayServlet</servlet-class></servlet><servlet-mapping><servlet-name>PingPayServlet</servlet-name><url-pattern>/PingPayServlet</url-pattern></servlet-mapping></web-app>



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.