java logback日誌系統引入、配置、優化說明

說明

  • logback是log4j作者 Ceki Gülcü的又一力作,相比log4j在性能與功能上有了很大提升,支持輸出日誌文件按時間或存儲大小或時間加存儲大小條件,滿足自動刪除日誌,可設置獨立輸出指定目錄下日誌到指定文件,可設置全項目某級別日誌輸出到指定文件。
  • logback是我多年日常開發主要日誌系統,個人非常喜歡,下面將分別日誌接口self4j和commons-logging使用方法,推薦使用self4j,他也是Ceki Gülcü的作品。

使用

導包

  • 所有演示均已maven項目爲基礎。

logback

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.2.3</version>
</dependency>  

slf4j 日誌接口(推薦)

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

commons-logging 日誌接口

<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>

janino 可選

  • 小型java編譯器,目的使logback配置文件支持參數。
<dependency>
	<groupId>org.codehaus.janino</groupId>
	<artifactId>janino</artifactId>
    <version>3.1.2</version>
	<scope>provided</scope> <!-- 僅運行時使用 -->
</dependency>

配置文件

  • 如下配置文件指定了三種方式,控制檯、info和error,其中,error輸出再日誌目錄下error目錄中,日誌文件保存最多20天,單個文件最大100M,日誌佔用文件夾存儲最大20G。
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false">
	<property name="PROJECT_NAME" value="logs" />
	
	<!--方式一:設置日誌根目錄,參數LOG_HOME地址,該方法是爲LOG_HOME添加默認值,需要janino支持-->
	<if condition='property("LOG_HOME")==""'>
		<then>
			<property name="LOG_HOME" value="${user.dir}" />
		</then>
	</if>
	<!--方式二:設置日誌根目錄,直接指定-->
	<!--<property name="LOG_HOME" value="/testLog/apache-tomcat-9.0.21" />-->
	
	<property name="outformat" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}[%file:%line]:%msg%n"/>
  	
 	<!-- <logger name="org.hibernate" level="WARN"/> -->
 	<logger name="ch.qos.logback" level="WARN"/>
 	<logger name="org.apache.ftpserver" level="ERROR"/>
 	<logger name="io.netty" level="ERROR"/>
 	<logger name="oshi" level="ERROR"/>
 	
    <!--控制檯輸出 -->  
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <pattern>
            	${outformat}
            </pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>  
        </encoder>  
    </appender>  
    
    <!-- 文件日誌輸出 -->  
    <appender name="file"  class="ch.qos.logback.core.rolling.RollingFileAppender" >
    	<file>${LOG_HOME}/${PROJECT_NAME}/info.log</file> 
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">  
            <FileNamePattern>${LOG_HOME}/${PROJECT_NAME}/info.%d{yyyy-MM-dd}-%i.log </FileNamePattern>  
            <MaxHistory>20</MaxHistory>
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>  
     
        <!-- 只輸出level級別及以上日誌 -->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
        <encoder>  
            <pattern>${outformat}</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset> 
        </encoder>  
    </appender>  
    
    <!-- 文件日誌輸出 -->  
    <appender name="file_error"  class="ch.qos.logback.core.rolling.RollingFileAppender" >
    	<file>${LOG_HOME}/${PROJECT_NAME}/error/error.log</file> 
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">  
            <FileNamePattern>${LOG_HOME}/${PROJECT_NAME}/error/error.%d{yyyy-MM-dd}-%i.log </FileNamePattern>  
            <MaxHistory>20</MaxHistory>
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>  
        
        <!-- 只輸出level級別的日誌 -->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>ERROR</level>
		</filter>
        <encoder>  
            <pattern>${outformat}</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset> 
        </encoder>
    </appender>
    
    <!-- 日誌級別 -->  
    <root level="INFO">  
        <appender-ref ref="console" />
        <appender-ref ref="file" />   
        <appender-ref ref="file_error" />  
    </root>  
  
</configuration> 

配置加載

  • 有時候,項目需要將日誌配置文件與項目獨立存放,方便動態修改,這時候,需要項目加載指定目錄下日誌配置文件,這裏介紹java代碼和啓動參數加載兩種。

java代碼

import java.io.File;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.util.StatusPrinter;

/**
 * logback加載配置文件
 * 
 * @author wangzh
 * @date 2018年7月30日 下午2:08:10
 */
public final class LogbackInit {
	
	private static Logger log= LoggerFactory.getLogger(LogbackInit.class);
	
	 /**
     * 設置logback.xml配置文件並加載
     *
     * @param configFilepathName 配置文件路徑名
     */
    public static void initLogback(String configFilepathName) {
        File file = new File(configFilepathName);
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator joranConfigurator = new JoranConfigurator();
        joranConfigurator.setContext(loggerContext);
        loggerContext.reset();
        try {
            joranConfigurator.doConfigure(file);
        } catch (Exception e) {
        	log.error("Load logback config file error. Message: "+ e.getMessage(),e);
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
    }
}

啓動參數

-Dlogback.configurationFile=/ocr-platform/config/logback.xml

項目引入

  • 完成導包、配置和配置引入,最後介紹項目使用,下面分別演示slf4j和commons-logging。
//commons-long
private final static Log logger = LogFactory.getLog(App.class);  
log.info(e,e)

//slf4j
private final static Logger log= LoggerFactory.getLogger(App.class);
log.info(e.toString(),e)

總結

  • 日誌系統是項目不可缺失的部分,完善的日誌系統方便獲取項目狀態信息追查bug,建議項目開發者熟練掌握。
  • 實際使用中,遇到部分引用庫默認日誌系統非logback,使用log4j或log4j2,或日誌接口使用commons-logging,呵呵,學無止境。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章