java日志框架学习--logback和log4j2--下

大忽悠爱忽悠      2022-05-27     757

关键词:

Java日志框架学习--LogBack和Log4j2--下


Logback

Logback是由log4j创始人设计的又一个开源日志组件。

Logback当前分成三个模块:logback-core,logback- classic和logback-access。

  • logback-core是其它两个模块的基础模块。
  • logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API。使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
  • logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能

Logback中的组件

  • Logger: 日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。
  • Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
  • Layout: 负责把事件转换成字符串,格式化的日志信息的输出。
  • 在Logback中Layout对象被封装在encoder中。
  • 也就是说我们未来使用的encoder其实就是Layout

Logback配置文件

Logback提供了3种配置文件

  • logback.groovy
  • logback-test.xml
  • logback.xml

如果都不存在则采用默认的配置


日志输出格式

日志输出格式:

  • %-10level 级别 案例为设置10个字符,左对齐
  • %dyyyy-MM-dd HH:mm:ss.SSS 日期
  • %c 当前类全限定名
  • %M 当前执行日志的方法
  • %L 行号
  • %thread 线程名称
  • %m或者%msg 信息
  • %n 换行

使用演示

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

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


配置文件

输出到控制台

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
   <!--
    配置文件通用属性
    可以在当前配置文件中通过$name的形式,取得value值
    我们在此指定通用的日志输出格式
    日志输出格式:
    %-10level  级别 案例为设置10个字符,左对齐
    %dyyyy-MM-dd HH:mm:ss.SSS 日期
    %c  当前类全限定名
    %M  当前执行日志的方法
    %L  行号
    %thread 线程名称
    %m或者%msg    信息
    %n  换行
         -->

   <property name="pattern" value="[%-5level]  %dyyyy-MM-dd HH:mm:ss:SSS %c %M %L %thread %m%n"></property>

   <!--
      配置控制台输出的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 Logger
         level: 日志级别
        -->
     <root level="all">
         <appender-ref ref="console"/>
     </root>
</configuration>


输出到控制台和文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--
     配置文件通用属性
     可以在当前配置文件中通过$name的形式,取得value值
     我们在此指定通用的日志输出格式
     日志输出格式:
     %-10level  级别 案例为设置10个字符,左对齐
     %dyyyy-MM-dd HH:mm:ss.SSS 日期
     %c  当前类全限定名
     %M  当前执行日志的方法
     %L  行号
     %thread 线程名称
     %m或者%msg    信息
     %n  换行
          -->

    <property name="pattern" value="[%-5level]  %dyyyy-MM-dd HH:mm:ss:SSS %c %M %L %thread %m%n"></property>

    <!--  配置文件的输出路径   -->
    <property name="dir" value="logback.log"></property>


    <!-- 配置文件输出的appender   -->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!-- 引入文件位置   -->
        <file>$dir</file>

        <!--
          配置日志输出格式
       -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--  格式引用通用属性配置  -->
            <pattern>$pattern</pattern>
        </encoder>

    </appender>

    <!--
       配置控制台输出的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 Logger
        level: 日志级别
       -->
    <root level="all">
        <appender-ref ref="file"/>
        <appender-ref ref="console"/>
    </root>
</configuration>



因为符合OGNL规范,因此配置文件中可以配置的属性,大多可以通过翻看对应的类源码,通过set方法或者属性名推测出来


输出到控制台,文件和html

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--
     配置文件通用属性
     可以在当前配置文件中通过$name的形式,取得value值
     我们在此指定通用的日志输出格式
     日志输出格式:
     %-10level  级别 案例为设置10个字符,左对齐
     %dyyyy-MM-dd HH:mm:ss.SSS 日期
     %c  当前类全限定名
     %M  当前执行日志的方法
     %L  行号
     %thread 线程名称
     %m或者%msg    信息
     %n  换行
          -->

    <property name="pattern" value="[%-5level]  %dyyyy-MM-dd HH:mm:ss:SSS %c %M %L %thread %m%n"></property>

    <!--  配置文件的输出路径   -->
    <property name="fileDir" value="logback.log"></property>

    <!--  配置输出为html形式的appender   -->
    <appender name="html" class="ch.qos.logback.core.FileAppender">
         <!-- 输出的文件位置 -->
        <file>logback.html</file>
         <!--  设置layout为输出html形式的  -->
         <layout class="ch.qos.logback.classic.html.HTMLLayout">
             <pattern>
                 $pattern
             </pattern>
         </layout>
    </appender>

    <!-- 配置文件输出的appender   -->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!-- 引入文件位置   -->
        <file>$fileDir</file>

        <!--
          配置日志输出格式
       -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--  格式引用通用属性配置  -->
            <pattern>$pattern</pattern>
        </encoder>

    </appender>

    <!--
       配置控制台输出的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 Logger
        level: 日志级别
       -->
    <root level="all">
        <appender-ref ref="file"/>
        <appender-ref ref="console"/>
        <appender-ref ref="html"/>
    </root>
</configuration>



