一文详细了解logback之日志打印FileAppender

Posted 一个懒惰的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文详细了解logback之日志打印FileAppender相关的知识,希望对你有一定的参考价值。

上文详细的介绍了,然而在大家工作中关于日志打印的使用,经常需要将日志打印到文件中方便后边定位排查问题,打印到文件中还不够,还需要根据时间或者索引回滚日志,为了保证打印日志不影响业务性能可能还需要异步打印日志到文件等,今天这篇文章就详细的来解决和分析如何使用logback来解决这些问题


1,logback之FileAppender打印日志到文件


新增logback.xml如下:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="USER_HOME" value="user-path/" />

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 会优先在USER_HOME目录下生成对应的日志文件,如果USER_HOME属性不存在则会在logs目录下生成日志文件,可以注释USER_HOME property运行看效果 -->
        <file>${USER_HOME:-logs/}my-zhiliao.log</file>
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file :%line] %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="FILE" />
    </root>

</configuration>


新增一个测试类如下:


/**
 * 基于配置文件配置日志打印到文件
 *
 * @author zhangqh
 * @date 2018年8月24日
 */

public class DemoLogReadConfig02 {

    public static void main(String[] args) {

        // 设置系统变量logback.configurationFile值  logback会读取该系统配置 在第一篇文章logback日志初探中有讲到这个
        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "config/logback02.xml");

        Logger logger = LoggerFactory.getLogger(DemoLogReadConfig02.class);
        logger.debug("日志打印到文件........");

    }
}


执行将会在项目目录下新建一个user-path目录并生成一个my-zhiliao.log文件,如下图:


这个例子中所有的日志都会打印到一个日志文件中,有的业务可能想根据项目启动时间生成不同的日志文件,很简单,只需要把logback配置文件改为如下:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 可以指定程序启动生成对应的日志文件 -->
    <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logs/my-timestamp-${bySecond}.log</file>
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file :%line] %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="FILE" />
    </root>

</configuration>


执行将会在项目中生成如下日志文件:



2,logback之RollingFileAppender日志回滚打印


例子1中打印日志到文件只会有一个文件,但随着日志量每天都在增加,这样的一个文件是没法维护和查看的,那就需要用到logback的另外一个RollingFileAppender日志回滚打印了,具体的配置文件如下,配置文件中有详细的说明,这边就不多废话了


<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>logs/my-logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <!-- 
                logs/my-logFile.%d.log 根据时间回滚  默认的格式是根据天回滚 即和logs/my-logFile.%d{yyyy-MM-dd}.log等同
                logs/my-logFile.%d{yyyy-MM}.log 月回滚 每月一个文件
                logs/my-logFile.%d{yyyy-ww}.log 周回滚 每周一个文件
                logs/my-logFile.%d{yyyy-MM-dd_HH}.log 小时回滚 每小时一个文件

                logs/%d{yyyy-MM}/my-logFile.%d.log 每月一个文件夹 按天回滚

            另外:回滚日志支持.gz和.zip压缩回滚日志,具体使用只需后缀给成对应的就可以 如下:
                logs/my-logFile.%d.zip 按天压缩回滚日志

             -->

            <fileNamePattern>logs/my-logFile.%d{yyyy-MM-dd.hhmmss}.log</fileNamePattern>

            <!-- 最多保持30天的历史日志数据   如果30天内的数据大于3GB将会按时间清除老日志文件 -->
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>

        </rollingPolicy>

        <encoder>
            <pattern>
                %date [%thread] [%level] [%logger:%line] - %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="FILE" />
    </root>

</configuration>


这样可以实现每天一个/每小时一个文件等,有的时候因为某些需求不仅需要根据日期生成对应日志文件,可能还需要保证生成的文件大小上限,logback的SizeAndTimeBasedRollingPolicy也可以实现,具体配置如下:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>logs/my-logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- daily rollover -->
            <!-- 
                文件回滚格式类似上个例子配置TimeBasedRollingPolicy
                另如果文件超过设置大小会回滚再生成对应的文件,如下:
                logs/my-logFile.2018-07-24.0.log
                logs/my-logFile.2018-07-24.1.log
             -->

            <fileNamePattern>logs/my-logFile.%d{yyyy-MM-dd.hhmm}.%i.log</fileNamePattern>

            <!-- 最大文件大小 -->
            <maxFileSize>200MB</maxFileSize>  

            <!-- 最多保持30天的历史日志数据   如果30天内的数据大于3GB将会按时间清除老日志文件 -->
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>

        </rollingPolicy>

        <encoder>
            <pattern>
                %date [%thread] [%level] [%logger:%line] - %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="FILE" />
    </root>

