用SLF4j/Logback打印日志-2
本篇主要介绍logback的输出源配置,logback默认提供了很多输出源,但是用的最多的是这几种:
- OutputStreamAppender 日志输出到一个二进制流,可以通过 <encoder/> 配置编码
 - ConsoleAppender 日志输出到控制台,可以通过 <encoder/>配置编码,通过设置target (System.out or System.err.)来指定输出方向。
 - FileAppender 日志输出到文件,有下面这些可以配置的属性
- append (boolean) 是追加还是覆盖的方式写日志,默认true,追加
 - encoder (Encoder)
 - file (String) 指定日志文件的位置
 - prudent (boolean) 这个模式是用来解决多进程log输出问题的,如果有多个输出源在不同的进程log写入同一份日志,那么会出现文件的问题。打开这种模式,会
给文件加锁,然后让事件顺序写入,文件锁会导致性能问题,一般情况下每秒20条日志的时候没有什么问题,但是每秒100条日志的时候回出现显著的性能问题。 
 
最后也是用的最多的是RollingFileAppender,最牛逼的输出源!!它可以配置的属性如下:
- file(String) 指定日志文件的位置
 - append(boolean) 是追加还是覆盖的方式写日志,默认true,追加
 - encoder(Encoder) 控制编码即布局
 - prudent(boolean) 同FileAppender
 - rollingPolicy(RollingPolicy)
 - triggeringPolicy(TriggeringPolicy)
 
它有两个最核心的属性:RollingPolicy 和 TriggeringPolicy,前者定义滚动的策略,后者定义滚动的时机。这种类型的输出源用的多是因为在后端系统中,日志是持续不断的打印的,单个日志文件的大小受限,所以它提供了一种机制可以根据时间自动归档旧的日志文件,然后创建新的日志文件打印日志,并且可以设置策略删除太旧的日志。一个典型的场景是:我们可以设置logback每天生成一个新的日志文件,并把昨天的日志文件归档,并且最多保存七天的日志,超出七天的自动删除。
滚动策略 - RollingPolicy
1. TimeBasedRollingPolicy 是目前最受欢迎的一种滚动方式,可以设置按天、按月的滚动。它同时实现了 RollingPolicy 和 TriggeringPolicy 接口。它可以配置这些属性:
fileNamePattern (String) 比如:/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log ,这里最重要的是 %d{},用它来格式化一个时间日期,作为一个文件名。
- maxHistory (int) 最多保存的日志数量
 - totalSizeCap (int) 限制日志文件大小,超出之后会先删除较旧的日志
 - 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的更多相关文章
- 用SLF4j/Logback打印日志-3
		
在 用SLF4j/Logback打印日志-1 和 用SLF4j/Logback打印日志-2 中分别介绍了Logback记录日志的基本原理并重点介绍了输出源配置.本篇介绍一些性能和技巧性的东西. 性能 ...
 - 用SLF4j/Logback打印日志-1
		
在 浅谈后端日志系统 中已经写了很多日志方面的零散的非技术的东西.本篇更像一份入门说明,讲解一下SLF4j/Logback.SLF4J是一套抽象的日志API接口,logback它是的底层实现,所以在这 ...
 - 日志框架之2 slf4j+logback实现日志架构 · 远观钱途
		
如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...
 - slf4j/logback: logging日志的配置
		
slf4j/logback: logging日志的配置 import依赖: import org.slf4j.Logger;import org.slf4j.LoggerFactory;private ...
 - 使用 SLF4J + LogBack 构建日志系统(转)
		
转载自:http://www.cnblogs.com/mailingfeng/p/3499436.html 上次我们讨论了如何选择一个好的开源日志系统方案,其中的结论是:使用 SLF4J + LogB ...
 - Spring Boot(三):logback打印日志
		
springboot对logback的支持是非常好的,不需要任何配置,只需要在resource下加logback.xml就可以实现功能直接贴代码: <?xml version="1.0 ...
 - springboot中logback打印日志(转)
		
springboot对logback的支持是非常好的,不需要任何配置,只需要在resource下加logback.xml就可以实现功能 直接贴代码: <?xml version="1. ...
 - java IDE 中安装 lombok plugin 插件,并使用 @Slf4j 注解打印日志初体验
		
lombok 插件介绍: IntelliJ IDEA官方插件页面:https://plugins.jetbrains.com/plugin/6317-lombok-plugin 使用lombok之后, ...
 - logback打印日志时添加上下文
		
尝试上述特性, 配置如下: 效果:
 
随机推荐
- django表单字段
			
在通过django.forms.Forms创建表单字段时,其中每个字段都有一些自定义的验证逻辑和一些其他钩子 虽然表单字段的Field类主要使用在Form类中,但也可以直接实例化来使用它们,以更好的了 ...
 - 【翻译】checkbox的第三种状态
			
checkbox只有两种值:选中(checked)或未选中(unchecked).它可以有任何值,但是表单提交时checkbox的值只能是checked或unchecked.它的默认值是uncheck ...
 - 初识thinkphp(3)
			
这篇内容主要涉及请求相应内容. 该系列主要是个人笔记,且内容是连贯的,其中涉及到的自己写的模块或者方法在前面文章中有介绍咋来的,如果您看得云里雾里,给您带来不便,真的不好意思. 0x01:请求对象 官 ...
 - Android Intent Service
			
Android Intent Service 学习自 Android 官方文档 https://blog.csdn.net/iromkoear/article/details/63252665 Ove ...
 - Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) D. Artsem and Saunders 数学 构造
			
D. Artsem and Saunders 题目连接: http://codeforces.com/contest/765/problem/D Description Artsem has a fr ...
 - Java 与 .NET 的平台发展之争
			
Java 8即将正式发布,从早期版本中,我们已经可以领略到一些令人兴奋的特性.但是开发者Andrew C. Oliver表示,尽管如此,Java语言在某些特性上还是落后于.Net.比如,Java 8中 ...
 - HDU 4759  Poker Shuffle(2013长春网络赛1001题)
			
Poker Shuffle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
 - Sublime Text 2搭建Go开发环境,代码提示+补全+调试
			
本文在已安装Go环境的前提下继续. 1.安装Sublime Text 2 2.安装Package Control. 运行Sublime,按下 Ctrl+`(`在Tab键上边),然后输入以下内容: im ...
 - poll() can't detect event when socket is closed locally?
			
from https://stackoverflow.com/questions/5039608/poll-cant-detect-event-when-socket-is-closed-locall ...
 - Windows Application Data拒绝访问打开方法?
			
在Windows7操作系统,打开 Application Data等文件夹时,弹出位置不可用的警告窗口,提示拒绝访问.下面提供简单的解决方法,希望有用. 工具/原料 计算机. Windows7操作系统 ...