html展示效果如果:


日志拆分

日志拆分使用的是RollingFileAppender,它继承了FileAppender,因此父类中能配置的属性,这里都可以配置,我们只需要关注当前类新增的查日志拆分策略属性即可。

在当前RollingFileAppender中也为我们提供了两个设置日志拆分策略的set方法:


先看一波如何配置,再来分析源码:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--
     配置文件通用属性
     可以在当前配置文件中通过$name的形式,取得value值
     我们在此指定通用的日志输出格式
     日志输出格式:
     %-10level  级别 案例为设置10个字符,左对齐
     %dyyyy-MM-dd HH:mm:ss.SSS 日期
     %c  当前类全限定名
     %M  当前执行日志的方法
     %L  行号
     %thread 线程名称
     %m或者%msg    信息
     %n  换行
          -->

    <property name="pattern" value="[%-5level]  %dyyyy-MM-dd HH:mm:ss:SSS %c %M %L %thread %m%n"></property>

    <!--  配置文件的输出路径   -->
    <property name="fileDir" value="logback.log"></property>

    <!--  配置输出为html形式的appender   -->
    <appender name="html" class="ch.qos.logback.core.FileAppender">
         <!-- 输出的文件位置 -->
        <file>logback.html</file>
         <!--  设置layout为输出html形式的  -->
         <layout class="ch.qos.logback.classic.html.HTMLLayout">
             <pattern>
                 $pattern
             </pattern>
         </layout>
    </appender>

    <!-- 配置文件输出的appender   -->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!-- 引入文件位置   -->
        <file>$fileDir</file>

        <!--
          配置日志输出格式
       -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--  格式引用通用属性配置  -->
            <pattern>$pattern</pattern>
        </encoder>

    </appender>

    <!--
       配置控制台输出的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="roll" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!--  设置输出格式    -->
         <layout class="ch.qos.logback.classic.PatternLayout">
             <pattern>$pattern</pattern>
         </layout>
         <!--  设置未归档的日志文件输出位置   -->
         <file>roll_logback.log</file>

          <!--  指定拆分规则  -->
          <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
               <!--   按照时间和压缩格式声明文件名,压缩格式gz    -->
              <fileNamePattern>roll.%dyyyy-MM-dd.log%i.gz</fileNamePattern>

              <!--   按照文件大小来进行拆分 -->
              <maxFileSize>1KB</maxFileSize>
          </rollingPolicy>
    </appender>

    <!--
       日志记录器
       配置Root Logger
        level: 日志级别
       -->
    <root level="all">
        <appender-ref ref="roll"/>
    </root>
</configuration>


下面分析一波,这里源码流程从subAppend函数讲起,因为每一条日志的输出,都需要交给至少一个appender,完成日志的输出,而交给appender后,一定会来到appender的subAppend这里,各位可以自行debug源码流程

这里拿RollingFileAppender进行讲解:

    @Override
    protected void subAppend(E event) 
        //日志真正写入前,现需要判断是否应该触发当前日志文件的归档行为
        //因为可能当前写入数据超过了日志文件大小的限制,那么当前日志就应该归档,再创建一个新的日志文件
        // The roll-over check must precede actual writing. This is the
        // only correct behavior for time driven triggers.
      
        // We need to synchronize on triggeringPolicy so that only one rollover
        // occurs at a time
        //加锁确保一次只有一个线程进行日志roll操作
        synchronized (triggeringPolicy) 
        //triggeringPolicy负责判断是否需要进行roll over
            if (triggeringPolicy.isTriggeringEvent(currentlyActiveFile, event)) 
                rollover();
            
        
        //调用父类方法真正执行写入操作 
        super.subAppend(event);
    

具体回滚策略是如何执行的,这里不再进行分析


过滤器

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <property name="pattern" value="[%-5level]  %dyyyy-MM-dd HH:mm:ss:SSS %c %M %L %thread %m%n"></property>

    <!--  配置文件的输出路径   -->
    <property name="fileDir" value="logback.log"></property>

    <!--
       配置控制台输出的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>

     <!-- 配置过滤器  -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!--  设置日志的输出级别 -->
                <level>ERROR</level>
               <!--     高于Level中设置的日志级别,则打印日志      -->
               <onMatch>ACCEPT</onMatch>
               <!--     低于Level中设置的日志级别,则跳过          -->
              <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!--
       日志记录器
       配置Root Logger
        level: 日志级别
       -->
    <root level="all">
        <appender-ref ref="console"/>
    </root>
</configuration>


通过过滤器,我们可以设置某个appender的日志过滤输出


过滤器链在何时会执行呢?


异步日志

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <property name="pattern" value="[%-5level]  %dyyyy-MM-dd HH:mm:ss:SSS %c %M %L %thread %m%n">查看详情  

日志-logback

参考:http://www.importnew.com/22290.html一概述  1.1 LogBack、Slf4j和Log4j之间的关系    1)Slf4j(TheSimpleLoggingFacadefor Java)是一个简单日志门面抽象框架本身只提供了日志FacadeAPI和一个简单的日志类实现,一般常配合Log4j,L... 查看详情

