在spring引入log4j
在spring中使用log4j
- 引入log4j軟體包
- 配置log4j屬性
- 載入log4j配置檔案
- 預設載入
- 手動載入
- 使用logger
本文的整體程式碼結構是在已經引入spring基本應用的前提下,在spring配置檔案中通過@Bean註解建立一個Logger bean,然後在測試程式碼中使用。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.net.URL; import org.apache.log4j.Logger; import org.apache.logging.log4j.core.config.ConfigurationSource; import org.apache.logging.log4j.core.config.Configurator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @Configuration @EnableAspectJAutoProxy @ComponentScan({"com.markey.messageboard.app.impl","com.markey.messageboard.aop"}) public class SpringConfig { // @Bean // public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){ // PropertySourcesPlaceholderConfigurer placeholderConfigurer = new PropertySourcesPlaceholderConfigurer(); // return placeholderConfigurer; // } @Bean public static Logger logger(){ String path="/com/log4j.properties"; URL url=SpringConfig.class.getResource(path); ConfigurationSource source; try { source = new ConfigurationSource(new FileInputStream(new File(url.getPath())),url); Configurator.initialize(null, source); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Logger logger = Logger.getLogger(SpringConfig.class); return logger; } }
import org.apache.log4j.Logger; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.markey.messageboard.app.Dosomething; import com.markey.messageboard.configs.SpringConfig; import com.markey.messageboard.model.Messageboard; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfig.class) //@PropertySource("classpath:/test.properties") //@PropertySource("classpath:/log4j.properties") public class helloSpring { @Autowired Environment evn; @Autowired Dosomething dosomething; @Autowired Logger logger; @Value("${god.hello}") String titleString; @Test public void testWorld(){ // System.out.println(evn.containsProperty("god.hello")); // Messageboard messageBoard = new Messageboard(); // messageBoard.setTitle(titleString); // System.out.println(dosomething.readWall(messageBoard)); // dosomething.readWall(messageBoard); logger.error("hello,i am error messages"); } }
一、引入log4j軟體包
使用log4j涉及兩個庫檔案:log4j和log4j-core
mava引用如下:
<!--https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency>
二、配置log4j屬性
log4j配置檔案支援xml格式和properites格式,下面為例properites介紹需要配置的內容。
配置檔案分為三部分配置:
l 日誌級別配置
l 輸出目的地配置
l 輸出樣式配置
1. 日誌級別配置
日誌級別配置分為兩種:根目錄級別和包目錄基本。
顧名思義,根目錄級別就是定義總的日誌級別,具體到某個特定的包路徑下的類,還可以定製日誌級別。
Log4j自定義的日誌級別有:OFF >FATAL > ERROR > WARN > INFO > DEBUG > ALL
但是建議只使用ERROR > WARN > INFO > DEBUG這四種。通過在這裡定義的級別,您可以控制到應用程式中相應級別的日誌資訊的開關。比如在這裡定 義了 INFO 級別,則應用程式中所有 DEBUG 級別的日誌資訊將不被打印出來 。
###定義根日誌級別為info###
###定義com.markey.messageboard日誌級別為debug###
###定義com.markey.messageboard.springtest日誌級別為info###
log4j.rootLogger=infolog4j.logger.com.markey.messageboard=DEBUGlog4j.logger.com.markey.messageboard.springtest=info
2. 輸出目的地配置
定義輸出目的地,定義完成後需要配置根目錄啟用,可以定義多個目的地輸出。
Log4j 提供的 appender 有以下幾種:
1. org.apache.log4j.ConsoleAppender(控制檯),
2. org.apache.log4j.FileAppender (檔案),
3. org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案),
4. 4.org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個 新的檔案)
5. org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
###配置輸出目的地###
log4j.rootLogger=info,stdout,errorfile,infofile
log4j.logger.com.markey.messageboard=DEBUG
log4j.logger.com.markey.messageboard.springtest=info
#console config
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#errorfile config
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.File= c:/logs/app_logs/error.log
#infofile config
log4j.appender.infofile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.infofile.File=c:/logs/app_logs/info.log
3. 輸出樣式配置
定義日誌樣式,在輸入目的地配置中使用
Log4j 提供的 layout 有以下4種:
1.org.apache.log4j.HTMLLayout (以 HTML 表格形式佈局),
2.org.apache.log4j.PatternLayout (可以靈活地指定佈局模式),
3.org.apache.log4j.SimpleLayout (包含日誌資訊的級別和資訊字串),
4.org.apache.log4j.TTCCLayout (包含日誌產生的時間、執行緒、類別等等資訊)
PatternLayout模式使用最多,其 用類似 C 語言中的 printf 函式的列印格式格式化日誌資訊,列印引數如下:
%m 輸出程式碼中指定的訊息
%p 輸出優先順序,即 DEBUG, INFO , WARN , ERROR , FATAL
%r 輸出自應用啟動到輸出該log 資訊耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的執行緒名
%n 輸出一個回車換行符,Windows 平臺為 “rn” , Unix 平臺為 “n”
%d 輸出日誌時間點的日期或時間
%l 輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數。
Log4j還有其他一些配置:
l 指定輸出到檔案的日誌級別:
l 指定輸出檔案路徑
l 指定輸出日誌中的日期格式
l 指定日誌日誌檔案寫入方式是否為檔案後追加
l 指定日誌編碼
log4j.rootLogger=info,stdout,errorfile,infofile ###格式為[level] ,appender1,appender2,……
log4j.logger.com.markey.messageboard=DEBUG
log4j.logger.com.markey.messageboard.springtest=info
#console config
log4j.appender.stdout=org.apache.log4j.ConsoleAppender ###定義一個控制檯輸出目的地
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%m%n
log4j.appender.stdout.encoding=GB18030
#errorfile config
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender ###定義一個每日日誌輸出目的地
log4j.appender.errorfile.File= c:/logs/app_logs/error.log ###輸出檔案路徑
log4j.appender.errorfile.Threshold=error ###只有error以上級別的日誌才會被輸出
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd ###指定日期格式
log4j.appender.errorfile.Append=true ###指定日誌檔案以追加方式寫入
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=[%-5p]|%d|%C|%L|%m%n
log4j.appender.errorfile.encoding=GB18030 ###指定日誌檔案編碼
#infofile config
log4j.appender.infofile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.infofile.File=c:/logs/app_logs/info.log
log4j.appender.infofile.Threshold=info ###只有error以上級別的日誌才會被輸出
log4j.appender.infofile.DatePattern='.'yyyy-MM-dd
log4j.appender.infofile.Append=true
log4j.appender.infofile.layout=org.apache.log4j.PatternLayout
log4j.appender.infofile.layout.ConversionPattern=[%-5p]|%d|%C|%L|%m%n
log4j.additivity.infofile=false
log4j.appender.infofile.encoding=GB18030
三、載入log4j配置檔案
1、預設載入
將log4j.properites檔案放在src目錄下,log4j框架會自動載入配置檔案並應用。
例如我的配置檔案放在如下位置,則無需其他配置,會被自動載入。
2、手動載入
如果想要使用相對路徑載入配置檔案,則需要使用到log4j-core中的ConfigurationSource類和Configurator類。
例如我把配置檔案放在如下src目錄下程式碼的一級目錄com下:
則需要手動進行配置檔案的載入,主要邏輯就是:根據相對路勁找到配置檔案,使用log4j的配置檔案載入器Configurator來載入。
public class SpringConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
PropertySourcesPlaceholderConfigurer placeholderConfigurer = new PropertySourcesPlaceholderConfigurer();
return placeholderConfigurer;
}
@Bean
public static Logger logger(){
String path="/com/log4j.properties";//定義配置檔案路徑
URL url=SpringConfig.class.getResource(path);//轉化配置檔案路徑
try {
ConfigurationSource source = new ConfigurationSource(
new FileInputStream(new File(url.getPath())),url);//找到配置檔案
Configurator.initialize(null, source);//初始化配置
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Logger logger = Logger.getLogger(SpringConfig.class);
return logger;
}
}