国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

利用Log4j將不同Package的日志輸出到不同文件的方法

2019-11-26 13:18:20
字體:
來源:轉載
供稿:網友

前言

隨著項目規模的越來越大,會不斷的引入新的模塊,不同的模塊都會打印自己的日志,最后就造成日志根本沒法查看,比如我自己的項目中,就存在以下這些日志:

  1. 接收外界消息的日志、對外發送消息的日志;
  2. 后臺常駐線程的處理日志;
  3. 外部接口訪問的參數、返回結果等接口日志;
  4. Service訪問數據庫產生的SQL日志;

這其中,消息日志和后臺線程的日志數據量非常龐大,如果所有日志打印在一個文件中,使用tail -f log.log文件,會發現日志在快速的滾動,根本無法查看甚至定位某一個具體的SQL或者Service訪問日志。

解決方法就是可以將不同的日志加以分類輸出,這樣相互的日志不影響,尤其重要的接口訪問日志,能夠很方便的定位和排查問題。

步驟1:在log4j.properties中配置

先貼一下我自己所有的log4j.properties配置:

log4j.rootLogger=INFO, console, file log4j.appender.console=net.czt.log.AsyncConsoleAppenderlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d [%t] %-5p crazyant-web %-17c{2} (%13F:%L) %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} - %m%nlog4j.appender.console.bufferSize=10000log4j.appender.console.encoding=UTF-8 log4j.appender.file=org.apache.log4j.RollingFileAppenderlog4j.appender.file.file=/home/work/apache-tomcat-6.0.39/logs/crazyant.loglog4j.appender.file.MaxBackupIndex=5log4j.appender.file.MaxFileSize=1GBlog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=[%-5p] crazyant-web %d{yyyy-MM-dd HH:mm:ss,SSS} %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} method:%l%n%m%nlog4j.appender.file.bufferSize=10000log4j.appender.file.encoding=UTF-8 log4j.logger.net.czt.crazyant.msg=DEBUG, messagelog4j.additivity.net.czt.crazyant.msg=falselog4j.appender.message=org.apache.log4j.RollingFileAppenderlog4j.appender.message.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_message.loglog4j.appender.message.Append=truelog4j.appender.message.MaxFileSize=1GBlog4j.appender.message.MaxBackupIndex=5log4j.appender.message.layout=org.apache.log4j.PatternLayoutlog4j.appender.message.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%nlog4j.appender.message.encoding=UTF-8 log4j.logger.net.czt.crazyant.async.service=DEBUG, asynclog4j.additivity.net.czt.crazyant.async.service=falselog4j.appender.async=org.apache.log4j.RollingFileAppenderlog4j.appender.async.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_async.loglog4j.appender.async.Append=truelog4j.appender.async.MaxFileSize=1GBlog4j.appender.async.MaxBackupIndex=5log4j.appender.async.layout=org.apache.log4j.PatternLayoutlog4j.appender.async.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%nlog4j.appender.async.encoding=UTF-8 log4j.logger.net.czt.orm.mybatis.SqlMonitorManager=DEBUG, showsqllog4j.additivity.net.czt.orm.mybatis.SqlMonitorManager=falselog4j.logger.net.czt.transaction.interceptor.SmartTransactionInterceptor=DEBUG, showsqllog4j.additivity.net.czt.transaction.interceptor.SmartTransactionInterceptor=falselog4j.appender.showsql=org.apache.log4j.RollingFileAppenderlog4j.appender.showsql.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.loglog4j.appender.showsql.Append=truelog4j.appender.showsql.MaxFileSize=1GBlog4j.appender.showsql.MaxBackupIndex=5log4j.appender.showsql.layout=org.apache.log4j.PatternLayoutlog4j.appender.showsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%nlog4j.appender.showsql.encoding=UTF-8 log4j.logger.net.czt.crazyant.service=DEBUG, servicelog4j.additivity.net.czt.crazyant.service=falselog4j.appender.service=org.apache.log4j.RollingFileAppenderlog4j.appender.service.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_service.loglog4j.appender.service.Append=truelog4j.appender.service.MaxFileSize=1GBlog4j.appender.service.MaxBackupIndex=5log4j.appender.service.layout=org.apache.log4j.PatternLayoutlog4j.appender.service.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%nlog4j.appender.service.encoding=UTF-8

