1. 程式人生 > >Java日誌學習

Java日誌學習

日誌問題總會讓一些小司機們在專案中吃了大虧,剛吃了個大虧,記錄一下促進。

當前的日誌框架有 jdk 自帶的 logging,log4j1、log4j2、logback ,這些框架都自己定製了日誌 API ,並且有相應的實現。本篇主要介log4j與slf4j配合使用。

1、新建Maven工程,配置log4j日誌

1.1 pom檔案引入log4j jar包

<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
</dependency>

1.2 新增log4j.properties檔案,內容如下:

#總局控制日誌級別為debug ,指定控制檯輸出和檔案輸出。
log4j.rootLogger=debug,CONSOLE,INFOFILE
log4j.additivity.org.apache=false


# CONSOLE  org.apache.log4j.ConsoleAppender:控制檯輸出
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
# 日誌級別
log4j.appender.CONSOLE.Threshold=debug
#直接輸出,不進行快取
log4j.appender.CONSOLE.ImmediateFlush=true
log4j.appender.CONSOLE.Target=System.out
#日誌輸出格式
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} (%F:%L) - %m%n

# File
log4j.appender.INFOFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.INFOFILE.Threshold=INFO
log4j.appender.INFOFILE.ImmediateFlush=true
#預設為true,新增到末尾,false在每次啟動時進行覆蓋
log4j.appender.INFOFILE.Append=true
log4j.appender.INFOFILE.File=D:\\logs\\info.log
log4j.appender.INFOFILE.Encoding=UTF-8
#檔名稱的格式
log4j.appender.INFOFILE.DatePattern='.'yyyy-MM-dd'.log' 
#日誌輸出格式
log4j.appender.INFOFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.INFOFILE.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %C.%M(%F:%L) - %m%n

2、配置項詳解:

2.1 Logger日誌的7個級別(優先順序從高到低):

OFF-關閉所有日誌;

FATAL-記錄嚴重的錯誤,並且會導致應用程式退出;

ERROR-記錄嚴重的錯誤,但不會影響程式的執行;

WARN-記錄警告;

INFO-記錄程式中比較有意義的資訊;

DEBUG-記錄程式中的細節資訊;

ALL-記錄所有的日誌;

2.2 log4j.additivity.org.apache:

子Logger 是否繼承 父Logger 的 輸出源(appender) 的標誌位。具體說,預設情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender裡輸出。若是additivity設為false,則子Logger只會在自己的appender裡輸出,而不會在父Logger的appender裡輸出。

2.3 輸出日誌Appender選項:

org.apache.log4j.ConsoleAppender    控制檯


org.apache.log4j.FileAppender   輸出到檔案


org.apache.log4j.RollingFileAppender  輸出到滾動檔案

org.apache.log4j.DailyRollingFileAppender   定期回滾日誌檔案

org.apache.log4j.net.SMTPAppender  傳送日誌到指定郵件

org.apache.log4j.jdbc.JDBCAppender  傳送到資料庫

2.4 日誌的輸出格式:

org.apache.log4j.HTMLLayout   以HTML表格形式佈局

org.apache.log4j.PatternLayout  可以靈活地指定佈局模式

org.apache.log4j.SimpleLayout   包含日誌資訊的級別和資訊字串

org.apache.log4j.TTCCLayout     包含日誌產生的時間、執行緒、類別等等資訊

2.5  log4j.appender.console.layout.ConversionPattern詳解:

%m   輸出程式碼中指定的訊息

  %p   輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL

  %r   輸出自應用啟動到輸出該log資訊耗費的毫秒數

  %c   輸出所屬的類目,通常就是所在類的全名

  %t   輸出產生該日誌事件的執行緒名

  %n   輸出一個回車換行符,Windows平臺為“/r/n”,Unix平臺為“/n”

  %d   輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss ,SSS},輸出類似:2002年10月18日  22 : 10 : 28 , 921 

%l   輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java:10 )

3、新建 LogTest 如下:

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogTest {
	
	static{  
        PropertyConfigurator.configure("src/main/resources/log4j.properties");     
    }
	private static Logger LOGGER = Logger.getLogger(LogTest1.class);
	
	public static void main(String[] args) {
		LOGGER.debug("debug....");
		LOGGER.info("info....");
		LOGGER.warn("warn.....");
		LOGGER.error("error....");
		for (int i = 0; i < 50; i++) {
			LOGGER.error("error...."+i);
		}	
	}
}

觀察控制檯和檔案輸出。發現總局日誌級別與子Logger日誌級別的配合。

4,配合Spring使用

4.1 在pom檔案中引入 spring相關jar包

<!-- spring begin -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>4.3.11.RELEASE</version>
		</dependency>
<!-- spring end -->

4.1 新增 applicationContext.xml; spring-mvc.xml檔案

4.2 配置web.xml引入log4j.xml

<!--springframework 的ContextLoaderListener使用的配置檔案 開始 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!--springframework 的ContextLoaderListener使用的配置檔案 結束 -->


	<!--springframework 的Log4jConfigListener使用的配置檔案 開始 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.properties</param-value>
	</context-param>
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>60000</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<!--springframework 的Log4jConfigListener使用的配置檔案 結束 -->


	<!-- springmvc控制器 配置開始 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	<!-- springmvc控制器 配置開始 -->

4.5 啟動tomcat即可



5、引入 slf4j

簡單日記門面(simple loggingFacade for Java)SLF4J是為各種loging APIs提供一個簡單統一的介面,用來服務於各種各樣的日誌框架, 單獨的slf4j是不能工作的,必須帶上其他具體的日誌實現方案. SLF4J就類似於JDBC訪問資料庫介面一樣,它只是介面,真正的實現是由其它框架元件提供的。使用者能夠在部署的時候配置自己希

望的loging APIs實現。

準確的說,slf4j並不是一種具體的日誌系統,而是一個使用者日誌系統的facade,允許使用者在部署最終應用時方便的變更其日誌系統。

如果在工程中要使用slf4j作為介面,並且要用log4j作為具體實現方案,那麼我們需要做的事情如下:(下面的xxx表示具體版本號)

將slf4j-api-xxx.jar加入工程classpath中;

將slf4j-log4jxx-xxx.jar加入工程classpath中;

將log4j-xxx.jar加入工程classpath中;

將log4j.properties(log4j.xml)檔案加入工程classpath中。

5.1 引入slf4j-api 和  配合log4j使用的jar包

<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.25</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.25</version>
</dependency>

5.2 程式碼使用

import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogTest1 {
	
	static{  
        PropertyConfigurator.configure("src/main/resources/log4j.properties");     
    }
	// org.slf4j.Logger 
	private static Logger LOGGER = LoggerFactory.getLogger(LogTest1.class);
	
	public static void main(String[] args) {
		LOGGER.debug("debug....");
		LOGGER.info("info....");
		LOGGER.warn("warn.....");
		LOGGER.error("error....");
		for (int i = 0; i < 50; i++) {
			// 可用 {} 佔位符
			LOGGER.error("error....  {} ",i);
		}	
	}
}

參考部落格點選開啟連結,介紹了工作原理。