logback的简单使用

2年前 (2022) 程序员胖胖胖虎阿
139 0 0

logback的使用

logback是由log4j的创始人设计的另一个开源日志组件,性能比log4j好

LogBack主要分为三个模块:

logback-core:其他两个模块的基础模块

logback-class:它是log4j的改良版本,完整实现了Slf4j API

logback-access:访问模块与servlet容器继承提供通过Http来访问日志的功能

后续代码都是通过Slf4j日志门面搭建日志系统,代码没有区别,主要是通过修改配置文件和pom.xml依赖

Logback入门

 <dependencies>
        <!--日志门面-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.31</version>
        </dependency>
        <!--logback日志实现-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
<!--            <scope>test</scope>-->
        </dependency>
    </dependencies>
public class LogBackTest {

    /**
     * 日志记录器对象
     */
    private static final Logger LOGGER= LoggerFactory.getLogger(LogBackTest.class);

    @Test
    public void testQuick() throws Exception{
        /*默认级别为info*/
        LOGGER.info("info");
        LOGGER.error("error");
        LOGGER.warn("warn");
        LOGGER.debug("debug");
        LOGGER.trace("trace");
        //使用占位符输出日志信息
        String name="fei";
        Integer age=20;
        LOGGER.info("用户信息为--->姓名:{},年龄:{}",name,age);
    }
}

输出

10:35:06.294 [main] INFO com.xxx.test.LogBackTest - info
10:35:06.297 [main] ERROR com.xxx.test.LogBackTest - error
10:35:06.297 [main] WARN com.xxx.test.LogBackTest - warn
10:35:06.297 [main] DEBUG com.xxx.test.LogBackTest - debug
10:35:06.297 [main] INFO com.xxx.test.LogBackTest - 用户信息为--->姓名:fei,年龄:20

logBack配置文件

logback会依次读取以下配置文件

logback.groovy

logback-test.xml

logback.xml

如果都不存在会采用默认配置
完整日志示例

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
    日志输出格式:
    %-5level
    %d{yyyy-MM-dd HH:mm:ss.SSS}日期
    %c类的完整名称
    %M为method
    %L为行号
    %thread线程名称
    %m或者%msg为信息
    %n换行
-->
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread]
%-5level %msg%n"/>
<!--
Appender: 设置日志信息的去向,常用的有以下几个
ch.qos.logback.core.ConsoleAppender (控制台)
ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺
寸的时候产生一个新文件)
ch.qos.logback.core.FileAppender (文件)
-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.err</target>
<!--日志格式配置-->
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender><loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性
name:
用来指定受此logger约束的某一个包或者具体的某一个类。
level:
用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和
OFF,
如果未设置此属性,那么当前logger将会继承上级的级别。
additivity:
是否向上级loger传递打印信息。默认是true<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个
logger
-->
<!--
也是<logger>元素,但是它是根logger。默认debug
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL
和 OFF,
<root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个
logger。
-->
<root level="ALL">
<appender-ref ref="console"/>
</root>
</configuration>
我们在Resource下创建logback.xml日志文件
   <?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
    
        <!--
            配置集中管理的属性
            直接使用该属性的value value格式":${name}
        -->
        <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
        <!--
            日志输出格式:
            %-5level
            %d{yyyy-MM-dd HH:mm:ss.SSS}日期
            %c类的完整名称
            %M为method
            %L为行号
            %thread线程名称
            %m或者%msg为信息
            %n换行
        -->
    
        <!--控制日志输出位置的Appender-->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <!--控制台输出的对象 默认System.out 改为System.err 就变为了红色字体-->
            <target>System.err</target>
            <!--日志消息格式的配置-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${pattern}</pattern>
            </encoder>
        </appender>
        <root level="ALL">
            <appender-ref ref="console"></appender-ref>
        </root>
    </configuration>

FileAppender

日志输出到文件

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

    <!--
        配置集中管理的属性
        直接使用该属性的value value格式":${name}
    -->
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
    <!-- 日志文件存放目录 -->
    <property name="log_dir" value="d:/lianxi"></property>
    <!--
        日志输出格式:
        %-5level
        %d{yyyy-MM-dd HH:mm:ss.SSS}日期
        %c类的完整名称
        %M为method
        %L为行号
        %thread线程名称
        %m或者%msg为信息
        %n换行
    -->

    <!--控制日志输出位置的Appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制台输出的对象 默认System.out 改为System.err 就变为了红色字体-->
        <target>System.err</target>
        <!--日志消息格式的配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    <!--日志文件输出appender对象-->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!--日志格式配置-->
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--日志输出路径-->
        <file>${log_dir}/logback.log</file>
    </appender>
    <root level="ALL">
        <appender-ref ref="console"></appender-ref>
        <appender-ref ref="file"></appender-ref>
    </root>
</configuration>

