一)logback日志组件

简介:logback是一款开源日志组件,属于Log4j的升级版本,现在项目组使用的次数越来越多。

 

优点:

1、初始化加载内存小

2、配置修改时,自动重新加载配置文件,扫描过程快且安全

 

组成模块:logback-core、logback-classic、logback-access

logback-core提供了logback的核心功能,是另外两个组件的基础;

logback-classic模块实现了SLF4J API;

logback-access模块与Servlet容器集成提供Http来访问日志的功能。

 

使用方式:在maven中pom.xml导入jar

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.11</version>
</dependency>
	
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.11</version>
</dependency>
	
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.1.11</version>
</dependency>

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

 

logback日志扫描顺序:(logback支持后缀名称为groovyxml两种配置方式

第一步:先在System Property系统配置文件中查找是否有logback.configurationFile对应的value

第二步:在classpath下寻找是否有logback.groovy文件

第三步:在classpath下寻找是否有logback-test.xml文件

第四步:在classpath下寻找是否有logback.xml文件

 

以上4步,只需要符合其中一步逻辑即可,具体代码实现可见ch.qos.logback.classic.util.ContextInitializer类的findURLOfDefaultConfigurationFile方法。

如果以上4步都步符合,logback会默认构造一个控制台输出日志,并会有默认的日志格式。

 

初始化方式:

第一种:通过指定名称初始化

private final static Logger LOGGER = LoggerFactory.getLogger("HelloLogback");

 

第二种:通过Class的方式初始化

private final static Logger LOGGER = LoggerFactory.getLogger(HelloLogback.class);

 

日志测试工具类:

package com.oysept.logback;

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

public class HelloLogback {
	
    private final static Logger LOGGER = LoggerFactory.getLogger(HelloLogback.class);
	
    public static void main(String[] args) {
        LOGGER.debug("this is debug message");
        LOGGER.info("this is info message");
        LOGGER.warn("this is warning message");
        LOGGER.error("this is error message");
        LOGGER.warn("this is  login message");
    }
}

 

二)logback日志控制台输出

在logback.xml中添加控制台输出日志配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60" debug="false">

    <!-- 自定义属性 -->
    <property name="pattern" value="%X{thread} [%date{yyyy-MM-dd HH:mm:ss.SSS}] %level %logger{36} %line - %msg%n"/>

    <!--控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 设置日志输出格式 -->
            <pattern>${pattern}</pattern>
			
            <!-- 设置输出字符集编码 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
	
    <!-- 根root looger -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

 

logback.xml配置文件详解

1、configuration:配置根节点

<!-- scan:程序运行时配置文件被修改,是否重新加载。true=重新加载;false=不重新加载;默认为true; -->
<!-- scanPeriod:监测配置文件被修改的时间间隔,scan属性必须设置为true才可生效;默认为1分钟,默认单位是毫秒; -->
<!-- debug:是否打印logback程序运行的日志信息。true=打印;false=不打印;默认为false; -->

<configuration scan="true" scanPeriod="60" debug="false">
</configuration>

 

2、property:属性变量

<!-- 自定义属性、相当于全局变量 -->
<!-- name :变量的名称,可以随意起名,建议简单明了; -->
<!-- value:变量的值; -->
<!-- 在配置文件中,我们可以使用 ${pattern}方式,将变量引入到其他节点中去。如果有多处使用相同的内容,便可使用属性变量的方式进行统一,减少很多不必要的代码; -->

<property name="pattern" value="%X{thread} [%date{yyyy-MM-dd HH:mm:ss.SSS}] %level %logger{36} %line - %msg%n"/>

 

3、appender:日志输出的目的地

<!--appender标签中的name和class为必填属性 -->
<!--name :节点的名称 -->
<!--class:全限定类名,ch.qos.logback.core.ConsoleAppender表示控制台输出 -->

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <!-- 设置日志输出格式 -->
        <pattern>${pattern}</pattern>
			
        <!-- 设置输出字符集编码 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>

 

