1. 程式人生 > >在spring引入log4j

在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;
	}
}