1. 程式人生 > >tomcat中多個專案(web專案)共用log4j.jar的情況下,如何讓其各自列印各自的日誌檔案。及輸出同級別日誌資訊

tomcat中多個專案(web專案)共用log4j.jar的情況下,如何讓其各自列印各自的日誌檔案。及輸出同級別日誌資訊

問題描述:

1.專案A中有一個log4j.properties(配置為把日誌輸出到以專案名稱命名的資料夾中) 

2.為了減輕tomcat負擔,把專案A的WEB-INF/lib下的所有jar檔案拷貝到tomcat下的lib中並修改catalina.properties對其載入 

3.把專案A複製一份為專案B 

4.然後把專案A和專案B同時釋出在tomcat中(釋出時刪除了WEB-INF/lib) 
訪問專案A和專案B,發現兩個應用的日誌全部輸出到了專案A的資料夾中。 

在所有的jar檔案都拷貝到tomcat/lib中的前提下,如何使得各個應用的log4j.properties生效呢?? 

目前知道的是,兩個工程中的log4j.properties的確都被載入了,只是最後一個被載入的log4j.properties覆蓋了前面載入的配置,也就是說只有最後被載入的生效了。

解決辦法目前綜合網上的有兩種方法:

方法1:刪除tomcat資料夾下里共用的log4j.jar,分別在專案裡新增上自己的log4j.jar(要加在WEB-INF下的lib資料夾下),log4j.properties檔案依然放在src下,專案啟動載入會把其載入到WEB-INF下,正常情況這樣就可以了,但是有些同學會遇到啟動報錯,說找不到log4j.jar這個jar,這裡還須修改一下web.xml裡的配置

正常情況下需要配置路徑及監聽器的,如下圖(多個專案配多個日誌請款下,其紅圈裡的value值要不一樣,value自己隨意起名字,不同即可)


我們只需把配置路徑及監聽器去掉即可。只留一個webAppRootKey這一項既可(本方法以親測有效)

方法2:

所有的工程的日誌配置也放在在同一個log4j.properties檔案中,不需要再每個工程中存在log4j.properties檔案

將這個log4j.properties檔案放到某一個工程的classes目錄中
例如:tomcat下部署了bgapi和report兩個專案,

一個簡單的log4j.properties配置如下:

log4j.rootlogger=info
log4j.addivity.org.apache=true //是否追加寫入

#CONSOLE
#log4j.category.com=INFO,console //category已被放棄
log4j.logger.com=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.Target=System.out
log4j.appender.console.Encoding=UTF8
#PatternLayout佈局就要指定的列印資訊的具體格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern= %d - %c -%-4r [%t] %-5p %x - %m%n

# bgapi的專案log輸出配置,每天生成一個檔案
log4j.logger.com.bgapi=DEBUG,bgapi
log4j.appender.bgapi=org.apache.log4j.DailyRollingFileAppender
log4j.appender.bgapi.File=/usr/local/bgapi/log
log4j.appender.bgapi.Encoding=UTF8 
log4j.appender.bgapi.Threshold=DEBUG
log4j.appender.bgapi.DatePattern=yyyy-MM-dd'.log'
log4j.appender.bgapi.layout=org.apache.log4j.PatternLayout 
log4j.appender.bgapi.layout.ConversionPattern= %d - %c -%-4r [%t] %-5p %x - %m%n

# report專案的log輸出配置
log4j.logger.com.report=DEBUG, report
log4j.appender.report.file=/usr/local/report/log
log4j.appender.report.=org.apache.log4j.RollingFileAppender
#檔案的最大尺寸
log4j.appender.report.MaxFileSize=500kb 
#最大記錄檔案數, N(這裡為10)天前的會被刪除
log4j.appender.report.MaxBackupIndex=10 
log4j.appender.report.layout=org.apache.log4j.PatternLayout
log4j.appender.report.layout.ConversionPattern=%d{mm/dd hh:mm:ss.sss} %-5p %c %m%n


