logback的简单配置与日志实现

一、前言

1.1 创建配置文件

Maven项目中,在recourse目录下创建:logback-test.xmllogback.xml 文件夹

推荐在测试环境中创建 logback-test.xml 文件,生产环境中创建 logback.xml 文件

找不到两个配置文件时,logback框架会按照默认配置在控制台输出日志语句

结构如下:

1.2 引入依赖

logback的依赖包必须是1.1.7或以上版本,否则找不到 SizeAndTimeBasedRollingPolicy

测试使用1.1.6版本启动程序,报错:

<!-- logback框架所需依赖 -->
<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.7</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.7</version>
    </dependency>
</dependencies>

二、配置文件内容与详解

<?xml version="1.0" encoding="UTF-8"?>
<!-- debug=true时,如果配置文件的配置有问题,logback 会检测到这个错误并且在控制台打印它的内部状态,默认为false -->
<configuration debug="false">
    <!-- 定义日志文件的存储地址,推荐使用绝对路径(使用转义字符表示目录层级) -->
    <property name="LOG_HOME" value="D:\ProceduralWorld\idea\MyProgram\MyUtil\src\main\resources\logs" />

    <!-- 定义日志内容的输出格式:%d表示日期(年-月-日 时:分:秒:毫秒)
                        %thread:表示线程名(不一定是执行的方法名)
                        %-5level:级别从左显示5个字符宽度
                        %logger{50}:所在类{显示路径的字符数}
                        %msg:日志消息
                        %n:换行符 -->
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />

    <!-- 控制台输出的配置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 日志输出级别:仅输出INFO级别 -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!-- RollingPolicy 负责发生什么:轮转的方式为移动文件以及对文件改名 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名:以下设置为按天轮转,超过设置的文件大小时生成新文件,新文件的i值最大。
                    i值默认从0开始,否则从指定文件中的最大i值开始 -->
            <!--<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd_HH-mm}.txt</FileNamePattern>-->
            <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/info.log.%i</FileNamePattern>
            <!-- 单个日志文件最大容量 -->
            <MaxFileSize>500KB</MaxFileSize>
            <!-- 日志文件保留天数 -->
            <MaxHistory>60</MaxHistory>
            <!-- 设置最大大小为3GB -->
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 与控制台的输出方式保持一致 -->
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 日志输出级别:仅输出WARN级别 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!-- RollingPolicy 负责发生什么:轮转的方式为移动文件以及对文件改名 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名:以下设置为按天轮转,超过设置的文件大小时生成新文件,新文件的i值最大。
                    i值默认从0开始,否则从指定文件中的最大i值开始 -->
            <!--<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd_HH-mm}.txt</FileNamePattern>-->
            <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/warn.log.%i</FileNamePattern>
            <!-- 单个日志文件最大容量 -->
            <MaxFileSize>500KB</MaxFileSize>
            <!-- 日志文件保留天数 -->
            <MaxHistory>60</MaxHistory>
            <!-- 设置最大大小为3GB -->
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 与控制台的输出方式保持一致 -->
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 日志输出级别:仅输出ERROR级别 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!-- RollingPolicy 负责发生什么:轮转的方式为移动文件以及对文件改名 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名:以下设置为按天轮转,超过设置的文件大小时生成新文件,新文件的i值最大。
                    i值默认从0开始,否则从指定文件中的最大i值开始 -->
            <!--<FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd_HH-mm}.txt</FileNamePattern>-->
            <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/error.log.%i</FileNamePattern>
            <!-- 单个日志文件最大容量 -->
            <MaxFileSize>500KB</MaxFileSize>
            <!-- 日志文件保留天数 -->
            <MaxHistory>60</MaxHistory>
            <!-- 设置最大大小为3GB -->
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 与控制台的输出方式保持一致 -->
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 日志输出级别:仅输出ERROR级别 -->
    <root level="INFO">
        <!-- 输出到控制台: INFO级别以上的日志 -->
        <appender-ref ref="STDOUT" />
        <!-- 输出到文件:INFO级别 -->
        <appender-ref ref="INFO" />
        <!-- 输出到文件:WARN级别 -->
        <appender-ref ref="WARN" />
        <!-- 输出到文件:ERROR级别 -->
        <appender-ref ref="ERROR" />
    </root>
</configuration>

三、代码演示

package com.zhiyin.test;

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

public class MyTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyTest.class);

    public static void main(String[] args) {
        for (int i = 0; i < 50; i++) {
            LOGGER.debug("name: {},age: {}", "知音", 22);  // 按配置将不输出
            LOGGER.info("name: {},age: {}", "知音", 22); 
            LOGGER.warn("name: {},age: {}", "知音", 22);  
            LOGGER.error("name: {},age: {}", "知音", 22);
            if (i > 47) {
                LOGGER.info("--------------------");
                LOGGER.warn("--------------------");
                LOGGER.error("--------------------");
            }
        }
    }

}

四、实现效果

  1. 按照日志的级别,每种级别将写入到不同的级别名.txt文件中

  2. 轮转方式为一天,每一天的日志文件将保存到当前日期的文件目录中

  3. 日志文件大小超过配置的容量大小时,将在当前目录下创建新的日志文件,文件序号加1

日志目录及生成的日志文件如下:

五、有点感言

以往之前,都忽略了项目日志的重要性,其实不想去学也是一方面。但是直到最近在写几个自己的程序和工作项目中大佬架构出的优秀日志框架,才引发了对于项目中使用日志的重要性,而不是简简单单地一句 System.out.println(),日志的好处其实多了去,但是对于目前的我来说,主要以下两点:

  1. 日志文件设置为按照天数来轮转的,并且对日志级别存储不同的文件里进行了处理,还算是比较有序,那么即使是以后也能找到某一天的日志文件来查看或回顾,而不是一句简单的控制台输出语句,输出完看过一遍就完了

  2. 学习,通过不会使用但是想用的欲望来逼迫自己去学,最后总结出一套自己的知识点。即便现在技术博客如此之多,但是总有不全之处和不负责任的博文存在,越看越乱。于是只能找到框架官网或项目的开源地址或中文官网去细细领会,一步步上手,终有结果。

参考链接:

原文地址:https://www.cnblogs.com/zhiyin1209/p/12613497.html