本篇主要介绍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:

用SLF4j/Logback打印日志-2的更多相关文章

  1. 用SLF4j/Logback打印日志-3

    在 用SLF4j/Logback打印日志-1 和 用SLF4j/Logback打印日志-2 中分别介绍了Logback记录日志的基本原理并重点介绍了输出源配置.本篇介绍一些性能和技巧性的东西. 性能 ...

  2. 用SLF4j/Logback打印日志-1

    在 浅谈后端日志系统 中已经写了很多日志方面的零散的非技术的东西.本篇更像一份入门说明,讲解一下SLF4j/Logback.SLF4J是一套抽象的日志API接口,logback它是的底层实现,所以在这 ...

  3. 日志框架之2 slf4j+logback实现日志架构 · 远观钱途

    如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...

  4. slf4j/logback: logging日志的配置

    slf4j/logback: logging日志的配置 import依赖: import org.slf4j.Logger;import org.slf4j.LoggerFactory;private ...

  5. 使用 SLF4J + LogBack 构建日志系统(转)

    转载自:http://www.cnblogs.com/mailingfeng/p/3499436.html 上次我们讨论了如何选择一个好的开源日志系统方案,其中的结论是:使用 SLF4J + LogB ...

  6. Spring Boot(三):logback打印日志

    springboot对logback的支持是非常好的,不需要任何配置,只需要在resource下加logback.xml就可以实现功能直接贴代码: <?xml version="1.0 ...

  7. springboot中logback打印日志(转)

    springboot对logback的支持是非常好的,不需要任何配置,只需要在resource下加logback.xml就可以实现功能 直接贴代码: <?xml version="1. ...

  8. java IDE 中安装 lombok plugin 插件,并使用 @Slf4j 注解打印日志初体验

    lombok 插件介绍: IntelliJ IDEA官方插件页面:https://plugins.jetbrains.com/plugin/6317-lombok-plugin 使用lombok之后, ...

  9. logback打印日志时添加上下文

    尝试上述特性, 配置如下: 效果:

随机推荐

  1. httpclient初步封装

    Http通信方式:HttpURLConnection和HttpClient HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便HttpClient就是一个增强版的 ...

  2. 网页图表Highcharts实践教程之标签组与载入动画

    网页图表Highcharts实践教程之标签组与载入动画 Highcharts标签组 在图表的大部分元素都提供了标签功能.但很多时候,我们需要额外说明一些信息.这个时候借助原有的图表元素的标签功能就不是 ...

  3. 使用JAXB实现Bean与Xml相互转换

    最近几天,我自己负责的应用这边引入了一个新的合作方,主要是我这边调用他们的接口,但是有个很坑的地方,他们传参居然不支持json格式,并且只支持xml格式进行交互,于是自己写了一个工具类去支持bean与 ...

  4. Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale 二分

    C. Anton and Fairy Tale 题目连接: http://codeforces.com/contest/785/problem/C Description Anton likes to ...

  5. centos 7.2 安装mysql 修改 初始密码

    # /etc/init.d/mysqld stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking &# my ...

  6. js识别用户设备是移动端手机时跳转到手机网站

    一.识别到用户的设备是手机等移动端设备时跳转到移动端网站 var mobileAgent = new Array("iphone", "ipod", " ...

  7. Delphi 资源管理器套件

    需要个类似资源管理器的东西, 首先试了下 TDriveComboBox.TDirectoryListBox.TFileListBox, 嘿! Win31 时代的东西, 不是一般地丑. 试了下 Vcl. ...

  8. 黑群晖NAS安装方法(收集)/物理机/VMware虚拟机/KVM虚拟机(转)

    群晖NAS系统的特点: 1.正版的群晖分为两部分,启动引导和系统文件,其中启动引导是一个闪盘,镶嵌在群晖的主板上,而系统文件是现成下载然后倒入的pat文件. 2.黑群晖破解的主要是启动引导,其实能兼容 ...

  9. IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求

    IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求   IIS7.0下查询条件太多时,会报错,因为IIS 7对于Query Str ...

  10. 浅谈BFC和IFC

    先说说FC,FC的含义就是Fomatting Context.它是CSS2.1规范中的一个概念. 它是页面中的一块渲染区域.而且有一套渲染规则,它决定了其子元素将怎样定位.以及和其它元素的关系和相互作 ...