說明
- 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,呵呵,學無止境。