说明
- 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,呵呵,学无止境。