4、root:根日志对象

<!-- root: 但它位于logger体系中的最顶层。当一个类中的logger对象进行打印请求时,如果配置文件中没有为该类单独指定日志对象,那么都会交给root根日志对象来完成; -->
<!-- root: 节点中只有一个level属性,还可以单独指定日志输除目的地<apender-ref> -->

<root level="DEBUG">
    <appender-ref ref="STDOUT" />
</root>

 

三)logback日志磁盘文件输出

在logback.xml中添加磁盘输出日志配置(该方式用的较少)

缺点:该方式会导致日志都在一个文件中,文件会越来越大,最后可能会打不开,不好查看日志。

 

ch.qos.logback.core.FileAppender磁盘文件输出日志:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60" debug="false">
	
    <!-- 自定义变量 -->
    <property name="appName" value="ouyangjun-logback" />
	
    <!-- 日志文件名称, 可随便命名 -->
    <property name="baseFile" value="ouyangjun-logback" />
	
    <!-- 项目所在盘符的根目录下, 也可以指定具体盘符位置, 如:E:\\app\\ouyangjun-logback\\logs -->
    <property name="rootPath" value="/app/ouyangjun-logback/logs" />
    
    <!-- 日志输出格式 -->
    <property name="pattern" value="%X{thread} [%date{yyyy-MM-dd HH:mm:ss.SSS}] %level %logger{36} %line - %msg%n"/>
    
    <!-- 设置上下文名称 -->
    <contextName>${appName}</contextName>

    <!-- 磁盘文件输出日志 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <File>${rootPath}/${baseFile}.log</File>
        <append>true</append>  
        <prudent>false</prudent>
		
        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
            
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

 

四)logback日志滚动输出(磁盘)

在logback.xml中添加磁盘输出日志配置,当设置生效时,按照具体的设置生成日志文件。如当日志文件超过一定大小时,重新生成一个新日志文件存储。

 

优化点:由于每次输出日志到磁盘,都会进行IO流操作,所以可以结合异步输出日志的方式实现功能,当日志到一定量的时候,再一次写入到磁盘文件中。

 

ch.qos.logback.core.rolling.RollingFileAppender磁盘文件滚动输出日志

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60" debug="false">
	
    <!-- 自定义变量 -->
    <property name="appName" value="ouyangjun-logback" />
	
    <!-- 日志文件名称, 可随便命名 -->
    <property name="baseFile" value="ouyangjun-logback" />
	
    <!-- 项目所在盘符的根目录下, 也可以指定具体盘符位置, 如:E:\\app\\ouyangjun-logback\\logs -->
    <property name="rootPath" value="/app/ouyangjun-logback/logs" />
    
    <!-- 日志输出格式 -->
    <property name="pattern" value="%X{thread} [%date{yyyy-MM-dd HH:mm:ss.SSS}] %level %logger{36} %line - %msg%n"/>
    
    <!-- 设置上下文名称 -->
    <contextName>${appName}</contextName>

    <!-- 磁盘文件滚动输出日志 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${rootPath}/${baseFile}.log</File>
        <append>true</append>  
        <prudent>false</prudent>
    	
        <!-- 磁盘日志文件rolling策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${rootPath}/${baseFile}_%d{yyyy-MM-dd}.log.gz</FileNamePattern>
            
            <!-- 日志在磁盘上保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
            
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <!-- 把日志异步输出到磁盘文件中,避免每次都进行磁盘IO操作 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>10000</queueSize>
        <appender-ref ref="FILE" />
    </appender>

    <root level="INFO">
        <!-- <appender-ref ref="FILE" /> -->
        
        <appender-ref ref="ASYNC" />
    </root>
</configuration>

 

把日志异步输出到磁盘文件中,避免每次都进行磁盘IO操作

<!-- 把日志异步输出到磁盘文件中,避免每次都进行磁盘IO操作 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <discardingThreshold>0</discardingThreshold>
    <queueSize>10000</queueSize>
    <appender-ref ref="FILE" />
</appender>

