Logback教程:创建maven工程,打印到控制台,输出到文件中

创建普通maven工程

略

修改pom.xml

添加下面依赖:

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

logback.xml 配置文件

在 resources 文件夹下创建 logback.xml 文件,内容如下:

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

<!-- scan="true"开启对配置信息的自动扫描(默认时间为60秒扫描一次) 注:当此文件的配置信息发生变化时,此设置的作用就体现出来了,不需要重启服务 -->
<configuration scan="true">

    <!-- 通过property标签,来存放key-value数据,便于后面的动态获取,提高程序的灵活性 -->
    <property name="log-dir" value="log" />
    <property name="log-name" value="logFile" />

    <!-- 配置appender(对日志的处理方法,可以配置多个) -->
    <!--
        name:自定义,
        class:加载指定类(ch.qos.logback.core.ConsoleAppender类将日志输出到控制台),
        pattern:指定输出的日志格式
    -->
    <appender name="consoleAppender"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L- %msg%n</pattern>
            <!-- 日志编码 -->
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
    </appender>

    <!--
        name:自定义,
        class:加载指定类(ch.qos.logback.core.rolling.RollingFileAppender类会将日志输出到指定的文件中),
        FileNamePattern:文件的全路径名模板 (注:如果最后结尾是gz或者zip等的话,那么会自动打成相应压缩包)
    -->
    <appender name="fileAppender"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 把日志文件输出到:项目启动的目录下的log文件夹(无则自动创建)下 -->
        <!-- 把日志文件输出到:name为log-dir的property标签指定的位置下 -->
        <file>${log-dir}/${log-name}.log</file>
        <!-- rollingPolicy:滚动策略,都会将该天的日志存为指定的格式的文件 -->
        <!-- TimeBasedRollingPolicy策略,每天结束时,会将过时的日志,另存到指定的文件中(无该文件则创建) -->
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 把过时日志改名,改成 fileNamePattern 格式的名字  -->
            <!-- 设置过时时间(单位:<fileNamePattern>标签中%d里最小的时间单位) -->
            <fileNamePattern>${log-dir}/${log-name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 保留7天的日志,之前的日志会删除掉 -->
            <MaxHistory>
                7
            </MaxHistory>
            <!-- 滚动策略可以嵌套;
                     这里嵌套了一个SizeAndTimeBasedFNATP策略,
                        主要目的是: 在每天都会拆分日志的前提下,
                        当该天的日志大于规定大小时,
                        也进行拆分并以【%i】进行区分,i从0开始
            -->
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <!-- 日志输出格式 -->
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L- %msg%n</pattern>
            <!-- 日志编码,windows默认为GBK,要改成 UTF-8 -->
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
    </appender>


    <!-- >>>>>>>>>>>>>>>>>>>>>>>>>配置logger(可以配置多个)>>>>>>>>>>>>>>>>>>>>>>>>> -->
    <!--
        指定[哪个包]下使用[哪个appender],并设置 记录到日志文件中的日志的最下
        级别(低于次级别的日志信息不回输出记录到日志文件中)
        注:日志级别有: trace|debug|info|warn|error|fatal
        注:当有多处指定了要记录的日志的最下日志级别时,走优先级最高的,优先级:
           logback-spring.xml中 > 启动jar包时 > xxx.properties/xxx.yml中
    -->

    <logger name="top.malaoshi.mapper" level="debug" />

    <!--
        root:logger的根节点,appender-ref:确定使用哪个appender
        level:对整体设置级别,该级别不会影响<logger level=""/> 中的级别
        注:如果不指定配置此项,logback不生效
    -->
    <root level="info">
        <appender-ref ref="consoleAppender"  />
        <appender-ref ref="fileAppender" />
    </root>
</configuration>

重点:

  • <root level="info"> 定义的日志级别是 info,大于等于该级别的打印日志,才会执行

  • <logger name="top.malaoshi.mapper" level="debug" /> 包下的日志级别是 debug ,不受<root level="info"> 的控制

配置详见:
https://www.cnblogs.com/ryelqy/p/10314147.html

测试类

Mapper

package top.malaoshi.mapper;

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

public class Mapper {

    static final Logger log= LoggerFactory.getLogger(Mapper.class);

    public static void test(){
        String content="测试:abc 123 中文";
        log.trace("trace级别:: {}-{}",content);
        log.debug("debug级别:: {}-{}",content);
        log.info("info级别:: {}-{}",content);
        log.warn("warn级别:: {}-{}",content);
        log.error("error级别:: {}-{}",content);
    }
}

主启动类

package top.malaoshi;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.malaoshi.mapper.Mapper;

public class Main {
    static final Logger log= LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) {
        String content="hello world!--测试中文";
        log.trace("trace级别:: {}-{}",content);
        log.debug("debug级别:: {}-{}",content);
        log.info("info级别:: {}-{}",content);
        log.warn("warn级别:: {}-{}",content);
        log.error("error级别:: {}-{}",content);

        Mapper.test();
    }
}

显示结果:

16:25:28.281 [main] INFO  top.malaoshi.Main:14- info级别:: hello world!
16:25:28.284 [main] WARN  top.malaoshi.Main:15- warn级别:: hello world!
16:25:28.284 [main] ERROR top.malaoshi.Main:16- error级别:: hello world!
16:25:05.565 [main] DEBUG top.malaoshi.mapper.Mapper:13- debug级别:: abc123
16:25:05.566 [main] INFO  top.malaoshi.mapper.Mapper:14- info级别:: abc123
16:25:05.566 [main] WARN  top.malaoshi.mapper.Mapper:15- warn级别:: abc123
16:25:05.566 [main] ERROR top.malaoshi.mapper.Mapper:16- error级别:: abc123

为什么显示下面3行?

16:25:28.281 [main] INFO  top.malaoshi.Main:14- info级别:: hello world!
16:25:28.284 [main] WARN  top.malaoshi.Main:15- warn级别:: hello world!
16:25:28.284 [main] ERROR top.malaoshi.Main:16- error级别:: hello world!

原因:由于在配置文件中设置了:

<root level="info">
    <appender-ref ref="consoleAppender"  />
    <appender-ref ref="fileAppender" />
</root>

所以,只有 日志打印级别 >= info,才会显示到控制台,写入到文件中

为什么显示下面4行?

下面显示了 debug 级别的日志,不符合 日志打印级别 >= info

16:25:05.565 [main] DEBUG top.malaoshi.mapper.Mapper:13- debug级别:: abc123
16:25:05.566 [main] INFO  top.malaoshi.mapper.Mapper:14- info级别:: abc123
16:25:05.566 [main] WARN  top.malaoshi.mapper.Mapper:15- warn级别:: abc123
16:25:05.566 [main] ERROR top.malaoshi.mapper.Mapper:16- error级别:: abc123

原因:由于在配置文件中设置了:

<logger name="top.malaoshi.mapper" level="debug" />

所以,top.malaoshi.mapper 包及其子包的有效级别是debug,也就是说 日志打印级别 >= debug,就会显示到控制台,写入到文件中

即:不受下面配置的控制:

<root level="info">
    <appender-ref ref="consoleAppender"  />
    <appender-ref ref="fileAppender" />
</root>

原文出处:/show_1IXStZM0rZW.html