本篇主要介绍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. WebView图片点击查看

    需求:WebView中的图片点击后放大全屏查看 this.setWebViewClient(new WebViewClient() { @Override public boolean shouldO ...

  2. 线性回归模型的 MXNet 与 TensorFlow 实现

    本文主要探索如何使用深度学习框架 MXNet 或 TensorFlow 实现线性回归模型?并且以 Kaggle 上数据集 USA_Housing 做线性回归任务来预测房价. 回归任务,scikit-l ...

  3. AngularJS过滤器filter入门

    在开发中,经常会遇到这样的场景 如用户的性别分为“男”和“女”,在数据库中保存的值为1和0,用户在查看自己的性别时后端返回的值自然是1或0,前端要转换为“男”或“女”再显示出来: 如我要换个羽毛球拍, ...

  4. 快速沃尔什变换与k进制FWT

    这是一篇用来卖萌的文章QAQ 考虑以下三类卷积 \(C_k = \sum \limits_{i \;or\;j = k} A_i * B_j\) \(C_k = \sum \limits_{i\;an ...

  5. NOIP练习赛题目4

    肥得更高 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 自2009年以来,A.B站的历史就已经步入了农业变革的黎明期.在两站的 ...

  6. 模板 树上求LCA 倍增和树链剖分

    //233 模板 LCA void dfs(int x,int f){ for(int i=0;i<E[x].size();i++){ int v = E[x][i]; if(v==f)cont ...

  7. Qt编写websocketpp客户端

    1.下载websocketpp,地址为https://github.com/zaphoyd/websocketpp,版本为0.7. 2.下载boost,地址为https://www.boost.org ...

  8. Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合

    前言:  流程引擎的核心功能是负责解析流程定义XML和流转,业务环节的不断积累,让人们不断总结和抽象出一些模式,这些模式统称为工作流模式(Workflow Pattern).本文的重点就是介绍一种常见 ...

  9. Linux/CentOS实现交换机-简单的交换机实现

    个人理解: 1.交换机的核心在于Mac地址学习,使其能在全双工/半双工下进行转发工作. 2.对于专业的交换机来说,使用的是专业的网络芯片并自己实现里面的协议,比如说华为的,为什么能卖那么贵,贵在于网络 ...

  10. CAS服务器配置

    参考文献: http://sucre.blog.51cto.com/1084905/683624 1.安装部署CAS Server 从官网下载CAS Server,今天发现CAS Server的官网居 ...