日志输出到Html

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

    <!--
        配置集中管理的属性
        直接使用该属性的value value格式":${name}
    -->
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
    <!-- 日志文件存放目录 -->
    <property name="log_dir" value="d:/lianxi"></property>
    <!--
        日志输出格式:
        %-5level
        %d{yyyy-MM-dd HH:mm:ss.SSS}日期
        %c类的完整名称
        %M为method
        %L为行号
        %thread线程名称
        %m或者%msg为信息
        %n换行
    -->

    <!--html格式日志文件输出appender对象-->
    <appender name="html" class="ch.qos.logback.core.FileAppender">
        <!--html日志格式配置-->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
           <layout class="ch.qos.logback.classic.html.HTMLLayout">
               <pattern>${pattern}</pattern>
           </layout>
        </encoder>
        <!--日志输出路径-->
        <file>${log_dir}/logback.html</file>
    </appender>
    <root level="ALL">
        <appender-ref ref="html"></appender-ref>
    </root>
</configuration>

日志拆分和归档Appender

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

    <!--
        配置集中管理的属性
        直接使用该属性的value value格式":${name}
    -->
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
    <!-- 日志文件存放目录 -->
    <property name="log_dir" value="d:/lianxi"></property>
    <!--
        日志输出格式:
        %-5level
        %d{yyyy-MM-dd HH:mm:ss.SSS}日期
        %c类的完整名称
        %M为method
        %L为行号
        %thread线程名称
        %m或者%msg为信息
        %n换行
    -->

    <!--控制日志输出位置的Appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制台输出的对象 默认System.out 改为System.err 就变为了红色字体-->
        <target>System.err</target>
        <!--日志消息格式的配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    <!--日志拆分和归档Appender-->
    <appender name="rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--日志输出路径-->
        <file>${log_dir}/roll_logback.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--指定具体实现规则-->
            <!--按照时间和压缩格式声明拆分的文件名-->
<!--            <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH-mm-ss}.log%i.gz</fileNamePattern>-->
            <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH}.log%i.gz</fileNamePattern>
            <!--按照文件大小拆分-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
    </appender>
    <root level="ALL">
        <appender-ref ref="console"></appender-ref>
        <appender-ref ref="rolling"></appender-ref>
    </root>
</configuration>

日志级别过滤

只有大于等于设定级别会输出

  <appender name="rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--日志输出路径-->
        <file>${log_dir}/roll_logback.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--指定具体实现规则-->
            <!--按照时间和压缩格式声明拆分的文件名-->
<!--            <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH-mm-ss}.log%i.gz</fileNamePattern>-->
            <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH}.log%i.gz</fileNamePattern>
            <!--按照文件大小拆分-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--日志过滤规则-->
            <level>INFO</level>
            <!--超过当前级别放行-->
            <onMath>ACCEPT</onMath>
            <!--小于当前级别拦截-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

异步日志

我们当前的日志与代码都是使用主线程执行的 记录完日志才会往下执行 所以我们引入了异步日志

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

    <!--
        配置集中管理的属性
        直接使用该属性的value value格式":${name}
    -->
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
    <!-- 日志文件存放目录 -->
    <property name="log_dir" value="d:/lianxi"></property>
    <!--
        日志输出格式:
        %-5level
        %d{yyyy-MM-dd HH:mm:ss.SSS}日期
        %c类的完整名称
        %M为method
        %L为行号
        %thread线程名称
        %m或者%msg为信息
        %n换行
    -->
    <!--控制日志输出位置的Appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制台输出的对象 默认System.out 改为System.err 就变为了红色字体-->
        <target>System.err</target>
        <!--日志消息格式的配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    <!--日志拆分和归档Appender-->
    <appender name="rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--日志输出路径-->
        <file>${log_dir}/roll_logback.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--指定具体实现规则-->
            <!--按照时间和压缩格式声明拆分的文件名-->
<!--            <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH-mm-ss}.log%i.gz</fileNamePattern>-->
            <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd-HH}.log%i.gz</fileNamePattern>
            <!--按照文件大小拆分-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--日志过滤规则-->
            <level>INFO</level>
            <!--超过当前级别放行-->
            <onMath>ACCEPT</onMath>
            <!--小于当前级别拦截-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
        <!--指定某个具体的Appender实现-->
        <appender-ref ref="rolling"/>
    </appender>
    <root level="ALL">
        <appender-ref ref="async"></appender-ref>
    </root>
</configuration>

自定义logger

 <!--【强制】避免重复打印日志,浪费磁盘空间,务必在日志配置文件中设置 additivity=false-->
    <!--自定义logger additivity自定义logger对象是否继承rootLogger-->
 <logger name="com.rpf" level="info" additivity="false">
        <appender-ref ref="console"></appender-ref>
  </logger>

此时日志只会输出到控制台不会输出到文件中

版权声明:程序员胖胖胖虎阿 发表于 2022年11月24日 上午11:16。
转载请注明:logback的简单使用 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...