</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>logs/my-logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <!-- 
                logs/my-logFile.%d.log 根据时间回滚  默认的格式是根据天回滚 即和logs/my-logFile.%d{yyyy-MM-dd}.log等同
                logs/my-logFile.%d{yyyy-MM}.log 月回滚 每月一个文件
                logs/my-logFile.%d{yyyy-ww}.log 周回滚 每周一个文件
                logs/my-logFile.%d{yyyy-MM-dd_HH}.log 小时回滚 每小时一个文件

                logs/%d{yyyy-MM}/my-logFile.%d.log 每月一个文件夹 按天回滚

            另外:回滚日志支持.gz和.zip压缩回滚日志,具体使用只需后缀给成对应的就可以 如下:
                logs/my-logFile.%d.zip 按天压缩回滚日志

             -->

            <fileNamePattern>logs/my-logFile.%d{yyyy-MM-dd.hhmmss}.log</fileNamePattern>

            <!-- 最多保持30天的历史日志数据   如果30天内的数据大于3GB将会按时间清除老日志文件 -->
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>

        </rollingPolicy>

        <encoder>
            <pattern>
                %date [%thread] [%level] [%logger:%line] - %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="FILE" />
    </root>

</configuration>


突然有一天领导又说我不需要根据时间生成对应的日志文件了,我只需要根据文件大小回滚就可以了,并且支持压缩备份文件,面对这样的需求logback的FixedWindowRollingPolicy同样支持,具体配置请看:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>logs/my-win-logFile.log</file>

        <!-- 日志回滚备份策略  这里最多保留3个文件,文件名也就是通过配置%i从 minIndex到maxIndex之间-->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>logs/my-win-logFile.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>


        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!-- 日志文件回滚大小  即超过1Kb就回滚 -->
            <maxFileSize>1KB</maxFileSize>
        </triggeringPolicy>

        <encoder>
            <pattern>
                %date [%thread] [%level] [%logger:%line] - %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="FILE" />
    </root>

</configuration>


3,logback之AsyncAppender异步日志打印


logback的日志异步打印只是一个事件的调度,它必须依赖于其他的日志打印appender,下边让我们来简单看一个例子如下:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="USER_HOME" value="user-path/" />

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 会优先在USER_HOME目录下生成对应的日志文件,如果USER_HOME属性不存在则会在logs目录下生成日志文件,可以注释USER_HOME property运行看效果 -->
        <file>${USER_HOME:-logs/}my-async.log</file>
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file :%line] %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 默认情况下,当阻塞队列的剩余容量为20%时,它将删除级别跟踪、调试和信息事件,只保留级别警告和错误事件。要保留所有事件,请将discardingThreshold设置为0 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 队列大小 默认大小为256 -->
        <queueSize>10</queueSize>
        <!-- 程序stop的时候最大的等待刷新日志时间,超过时间的日志未刷新完将会被丢弃 -->
        <maxFlushTime>1000</maxFlushTime>
        <!-- false(默认值),appender将阻塞向整个队列追加,而不是丢失消息。如果设置为true, appender就会删除消息,而不会阻塞应用程序 -->
        <neverBlock>false</neverBlock>
        <appender-ref ref="FILE" />
    </appender>

    <root level="debug">
        <appender-ref ref="FILE" />
    </root>

</configuration>


具体的配置大家可以到官网查看:https://logback.qos.ch/manual/appenders.html


今天这篇文章主要介绍了一下logback常用的FileAppender的讲解和演示,更多logback高级功能敬请期待..........



以上是关于一文详细了解logback之日志打印FileAppender的主要内容,如果未能解决你的问题,请参考以下文章

一文带你了解 logback 的一些常用配置

日志框架之Logback的使用与详细配置

logback架构

日志框架之Logback

LogBack 日志级别和日志打印详解

打印日志时 Logback 内部都做了些什么