欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2017年01月06日 15:22:57   作者:瘋狂的螞蟻  
日志是應(yīng)用軟件中不可缺少的部分,Apache的開源項(xiàng)目log4j是一個(gè)功能強(qiáng)大的日志組件,提供方便的日志記錄。這篇文章主要介紹了利用Log4j將不同Package的日志輸出到不同文件的方法,需要的朋友可以參考借鑒,下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。

前言

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

  1. 接收外界消息的日志、對外發(fā)送消息的日志;
  2. 后臺常駐線程的處理日志;
  3. 外部接口訪問的參數(shù)、返回結(jié)果等接口日志;
  4. Service訪問數(shù)據(jù)庫產(chǎn)生的SQL日志;

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

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

步驟1:在log4j.properties中配置

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

log4j.rootLogger=INFO, console, file
 
log4j.appender.console=net.czt.log.AsyncConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.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%n
log4j.appender.console.bufferSize=10000
log4j.appender.console.encoding=UTF-8
 
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.file=/home/work/apache-tomcat-6.0.39/logs/crazyant.log
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.MaxFileSize=1GB
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.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%n
log4j.appender.file.bufferSize=10000
log4j.appender.file.encoding=UTF-8
 
log4j.logger.net.czt.crazyant.msg=DEBUG, message
log4j.additivity.net.czt.crazyant.msg=false
log4j.appender.message=org.apache.log4j.RollingFileAppender
log4j.appender.message.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_message.log
log4j.appender.message.Append=true
log4j.appender.message.MaxFileSize=1GB
log4j.appender.message.MaxBackupIndex=5
log4j.appender.message.layout=org.apache.log4j.PatternLayout
log4j.appender.message.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.message.encoding=UTF-8
 
log4j.logger.net.czt.crazyant.async.service=DEBUG, async
log4j.additivity.net.czt.crazyant.async.service=false
log4j.appender.async=org.apache.log4j.RollingFileAppender
log4j.appender.async.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_async.log
log4j.appender.async.Append=true
log4j.appender.async.MaxFileSize=1GB
log4j.appender.async.MaxBackupIndex=5
log4j.appender.async.layout=org.apache.log4j.PatternLayout
log4j.appender.async.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.async.encoding=UTF-8
 
log4j.logger.net.czt.orm.mybatis.SqlMonitorManager=DEBUG, showsql
log4j.additivity.net.czt.orm.mybatis.SqlMonitorManager=false
log4j.logger.net.czt.transaction.interceptor.SmartTransactionInterceptor=DEBUG, showsql
log4j.additivity.net.czt.transaction.interceptor.SmartTransactionInterceptor=false
log4j.appender.showsql=org.apache.log4j.RollingFileAppender
log4j.appender.showsql.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.log
log4j.appender.showsql.Append=true
log4j.appender.showsql.MaxFileSize=1GB
log4j.appender.showsql.MaxBackupIndex=5
log4j.appender.showsql.layout=org.apache.log4j.PatternLayout
log4j.appender.showsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.showsql.encoding=UTF-8
 
log4j.logger.net.czt.crazyant.service=DEBUG, service
log4j.additivity.net.czt.crazyant.service=false
log4j.appender.service=org.apache.log4j.RollingFileAppender
log4j.appender.service.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_service.log
log4j.appender.service.Append=true
log4j.appender.service.MaxFileSize=1GB
log4j.appender.service.MaxBackupIndex=5
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.service.encoding=UTF-8

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

其中的一些解釋:

log4j.rootLogger=INFO, console, file

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

看一下普通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”,和上面的相同,表示該配置項(xiàng)針對的package

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

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

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

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

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

步驟2、輸出日志時(shí)需要設(shè)定日志對象對應(yīng)的具體Class

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

1、采用intercepter或者aop的方式,log4j自己檢測日志輸出,檢測到日志產(chǎn)生于哪個(gè)package,就將其輸出到對應(yīng)文件中;

2、由用戶傳一個(gè)Class參數(shù),log4j獲取該Class對應(yīng)的Package,以此為準(zhǔn),來定位不同的日志文件;

看一下代碼,顯然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參數(shù),而該Class被反射取到的package地址,就是log4j用來輸出日志的package地址。

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

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

總結(jié)

Log4j.properties中,支持package或者具體class的日志單獨(dú)輸出,但是也需要代碼中l(wèi)ogger初始化的時(shí)候,能和日志配置中的package對應(yīng)上。

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

相關(guān)文章

  • Elasticsearch索引結(jié)構(gòu)與算法解析

    Elasticsearch索引結(jié)構(gòu)與算法解析

    ?作為搜索引擎的一部分,ES自然具有速度快、結(jié)果準(zhǔn)確、結(jié)果豐富等特點(diǎn),那么ES是如何達(dá)到“搜索引擎”級別的查詢效率呢?首先是索引,其次是壓縮算法,接下來我們就一起了解下ES的索引結(jié)構(gòu)和壓縮算法
    2023-04-04
  • Java實(shí)現(xiàn)選擇排序

    Java實(shí)現(xiàn)選擇排序

    這篇文章主要介紹了Java實(shí)現(xiàn)選擇排序,把一列數(shù)組按從小到大或從大到小排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SSH框架網(wǎng)上商城項(xiàng)目第11戰(zhàn)之查詢和刪除商品功能實(shí)現(xiàn)

    SSH框架網(wǎng)上商城項(xiàng)目第11戰(zhàn)之查詢和刪除商品功能實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第11戰(zhàn)之查詢和刪除商品功能實(shí)現(xiàn)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java實(shí)現(xiàn)實(shí)時(shí)視頻轉(zhuǎn)播的代碼示例

    Java實(shí)現(xiàn)實(shí)時(shí)視頻轉(zhuǎn)播的代碼示例

    這篇文章主要給大家詳細(xì)介紹了Java如何實(shí)現(xiàn)實(shí)時(shí)視頻轉(zhuǎn)播,文中通過代碼實(shí)例介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以自己動手試一試
    2023-09-09
  • java接口語法以及與類的關(guān)系詳解

    java接口語法以及與類的關(guān)系詳解

    接口在JAVA編程語言中是一個(gè)抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個(gè)類通過繼承接口的方式,從而來繼承接口的抽象方法
    2021-10-10
  • Java初學(xué)者了解

    Java初學(xué)者了解"=="與equals的區(qū)別

    這篇文章主要介紹了Java初學(xué)者了解"=="與equals的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java微服務(wù)的打包問題解決

    Java微服務(wù)的打包問題解決

    本文主要介紹了Java微服務(wù)的打包問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Spring Framework常用面試題及答案匯總

    Spring Framework常用面試題及答案匯總

    這篇文章主要介紹了Spring Framework常用面試題及答案匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • spring boot實(shí)現(xiàn)阿里云視頻點(diǎn)播上傳視頻功能(復(fù)制粘貼即可)

    spring boot實(shí)現(xiàn)阿里云視頻點(diǎn)播上傳視頻功能(復(fù)制粘貼即可)

    這篇文章主要介紹了spring boot實(shí)現(xiàn)阿里云視頻點(diǎn)播上傳視頻功能(復(fù)制粘貼即可),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • JavaFX Metro UI 和 開發(fā)庫使用簡介

    JavaFX Metro UI 和 開發(fā)庫使用簡介

    這篇文章主要介紹了JavaFX Metro UI 和 開發(fā)庫解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評論