Java知識總結----日誌系統在項目中的應用(五)

       現在的工作過程中,日誌在項目中的角色越來越重要,環境出問題了,遇到bug了,我們都要從日誌查起。所以在項目中記錄日誌就顯得很重要。今天就跟大家簡單聊聊如何在項目中引入日誌。

       現在市面上比較流行的日誌框架有log4j,logback等,大家可能還聽說過sjf4j,當然了還有apache的commons-logging,jdk的java.util.log。那麼slf4j是什麼呢?slf4j,Simple Logging Facade for Java,簡單日誌門面,只是一個接口,沒有具體的實現。它不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。我們可以把各種各樣的日誌實現接入slf4j,在項目中只使用slf4j就可以了。今天我們就來看看如何把log4j接入slf4j中。

      首先我們需要slf4j和log4j的依賴包:log4j的核心包,slf4j的接口包,以及slf4j對log4j的實現包。

<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
</dependency>
		
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.12</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.12</version>
</dependency>
然後,我們需要再項目中創建log4j的配置文件,默認在src下,文件名爲log4j.properties。配置文件示例內容如下:

 ### set log levels ###
log4j.rootLogger = info,stdout,file

### 輸出到控制檯 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 輸出到文件 ###
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File = logs/log.log
log4j.appender.file.Append = true
log4j.appender.file.Threshold = DEBUG ## 
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

log4j.rootLogger:指定了項目的全局配置,第一個參數表示當前工程默認的日誌級別,後面的參數表示日誌的輸出形式。

ConsoleAppender:表示輸出到控制檯,DailyRollingFileAppender:表示每天生成一個日誌文件。

ConversionPattern:表示日誌的輸出格式,其內容代表的具體含義,大家可以參考log4j的其他資料,這裏就不一一講解了。

在項目中的使用也非常簡單,只要在類中定義如下的變量即可:

private static Logger logger = LoggerFactory.getLogger(UserController.class);

注意:Logger和LoggerFactory都是org.slf4j包下的。

在使用的時候直接調用logger.info(),logger.debug().logger.error()即可使用了。


如果我們想把jdk的java.util.log和Apache的commons-logging怎麼接入slf4j呢?只需要引入一下依賴:

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>1.7.12</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jul-to-slf4j</artifactId>
	<version>1.7.12</version>
</dependency>
jcl-over-slf4j:把commmons-logging接入slf4j,jul-to-slf4j:把java.util.log接入slf4j。


下面呢,我們再說說logback。Logback是由log4j創始人設計的又一個開源日誌組件。相比較log4j,logback不僅繼承了log4j的有點,對log4j也進行了非常大的改進。那麼如何在項目中使用logback呢?

首先引入相關的依賴:

<!-- log配置 -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.12</version>
</dependency>

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-core</artifactId>
	<version>1.1.1</version>
</dependency>
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.1.1</version>
</dependency>
        <dependency>  
	<groupId>org.logback-extensions</groupId>  
	<artifactId>logback-ext-spring</artifactId>  
        <version>0.1.1</version>  
</dependency>
 <!-- logback兼容java.util.log -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jul-to-slf4j</artifactId>
	<version>1.7.6</version>
</dependency>
<!-- for common-logging -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>1.7.6</version>
</dependency>
<!-- logback兼容log4j -->
<dependency>
        <groupId>org.slf4j</groupId>
	<artifactId>log4j-over-slf4j</artifactId>
	<version>1.7.6</version>
</dependency>
在上邊的要特別注意的是,我們要把log4j也接入slf4j,並且在項目中不能再引入log4j的jar包和slf4j-log4j-*的jar包,這個在打包的時候,要特別注意。

