之前一直在使用System.out.println()來調試.但是用這種方式開發項目部署到生產環境,會因為眾多的控制台輸出降低應用的性能.這時候Log4J就成為可平衡開發和部署應用的利器了.
在項目中使用Log4J並不是一件困難的事情,簡單粗暴的方式就是在每個類A中聲明一個Logger私有屬性
- private static Logger logger = Logger.getLogger(A.class);
private static Logger logger = Logger.getLogger(A.class);
這樣雖然簡單,但是帶來有兩個問題:
1.增加系統開銷-每個使用Log4J的類都增加了對象屬性.
2.麻煩:每個使用Logger的類都要重復聲明上面Logger對象.
其實不難發現可以使用重構手法,聲明一個公用的類Log4jUtils,處理Logger的公共操作.
不過呢,問題不這么簡單.首先要解決一個問題,Logger.getLogger(A.class)中的A.class有什么用?A.class可以不可以瞎寫?
先做個試驗,先簡單配置log4j.properties文件
- #日志級別,輸出目的地
- log4j.rootLogger=debug,stdout
- log4j.appender.stdout=org.apache.log4j.Conso
- leAppender
- log4j.appender.stdout.Target=System.out
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- #輸出格式
- log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n
#日志級別,輸出目的地 log4j.rootLogger=debug,stdout log4j.appender.stdout=org.apache.log4j.Conso leAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #輸出格式 log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n
新建一個測試類
- import org.apache.log4j.Logger;
- /**
- * Created by li on 2015/5/24.
- */
- public class LoggerTest {
- private static Logger logger = Logger.getLogger(Object.class);
- public static void main(String[] args) {
- logger.debug("Hello World!");
- }
- }
import org.apache.log4j.Logger; /** * Created by li on 2015/5/24. */ public class LoggerTest { private static Logger logger = Logger.getLogger(Object.class); public static void main(String[] args) { logger.debug("Hello World!"); } }
查看結果:
結合log4j.properties配置的
log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n
不難知道%c這時候將LoggerTest類的代碼修改
private static Logger logger = Logger.getLogger(LoggerTest.class);
運行結果變為:
要的結果終於出現了.至此,明白了getLogger(class)的參數用途:追蹤產生此日志的類.
現在就出現了新的問題:若要使用一個類Log4jUtils來專門處理Logger對象的聲明等操作,那么如何處理getLogger(class)的參數問題?
也就是如何在Log4jUtils得到調用logger對象的類型.
解決這個困難可以是使用Java的反射機制
看下面的代碼:
類Log4jUtils:
- /**
- * Created by li on 2015/5/23.
- */
- public class Log4JUtils{
- private static Logger logger = null;
- public static Logger getLogger(){
- if (null == logger){
- //Java8 廢棄了Reflection.getCallerClass()
- logger = Logger.getLogger(Reflection.getCallerClass().getName());
- logger.debug("調用者類名"+Reflection.getCallerClass().getName());
- }
- return logger;
- }
- }
/** * Created by li on 2015/5/23. */ public class Log4JUtils{ private static Logger logger = null; public static Logger getLogger(){ if (null == logger){ //Java8 廢棄了Reflection.getCallerClass() logger = Logger.getLogger(Reflection.getCallerClass().getName()); logger.debug("調用者類名"+Reflection.getCallerClass().getName()); } return logger; } }
修改類LoggerTest的代碼:
- /**
- * Created by li on 2015/5/24.
- */
- public class LoggerTest {
- // private static Logger logger = Logger.getLogger(LoggerTest.class);
- public static void main(String[] args) {
- Log4JUtils.getLogger().debug("Hello World!");
- }
- }
/** * Created by li on 2015/5/24. */ public class LoggerTest { // private static Logger logger = Logger.getLogger(LoggerTest.class); public static void main(String[] args) { Log4JUtils.getLogger().debug("Hello World!"); } }
運行結果:
看到這個結果就很爽了.以后項目就可以放棄使用System.out.println()打印語句了.