zoukankan      html  css  js  c++  java
  • 用SLF4j/Logback打印日志-2

    本篇主要介绍logback的输出源配置,logback默认提供了很多输出源,但是用的最多的是这几种:

    1. OutputStreamAppender 日志输出到一个二进制流,可以通过 <encoder/> 配置编码
    2. ConsoleAppender 日志输出到控制台,可以通过 <encoder/>配置编码,通过设置target (System.out or System.err.)来指定输出方向。
    3. FileAppender 日志输出到文件,有下面这些可以配置的属性
      1. append (boolean) 是追加还是覆盖的方式写日志,默认true,追加
      2. encoder (Encoder)
      3. file (String) 指定日志文件的位置
      4. prudent (boolean) 这个模式是用来解决多进程log输出问题的,如果有多个输出源在不同的进程log写入同一份日志,那么会出现文件的问题。打开这种模式,会
        给文件加锁,然后让事件顺序写入,文件锁会导致性能问题,一般情况下每秒20条日志的时候没有什么问题,但是每秒100条日志的时候回出现显著的性能问题。

    最后也是用的最多的是RollingFileAppender,最牛逼的输出源!!它可以配置的属性如下:

    1. file(String) 指定日志文件的位置
    2. append(boolean) 是追加还是覆盖的方式写日志,默认true,追加
    3. encoder(Encoder) 控制编码即布局
    4. prudent(boolean) 同FileAppender
    5. rollingPolicy(RollingPolicy)
    6. triggeringPolicy(TriggeringPolicy)

    它有两个最核心的属性:RollingPolicy 和 TriggeringPolicy,前者定义滚动的策略,后者定义滚动的时机。这种类型的输出源用的多是因为在后端系统中,日志是持续不断的打印的,单个日志文件的大小受限,所以它提供了一种机制可以根据时间自动归档旧的日志文件,然后创建新的日志文件打印日志,并且可以设置策略删除太旧的日志。一个典型的场景是:我们可以设置logback每天生成一个新的日志文件,并把昨天的日志文件归档,并且最多保存七天的日志,超出七天的自动删除。

    滚动策略 - RollingPolicy


    1. TimeBasedRollingPolicy 是目前最受欢迎的一种滚动方式,可以设置按天、按月的滚动。它同时实现了 RollingPolicy 和 TriggeringPolicy 接口。它可以配置这些属性:

    1. fileNamePattern (String) 比如:/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log ,这里最重要的是 %d{},用它来格式化一个时间日期,作为一个文件名。

    2. maxHistory (int) 最多保存的日志数量
    3. totalSizeCap (int) 限制日志文件大小,超出之后会先删除较旧的日志
    4. cleanHistoryOnStart (boolean)
    注:在RollingFileAppender还是需要设置file属性来表示当前的写入日志的文件,但是当滚动时间到了,会按照fileNamePattern定义的规则来归档当前的日志写入文件。logback会从 
    fileNamePattern 中推导出滚动的间隔,上面的例子会按月创建日志目录、日志文件会在每天0点归档。

    常用的TimeBasedRollingPolicy策略:

    1./wombat/foo.%d 每天0点生成一个文件,默认格式 yyyy-MM-dd, 比如:/wombat/foo.2006-11-23
    2./wombat/%d{yyyy/MM}/foo.txt 每月滚动一次,比如:/wombat/2006/10/foo.txt
    3./wombat/foo.%d{yyyy-ww}.log 每周滚动一次
    4./wombat/foo%d{yyyy-MM-dd_HH}.log 每小时滚动一次
    5./wombat/foo%d{yyyy-MM-dd_HH-mm}.log 每分钟滚动一次

    注:如果文件名类似 '/wombat/foo.%d.gz' 这样,以 'gz' 或者 'zip' 结尾,那么会把文件自动进行压缩

    一个典型的配置(每天滚动一次,最多存30天,所有log大小不能超过3GB):

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <!-- daily rollover -->
          <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
    
          <!-- keep 30 days' worth of history capped at 3GB total size -->
          <maxHistory>30</maxHistory>
          <totalSizeCap>3GB</totalSizeCap>
    
        </rollingPolicy>
    
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    2. SizeAndTimeBasedRollingPolicy 典型配置如下:

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>mylog.txt</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
          <!-- rollover daily -->
          <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
           <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
           <maxFileSize>100MB</maxFileSize>    
           <maxHistory>60</maxHistory>
           <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>

    唯一需要注意的是 %i 标记,它的使用场景是这样的,如果log文件的大小达到了maxFileSize,但是时间还没有达到滚动点,那么会创建新的log文件,并用一个递增的 %i 索引。

    3. FixedWindowRollingPolicy 要求文件 fileNamePattern 必须包含 %i标示,这是一个递增字段,受到 minIndex 和 maxIndex 限制。

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>test.log</file>
    
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <fileNamePattern>tests.%i.log.zip</fileNamePattern>
          <minIndex>1</minIndex>
          <maxIndex>3</maxIndex>
        </rollingPolicy>
    
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    这种方式利用到了 triggeringPolicy,因为它本身无法判断什么时候应该产生一个新的文件,所以通过triggeringPolicy来约束。上面的
    例子中,当文件大小超过5MB的时候就会触发一次滚动。

    远端的数据源,比如 SocketAppender and SSLSocketAppender 、SMTPAppender等暂时用不到,不再记录。

    在阅读官方文档的时候看到一句话:

    "For various technical reasons, rollovers are not clock-driven but depend on the arrival of logging events."

    这种方式和友盟的log文件记录是一样的,看完之后心有同感!

    Refer:
  • 相关阅读:
    5 Things Every Manager Should Know about Microsoft SharePoint 关于微软SharePoint每个经理应该知道的五件事
    Microsoft SharePoint 2010, is it a true Document Management System? 微软SharePoint 2010,它是真正的文档管理系统吗?
    You think you use SharePoint but you really don't 你认为你使用了SharePoint,但是实际上不是
    Introducing Document Management in SharePoint 2010 介绍SharePoint 2010中的文档管理
    Creating Your Own Document Management System With SharePoint 使用SharePoint创建你自己的文档管理系统
    MVP模式介绍
    权重初始化的选择
    机器学习中线性模型和非线性的区别
    神经网络激励函数的作用是什么
    深度学习中,交叉熵损失函数为什么优于均方差损失函数
  • 原文地址:https://www.cnblogs.com/winner-0715/p/9063495.html
Copyright © 2011-2022 走看看