lockback的使用

logback简介

logback是由log4j的创始人开发的新日志框架,包括三个模块:

  • logback-core
  • logback-classic
  • logback-access

logback-core是核心模块,logback-classic是日志框架,相当于log4j,logback很好的实现了slf4j,logback-access提供跟web 容器有关的日志访问功能。

logback与log4j的区别

logback和Log4j是同一个开发者,与log4j相比,logback有如下优势:

  • 更高的性能,性能提高几十倍
  • 更完善的文档
  • 更完善的功能测试
  • 提供热加载机制
  • 对slf4j有更直接的实现,不像Log4j还需要转换器
  • 可以生成日志归档文件
  • 可以通过配置文件设置自动删除归档文件

简单实例

想要使用logback非常简单方便,只需要使用slf4j-api,logback-core,logback-classic 三个包,maven文件做如下配置:


            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.5</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.0.11</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.0.11</version>
            </dependency>
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    public class LogBackDemo {
     
        private static final Logger logger = LoggerFactory.getLogger(LogBackDemo.class);
     
        public static void main(String[] args) {
            logger.info("Hello word!");
        }

我们在代码中直接使用slf4j的接口,没有显示的引用任何logback相关的代码,完成了logback的调用,我们只需要在getLogger参数中传入当前类的全限定类名,是不是非常简单啊?

logback配置介绍

  • Logger、appender及layout

logback可以在配置文件配置具体的参数,配置文件主要由Logger、appender及layout等配置组成。

logger主要是日志记录器,通过Logcontext进行管理,存放logger对象。

appender设置日志输出的目的地,可以输出到控制台、文件、数据库等目标。

layout 用来指定日志输出的字符串格式。

  • logger context

logcontext负责管理logger,logger由logcontext创建,并由logcontext管理logger对象的树状关系,logger对象通过org.slf4j.LoggerFactory 类的静态方法getLogger取得 ,getlogger以当前类的全限定名作为参数传入,如果参数相同,通过该方法永远获得同一个对象。

  • 级别的继承

每一个logger对象可以设定日志的输出级别,日志级别由高到低分为TRACE、DEBUG、INFO、WARN 和 ERROR ,如果当前logger没有设置级别,获取上层对象的日志级别作为logger的日志级别。

  • 日志的打印规则

例如我们做logger.info(“Hello word!”);的日志输出,info是当前日志请求的级别,该请求级别需要大于等于logger对象设置的日志级别才能启用该日志输出,否则不能输出,级别顺序为
TRACE < DEBUG < INFO < WARN < ERROR 。

logback.xml配置详解

配置结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>
    <!--定义参数,后面可以通过${app.name}使用-->
    <property name="app.name" value="logback_test"/>
    <!--ConsoleAppender 用于在屏幕上输出日志-->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来-->
        <!--这里定义了DEBUG,也就是控制台不会输出比ERROR级别小的日志-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <!-- encoder 默认配置为PatternLayoutEncoder -->
        <!--定义控制台输出格式-->
        <encoder>
            <pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--定义日志输出的路径-->
        <!--这里的scheduler.manager.server.home 没有在上面的配置中设定,所以会使用java启动时配置的值-->
        <!--比如通过 java -Dscheduler.manager.server.home=/path/to XXXX 配置该属性-->
        <file>${scheduler.manager.server.home}/logs/${app.name}.log</file>
        <!--定义日志滚动的策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--定义文件滚动时的文件名的格式-->
            <fileNamePattern>${scheduler.manager.server.home}/logs/${app.name}.%d{yyyy-MM-dd.HH}.log.gz
            </fileNamePattern>
            <!--60天的时间周期,日志量最大20GB-->
            <maxHistory>60</maxHistory>
            <!-- 该属性在 1.1.6版本后 才开始支持-->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!--每个日志文件最大100MB-->
            <maxFileSize>100MB</maxFileSize>
        </triggeringPolicy>
        <!--定义输出格式-->
        <encoder>
            <pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
        </encoder>
    </appender>

    <!--root是默认的logger 这里设定输出级别是debug-->
    <root level="trace">
        <!--定义了两个appender,日志会通过往这两个appender里面写-->
        <appender-ref ref="stdout"/>
        <appender-ref ref="file"/>
    </root>

    <!--对于类路径以 com.example.logback 开头的Logger,输出级别设置为warn,并且只输出到控制台-->
    <!--这个logger没有指定appender,它会继承root节点中定义的那些appender-->
    <logger name="com.example.logback" level="warn"/>

    <!--通过 LoggerFactory.getLogger("mytest") 可以获取到这个logger-->
    <!--由于这个logger自动继承了root的appender,root中已经有stdout的appender了,自己这边又引入了stdout的appender-->
    <!--如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
    <!--additivity表示要不要使用rootLogger配置的appender进行输出-->
    <logger name="mytest" level="info" additivity="false">
        <appender-ref ref="stdout"/>
    </logger>
    
    <!--由于设置了 additivity="false" ,所以输出时不会使用rootLogger的appender-->
    <!--但是这个logger本身又没有配置appender,所以使用这个logger输出日志的话就不会输出到任何地方-->
    <logger name="mytest2" level="info" additivity="false"/>
</configuration>
  • 根节点configuration
    节点包含三个属性:

scan 设置为true,修改配置文件可以自动重新加载。

scanPeriod 为监控配置文件是否修改的时间间隔。

debug 为true时候打印logback内部信息。

    <configuration scan="true" scanPeriod="60 seconds" debug="false"> 
        <!--其他配置省略--> 
    </configuration> 
  • ConsoleAppender
    把日志输出到控制台
    <configuration> 
       <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
          <encoder> 
             <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
          </encoder> 
       </appender> 
    
       <root level="DEBUG"> 
          <appender-ref ref="STDOUT" /> 
       </root> 
    </configuration>

encoder对日志信息格式化。

  • FileAppender
    把日志输出到文件。
    <configuration> 
          <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
            <file>testFile.log</file> 
            <append>true</append> 
            <encoder> 
              <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
            </encoder> 
          </appender> 
          <root level="DEBUG"> 
          <appender-ref ref="FILE" /> 
          </root> 
     </configuration>

file:被写入的文件名。
append:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。       :对记录事件进行格式化。

  • RollingFileAppender
    滚动记录日志,先把日志记录到一个指定文件,在指定条件下再归档到其他文件。
    <configuration> 
              <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
                  <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> 
                  <maxHistory>30</maxHistory> 
                </rollingPolicy> 
                <encoder> 
                  <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
                </encoder> 
              </appender> 
    
              <root level="DEBUG"> 
                <appender-ref ref="FILE" /> 
              </root> 
            </configuration>

file:被写入的文件名。
append:如果是 true,日志被追加到文件结尾,如果是 false。       
rollingPolicy:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类。
TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略。    
fileNamePattern:包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。 如果直接使用 %d,默认格式是 yyyy-MM-dd。         
maxHistory: 控制保留的归档文件的最大数量,超出数量就删除旧文件。

你可能感兴趣的:(java,架构,java架构)