javaWeb專案配置log4j
前段時間由於需要將專案部署到伺服器,由於習慣了列印到控制檯DEBUG追蹤,部署到伺服器後發現光關控制檯資訊很難追蹤到問題所在,並且控制檯還不能複製列印的資訊,所以下定決心自己將專案的日誌輸出到自己能夠隨時檢視的資料夾中。
Log4j由三個重要的元件構成:日誌資訊的優先順序,日誌資訊的輸出目的地,日誌資訊的輸出格式。日誌資訊的優先順序從高到低有ERROR、WARN、INFO、DEBUG、ALL,分別用來指定這條日誌資訊的重要程度;日誌資訊的輸出目的地指定了日誌將列印到控制檯還是檔案中;而輸出格式則控制了日誌資訊的顯示內容。
一、首先你有一個Web專案 其次你得準備好log4j的依賴包 log4j-1.2.15.jar commons-logging-1.0.4.jar 分別測試了下 2個依賴包缺一不可,否則就會報錯。
二、在你的專案根目錄下的WEB-INF 新建log4j配置 取名log4j.properties 位置和檔名你都可以重新指定,只要在後續配置下能夠根據路徑找到這個配置就行。一般採取約定熟成的方式。
log4j.rootLogger = [ level ] , appenderName1,appenderName2, …
1. rootLogger 指的是配置log4j level 包括了5種 文章開始指明 這裡意思只打印 INFO 級別以上的資訊。
appenderName1 appenderName2
2.appender具體指定將日誌資訊列印在哪
1.org.apache.log4j.ConsoleAppender(控制檯),
2.org.apache.log4j.FileAppender(檔案),
3.org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案),4.org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)
5.org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
3.layout 配置日誌資訊的格式(佈局)
1.org.apache.log4j.HTMLLayout(以HTML表格形式佈局), 2.org.apache.log4j.PatternLayout(可以靈活地指定佈局模式), 3.org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串), 4.org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊)
具體log4j配置網上一搜一大把,這裡就不再贅述了。下面是我的配置的具體含義
log4j.rootLogger=info,ServerDailyRollingFile,stdout log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd
log4j.appender.ServerDailyRollingFile.File=D:/hang222/hlserverlogs/hlserver.log log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n
log4j.appender.ServerDailyRollingFile.Append=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
1.1ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender 每天產生一個日誌檔案 以及在後續定義了列印日誌時間的格式和日誌的路徑,其中路徑你可以採用相對路徑 其中只需要修改D:/hang213/hlserverlogs/hlserver.log,
1.1.1普通相對路徑:
log4j.appender.logfile.File=../logs/app.log,將日誌記錄到tomcat下的logs資料夾;
log4j.appender.logfile.File=logs/app.log,將日誌記錄到tomcat的bin目錄下的logs資料夾;1.1.2環境變數的相對路徑:(其他需要可以自行網上搜索)通過在程式裡列印可以定位到你想的位置
System.out.println("Java執行時環境版本:/n"+System.getProperty("java.version"));
log4j.appender.logfile.File=${user.dir}/logs/app.log,使用tomcat容器時${user.dir}對應tomcat的bin目錄;
log4j.appender.logfile.File=${user.home}/logs/app.log,${user.home}對應作業系統當前使用者目錄; log4j.appender.logfile.File=${webApp.root}/logs/app.log,${webApp.root}對應當前應用根目錄; 1.2
stdout= org.apache.log4j.ConsoleAppender 列印在控制檯
} catch (IOException e) {
e.printStackTrace();
}
System.err.println("初始化log4j日誌元件");
}
}
三、在Web.xml配置log4j 用於專案自動載入log4j的配置
<!-- 載入Log4J 配置檔案 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>3000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
專案在執行時就會根據設定的路徑將log4j的配置載入,log4jRefreshInterval這是設定每3秒掃描檢視配置是否發生變化,等同於動態載入,不過一般不需要可以去掉,上面使用監聽器,當然也可以servlet實現,原理相同:只需將listener換成servlet
<servlet>
<servlet-name>log4j</servlet-name>
<servlet-class>
org.springframework.web.util.Log4jConfigServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
到此 我們的log4j就配置完成了,在專案中需要列印日誌的方法時:
private static Logger logger = Logger.getLogger(類名.class);
logger.info("列印的日誌"+需要列印的引數等);
到此over 檢視下完成沒有:控制檯
檔案:
當然由於配置了
DatePattern 你的前面日誌檔案會自動生成
hlserver.log.2017-10-18
我瞭解的還有一種就是通過servlet初始化init()方法中載入file屬性實現相對路徑
原理相同 寫一個類 用於載入log4j的配置 並在WEB.xml配置這個類並載入他。
/WEB-INF/config/log4j.properties
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
com.lq.utils.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日誌元件");
}
}
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>
第三種照著這個網址實現:也就沒怎麼研究了,大同小異,都是將配置載入
http://blog.csdn.net/longaohun/article/details/6233099
實現完了發現控制檯還好,日誌檔案中每次啟動重新啟動專案就老是顯示很多不需要的資訊,嚴重干擾了閱讀查錯,
網站上找了半天解決辦法,什麼不列印Spring的相關等,最後幡然醒悟,你將一個成熟的專案部署到伺服器後,很少會不斷的重啟服務,自己想多了。。。。。不知道會不會有人和我一樣陷入怪圈。