<!-- queueSize:指的是BlockingQueue的队列容量大小,默认为256个,程序测试时,可设置小一点,方便监控日志 -->
<!-- 
discardingThreshold:如果BlockingQueue中还剩余20%的容量,那么程序会丢弃TRACE、DEBUG和INFO级别的日志打印事件event,只保留WARN和ERROR级别的。
为了保留所有的日志打印事件,可以将该值设置为0
-->
<!-- appender下只能有一个appender-ref子节点 -->

 

日志rollingPolicy滚动策略详解

第一种:根据时间制定日志文件的滚动策略,如:按天、按小时、按分钟生成日志文件

ch.qos.logback.core.rolling.TimeBasedRollingPolicy

<!-- 磁盘日志文件rolling策略,按天生成日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>${rootPath}/${baseFile}_%d{yyyy-MM-dd}.log.gz</FileNamePattern>
            
    <!-- 日志在磁盘上保留天数 -->
    <maxHistory>30</maxHistory>
</rollingPolicy>

 

第二种:表示如果日志文件大小超过指定范围时,会根据文件名拆分成多个文件;

ch.qos.logback.core.rolling.FixedWindowRollingPolicy

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <fileNamePattern>${baseFile}_.%i.log.gz</fileNamePattern>
    <minIndex>1</minIndex>
    <maxIndex>3</maxIndex>
</rollingPolicy>

 

第三种:rollingPolicy一样平级的策略triggeringPolicy,表示根据日志文件大小,超过制定大小会触发日志滚动;

ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy

<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <maxFileSize>5MB</maxFileSize>
</triggeringPolicy>

 

五)实战中logback.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60" debug="false">
    
    <!-- 自定义变量 -->
    <property name="appName" value="ouyangjun-logback" />
    
    <!-- 日志文件名称, 可随便命名 -->
    <property name="baseFile" value="ouyangjun-logback" />
    
    <!-- 项目所在盘符的根目录下, 也可以指定具体盘符位置, 如:E:\\app\\ouyangjun-logback\\logs -->
    <property name="rootPath" value="/app/ouyangjun-logback/logs" />
    
    <!-- 日志输出格式 -->
    <property name="pattern" value="%X{thread} [%date{yyyy-MM-dd HH:mm:ss.SSS}] %level %logger{36} %line - %msg%n"/>
    
    <!-- 设置上下文名称 -->
    <contextName>${appName}</contextName>
	
    <!-- 把日志在控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
            
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 磁盘文件输出日志 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${rootPath}/${baseFile}.log</File>
        <append>true</append>  
        <prudent>false</prudent>
    	
        <!-- 日志文件rolling策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${rootPath}/${baseFile}_%d{yyyy-MM-dd}.log.gz</FileNamePattern>
            <!-- 日志保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
            
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 文件输出日志 (文件大小策略进行文件输出,每小时产生一个日志文件给异常监控平台进行分析) -->
    <appender name="ERRORFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${rootPath}/${baseFile}_error.log</File>
        <append>true</append>  
        <prudent>false</prudent>
    	
        <!-- 日志文件rolling策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${rootPath}/${baseFile}_error_%d{yyyy-MM-dd}.log.gz</FileNamePattern>
            
            <!-- 日志在磁盘上保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        
        <!-- 过滤器,只ACCEPT接收ERROR级别的日志,其它日志级别都DENY拒绝 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        
        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
            
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
	
    <!-- 把日志异步输出到磁盘文件中,避免每次都进行磁盘IO操作 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>10000</queueSize>
        <appender-ref ref="FILE" />
    </appender>
	
    <root level="INFO">
        <!-- 生产环境,可以不需要再控制台输出日志 -->
        <appender-ref ref="STDOUT" />
        
        <!-- 异步输出日志到磁盘文件中 -->
        <appender-ref ref="ASYNC" />
        
        <!-- 错误文件,需要实时输出到磁盘中 -->
        <appender-ref ref="ERRORFILE" />
    </root>
</configuration>

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