java日志框架slf4j和log4j以及logback的联系和区别

1.SLF4J(SimpleloggingFacadeforJava)意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,... 查看详情

logback,slf4j,log4j2。了解它们并学习如何使用。(翻译)(代码片段)

...此已经编写了各种框架。一些Java日志记录框架包括Log4j,logback,Apache通用日志记录,java.util.Logger等。所有这些日志记录器都将日志记录到文件或其他指定的介质中。什么是SLF4JSLF4j代表Java的简单日志记录外观。顾名思义,它是... 查看详情

日志框架--logback(代码片段)

logback背景介绍:SLF4J(SimpleLoggingFacadeforJava)是一个日志API接口,SLF4J提供TRACE,DEBUG,INFO,WARN,ERROR五种级别,而log4j和logback就是对SLF4J的具体实现。logback的性能优于log4j。logback-core:其它两个模块的基础模块logback-classic:它是log4j的一... 查看详情

java应用在java中使用log4j/logback进行日志记录和调试

如果您觉得本博客的内容对您有所帮助或启发,请关注我的博客,以便第一时间获取最新技术文章和教程。同时,也欢迎您在评论区留言,分享想法和建议。谢谢支持!相关阅读:​​Java应用【六】Java反射:动态类加载和调用... 查看详情

logback使用

logback简介   Slf4j是TheSimpleLoggingFacadeforJava的简称,是一个简单日志门面抽象框架,它本身只提供了日志FacadeAPI和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可... 查看详情

springboot日志框架

Java有很多日志系统,例如,JavaUtilLogging,Log4J,Log4J2,Logback等。SpringBoot也提供了不同的选项,比如日志框架可以用logback或log4j等。 默认的日志框架logback例如,maven依赖中添加了spring-boot-starter-logging。<dependency><groupId>org.... 查看详情

最全的springboot+logback日志配置教程

...志系统是必不可少的,目前比较流行的日志框架有log4j、logback等,可能大家还不知道,这两个框架的作者是同一个人,Logback旨在作为流行的log4j项目的后续版本,从而恢复log4j离开的位置。另外slf4j(SimpleLoggingFacadeforJava)则是一个... 查看详情

logback日志框架的简单使用(代码片段)

最近在自己搭建项目的时候,遇到logback选的问题,现在记录如下在框架中使用logback日志框架,关于logback和log4j日志框架的选择,这里就不多说了网上百度一大堆,总之一句话logback要比log4j效率高,性能好,配置灵活。1.首先在ma... 查看详情

日志框架logback相对于log4j的优势

日志框架logback相对于log4j的优势。更快的实现 Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。 非常充分的测试 Logback经过了几年,数不清小时的... 查看详情

java日志框架slf4j和log4j以及logback的联系和区别

...体的日志系统来实现,这些具体的日志系统就有log4j,logback,java.util.logging等,它们才实现了具体的日志系统的功能。如何使用SLF4J?既然SLF4J只是一个接口,那么实际使用时必须要结合具体的日志系统来使用,我们首... 查看详情

java日志框架slf4j和log4j以及logback的联系和区别

...体的日志系统来实现,这些具体的日志系统就有log4j,logback,java.util.logging等,它们才实现了具体的日志系统的功能。如何使用SLF4J?既然SLF4J只是一个接口,那么实际使用时必须要结合具体的日志系统来使用,我们首... 查看详情

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例​​分别使用三个日志框架建好测试​​​​log4j​​​​log4j2​​​​logback​​​​上面的三个同时引入一个应用中​​​​将日志统一使用slf4j标准​​​​不能修改p... 查看详情

springboot实践:logback日志配置

1、logback是什么?工作中一直用的是log4j日志框架,接触了SpringBoot后,因为logback是默认框架,才开始进行了解。来看下官网的相关介绍。 可以看到,logback是log4j的进化版,是为了替代log4j的。logback分三个模块:logback-core:核... 查看详情

java日志框架--logback(logback入门案例logback配置(fileappender异步日志拆分appender过滤器)logback-access)(代码片段)

1.LogbackLogback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。官方网站:https://logback.qos.ch/index.htmlLogback主要分为三个模块:logback-core:其它两个模块的基础模块logback-classic:它是log4j的一个改良版... 查看详情

java日志框架--logback(logback入门案例logback配置(fileappender异步日志拆分appender过滤器)logback-access)(代码片段)

1.LogbackLogback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。官方网站:https://logback.qos.ch/index.htmlLogback主要分为三个模块:logback-core:其它两个模块的基础模块logback-classic:它是log4j的一个改良版... 查看详情

java日志框架--logback(logback入门案例logback配置(fileappender异步日志拆分appender过滤器)logback-access)(代码片段)

1.LogbackLogback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。官方网站:https://logback.qos.ch/index.htmlLogback主要分为三个模块:logback-core:其它两个模块的基础模块logback-classic:它是log4j的一个改良版... 查看详情