使用說明如下:
對於bgapi專案中的類,package必須以 com.bgapi 開頭
如:Test類,日誌呼叫 private static Logger logger = LogManager.getLogger(Test.class);
或者:static Logger loggerError = Logger.getLogger("com.bgapi");

report的功能的package以 com.report開頭
或者:static Logger loggerError = Logger.getLogger("com.report");

所以我們在每個專案在開發時,最好在com開頭,且不重名的package名區分,這樣才能區分輸出日誌時針對的工程

在說一下只輸出同級日誌的辦法

即:你定義的級別為info的時候,在info裡也會輸出error級別的日誌,這樣看著很亂,所以可以讓info只輸出info級別的日誌,

在log4j.appender.info = org.apache.log4j.DailyRollingFileAppender 這一欄,表示輸出動啊日誌檔案裡,但其底層是判斷該日誌資訊是否是本級或高於本機的,我們只需重寫一下即可,簡單粗暴:

package com.zab;


import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Priority;

public class LogAppender extends DailyRollingFileAppender {
@Override  
public boolean isAsSevereAsThreshold(Priority priority) {  
  //只判斷是否相等,而不判斷優先順序  
  return this.getThreshold().equals(priority);  
}  
}

然後再log4j.properties裡

log4j.appender.info = org.apache.log4j.DailyRollingFileAppender 

改成

log4j.appender.info = com.zab.LogAppender 

即可

附加一個我的log4j.properties,適用於新手

###根配置 優先順序高到低--ERROR(錯誤資訊)、WARN(警告)、INFO(一般)、DEBUG(除錯)
log4j.rootLogger = debug,stdout,i,D,E
###關閉多餘輸出資訊,關閉ssh框架的輸出資訊
log4j.logger.org.hibernate=OFF
#log4j.logger.org.springframework=OFF  
#log4j.logger.org.apache.struts2=OFF  
#log4j.logger.com.opensymphony.xwork2=OFF  
#log4j.logger.com.ibatis=OFF  

###輸出資訊到控制檯
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 輸出INFO 級別以上的日誌到=d:/data/logs/info/log.log ###
###每天產生一個日誌檔案
log4j.appender.i = org.apache.log4j.DailyRollingFileAppender
###日誌檔案存放地址
log4j.appender.i.File = d:/data/root/info/log.log
###log4j.appender.i.File =${web.root.one}/WEB-INF/logs/log4j.log
###預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。
log4j.appender.i.Append = true
log4j.appender.i.Threshold = INFO 
###靈活指定佈局模式
log4j.appender.i.layout = org.apache.log4j.PatternLayout    
###日誌編碼
log4j.appender.i.Encoding=UTF-8 
###	%m   輸出程式碼中指定的訊息
###	%p   輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL 
###	%r   輸出自應用啟動到輸出該log資訊耗費的毫秒數 
###	%c   輸出所屬的類目,通常就是所在類的全名 
###	%t   輸出產生該日誌事件的執行緒名 
###	%n   輸出一個回車換行符,Windows平臺為“/r/n”,Unix平臺為“/n” 
###	%d   輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},輸出類似:2002年10月18日  22 : 10 : 28 , 921  
###	%l   輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java: 10 ) 
log4j.appender.i.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  method:%l%n%m%n


### 輸出DEBUG 級別以上的日誌到=d:/data/logs/debug/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = d:/data/root/debug/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.Encoding=UTF-8 
log4j.appender.D.layout = org.apache.log4j.PatternLayout    
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  method:%l%n%m%n

### 輸出ERROR 級別以上的日誌到=d:/data/logs/error/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = d:/data/root/error/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.Encoding=UTF-8 
log4j.appender.E.layout = org.apache.log4j.PatternLayout    
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  method:%l%n%m%n

###設定一些資訊的輸出級別#可自行參考
log4j.logger.net.sf.hibernate=error
log4j.logger.org.quartz.core=error
log4j.logger.org.apache.axis=error
log4j.logger.com.mchange=error
log4j.logger.com.opensymphony=error
log4j.logger.net.sf.hibernate.SQL=error
log4j.logger.net.sf.hibernate.type=error
log4j.logger.net.sf.hibernate.tool.hbm2ddl=warn