然後在src下創建logback的配置文件logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
        <property name="log.home" value="/data/application/logs" />
        <!-- 默認輸出文件 -->
	<appender name="DEFAULT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.home}/default/common-default.log.%d{yyyyMMdd}</fileNamePattern>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder charset="UTF-8">
			<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}/%X{userId}/%X{userEmail}/%X{userPhone}] - [%m]%n</pattern>
		</encoder>
	</appender>
	<!-- 默認錯誤文件 -->
	<appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.home}/error/common-error.log.%d{yyyyMMdd}</fileNamePattern>
		</rollingPolicy>
		<encoder charset="UTF-8">
			<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}/%X{userId}/%X{userEmail}/%X{userPhone}] - [%m]%n</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    		<level>ERROR</level>
    	</filter>
	</appender>
	<!-- 性能日誌文件 -->
	<appender name="PERF-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.home}/perf/common-perf.log.%d{yyyyMMdd}</fileNamePattern>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder charset="UTF-8">
			<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}/%X{userId}/%X{userEmail}/%X{userPhone}] - [%m]%n</pattern>
		</encoder>
	</appender>
	<!-- 默認dao日誌文件 -->
	<appender name="DAO-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.home}/dao/common-dao.log.%d{yyyyMMdd}</fileNamePattern>
			<minIndex>1</minIndex>    
	      	<maxIndex>5</maxIndex>
		</rollingPolicy>
		<encoder charset="UTF-8">
			<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}/%X{userId}/%X{userEmail}/%X{userPhone}] - [%m]%n</pattern>
		</encoder>
	</appender>
	<!-- 默認dlock日誌文件 -->
	<appender name="DLOCK-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.home}/dlock/common-dlock.log.%d{yyyyMMdd}</fileNamePattern>
			<minIndex>1</minIndex>    
	      	<maxIndex>5</maxIndex>
		</rollingPolicy>
		<encoder charset="UTF-8">
			<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}/%X{userId}/%X{userEmail}/%X{userPhone}] - [%m]%n</pattern>
		</encoder>
	</appender>
	<!-- service日誌文件 -->
	<appender name="SERVICE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.home}/service/common-service.log.%d{yyyyMMdd}</fileNamePattern>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder charset="UTF-8">
			<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}/%X{userId}/%X{userEmail}/%X{userPhone}] - [%m]%n</pattern>
		</encoder>
	</appender>
	<!-- 業務日誌文件 -->
	<appender name="BUSINESS-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log.home}/business/common-business.log.%d{yyyyMMdd}</fileNamePattern>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder charset="UTF-8">
			<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}/%X{userId}/%X{userEmail}/%X{userPhone}] - [%m]%n</pattern>
		</encoder>
	</appender>
	<!-- 報警日誌 -->
	<appender name="ALARM-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
    		<fileNamePattern>${log.home}/alarm/common-alarm.log.%d{yyyyMMdd}</fileNamePattern> 
    		<maxHistory>30</maxHistory>  
  	</rollingPolicy>                                                                                    
	<encoder charset="UTF-8">
		<pattern>%d [%t] %-5p %c{2} [%X{traceRootId}/%X{userId}/%X{userEmail}/%X{userPhone}] - [%m]%n</pattern>
	</encoder>                                                                                                                                                                                                                                                                                    
	</appender> 
	<appender name="TRACE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
	     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
	   		<fileNamePattern>${log.home}/trace/tracing.log.%d{yyyy-MM-dd-HH}.gz</fileNamePattern> 
	   		<maxHistory>72</maxHistory>  
	 	</rollingPolicy> 	                                                                                         
	<encoder charset="UTF-8">
		<pattern>%d - [%m]%n</pattern>
	</encoder>                                                                                                                                                                                                                                                                                    
	</appender>
	<logger name="java.sql" additivity="false">
		<level value="INFO"/>
		<appender-ref ref="DAO-APPENDER"/>
		<appender-ref ref="ERROR-APPENDER"/>
	</logger>
	
	<logger name="businessLogger" additivity="false">
		<level value="${log.root.level}"/>
		<appender-ref ref="BUSINESS-APPENDER"/>
		<appender-ref ref="ERROR-APPENDER"/>
	</logger>
	<logger name="serviceLogger" additivity="false">
		<level value="${log.root.level}"/>
		<appender-ref ref="SERVICE-APPENDER"/>
	</logger>
	<!-- 屏蔽logger -->
	<logger name="org.springframework" level="WARN" />
	<logger name="org.apache" level="WARN" />
	<logger name="org.mybatis.spring" level="WARN" />
	<!-- 屏蔽jdk日誌 -->
	<logger name="java" level="WARN" />
	<logger name="com.mchange" additivity="false">
		<level value="WARN"/>
		<appender-ref ref="DAO-APPENDER"/>
	</logger>	
	<!-- 屏蔽logger 結束-->
	<root level="${log.root.level}">
		<appender-ref ref="DEFAULT-APPENDER"></appender-ref>
		<appender-ref ref="ALARM-APPENDER"/>
		<appender-ref ref="ERROR-APPENDER"></appender-ref>
	</root>
</configuration> 

logback的配置文件大體上分爲3個部分,第一個部分是appender標籤,裏邊配置了不同的appender日誌存放的位置,日誌格式等信息。第二部分是logger標籤,只要指定不同的日誌使用不同的appender,用於區分,如businessLogger,表示logger的名字爲businessLogger的,日誌輸出到DEFAULT_APPENDER和ERRPR_APPENDER中。第三部分是root標籤,表示項目的全局配置,包括日誌級別和默認的日誌輸出。

最後要在web.xml中進行配置:

  	<context-param>
		<param-name>logbackConfigLocation</param-name>
		<param-value>classpath:logback.xml</param-value>
	</context-param>
	<listener>
		<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
	</listener>

在使用方式上,和log4j是一樣的,使用org.slf4j的兩個類即可。

private static Logger logger = LoggerFactory.getLogger(UserController.class);

發佈了50 篇原創文章 · 獲贊 31 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章