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

猜你喜欢

转载自blog.csdn.net/qq_22973811/article/details/114136016