在配置文件的下方,可以方便的看到,我將message(消息)、async(后端線程)、showsql(數據庫日志)、service(接口調用)分別輸出到了不同的日志文件。

其中的一些解釋:

log4j.rootLogger=INFO, console, file

log4j有一個rootLogger和普通Logger的概念,默認情況下我們只需要一個rootLogger,就是所有的日志只會輸出到這一個日志文件中。

看一下普通Logger的配置(以接口日志service為例):

1、log4j.logger.net.czt.crazyant.service=DEBUG, service

      這句中的”net.czt.crazyant.service”,表示該普通logger日志配置生效的package的完全路徑

      其中色service,表示該普通logger的名字

2、log4j.additivity.net.czt.crazyant.service=false

      其中的”net.czt.crazyant.service”,和上面的相同,表示該配置項針對的package

      該句配置的意思,是不要將該package的日志輸出到rootLogger日志中,只輸出到自己配置的日志就行了;

3、log4j.appender.service=org.apache.log4j.RollingFileAppender,以及該配置段下面的配置項

       這里的”service”字符串,和上面的第一個配置項的”service”相同,表示對該普通Logger的配置;

       下方的配置項和rootLogger相同,表示每天輸出文件、編碼UTF8、分片規則、每行的輸出模式等等

我自己遇到的問題,是上面的log4j.properties配置好以后,發現各個日志文件創建了,但是里面都沒有內容,這是為啥呢?來看下面第二個注意的地方;

步驟2、輸出日志時需要設定日志對象對應的具體Class

什么意思呢?上面的配置項中,有一個”net.czt.crazyant.service”的package字符串,那么我們自己想一下,log4j是怎樣將不同package中的logger日志輸出到不同文件呢,想一下會有兩種方法:

1、采用intercepter或者aop的方式,log4j自己檢測日志輸出,檢測到日志產生于哪個package,就將其輸出到對應文件中;

2、由用戶傳一個Class參數,log4j獲取該Class對應的Package,以此為準,來定位不同的日志文件;

看一下代碼,顯然log4j用的是后一種簡單直接的方式:

import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory; public class MyClassImpl implements MyClass { /**  * loger  */ private static final Log logger = LogFactory.getLog(MyClassImpl.class);  /**  * my func  */ public void myfunc() {  logger.info("call method myfunc."); }}

logger = LogFactory.getLog(MyClassImpl.class)中,傳入了使用該logger的Class參數,而該Class被反射取到的package地址,就是log4j用來輸出日志的package地址。

這種做法也有強大的地方,方便邏輯上的日志歸類,比如很多代碼不屬于一個package,但是它們邏輯上屬于一起的,舉個例子,消息的處理不只是接口調用Service這個package,可能還會調用發送msg的操作,如果想把msg的package中一些日志也輸出到Service,那么在這個msg的logger初始化的時候,傳入一個Serivice的Class就行了。

或者對于某一類的所有日志來說,它們所有的logger對象,都來自封裝好的單個對象實例即可,而這個單個對象實例傳入的參數只有一個,用于標識這個邏輯歸類即可。

總結

Log4j.properties中,支持package或者具體class的日志單獨輸出,但是也需要代碼中logger初始化的時候,能和日志配置中的package對應上。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 历史| 大兴区| 绵竹市| 孙吴县| 西安市| 岢岚县| 类乌齐县| 肇庆市| 彝良县| 涞源县| 山丹县| 庆安县| 永修县| 潍坊市| 无棣县| 兴化市| 南京市| 纳雍县| 上蔡县| 昌黎县| 玉林市| 梅河口市| 汶川县| 邵武市| 天柱县| 岫岩| 莱西市| 西充县| 涿鹿县| 新巴尔虎右旗| 双桥区| 卓尼县| 洪泽县| 福清市| 陇西县| 四平市| 涿州市| 武穴市| 水城县| 白水县| 青海省|