- 浏览: 1236919 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
logback系列之一:输出日志到控制台
logback系列之二:输出日志到文件
logback系列之三:输出日志到文件(滚动)
logback系列之四:输出日志到不同文件
实际生产中,每天都有大量的日志生成,单个文件(FileAppender)已经不能满足要求,RollingFileAppender继承了FileAppender,并提供了更多的功能:
配置
和logback系列之二:输出日志到文件类似,改动的地方:
1. logback[-test].xml文件:
调用测试类的方法,生成heuristic-2013-11-16.log文件。
源码分析
a. 如果指定了file属性,当天的文件名为file属性值(/logs/heuristic.log):
ch.qos.logback.core.rolling.RollingFileAppender类
上面logback[-test].xml的rollingPolicy配置为
ch.qos.logback.core.rolling.TimeBasedRollingPolicy类
看下实现:
ch.qos.logback.core.FileAppender类
b. 必须指定TriggeringPolicy<E>和RollingPolicy,否则不会打印日志:
看下
ch.qos.logback.core.rolling.RollingFileAppender类:
TimeBasedRollingPolicy类实现了上面的两个接口,triggeringPolicy和rollingPolicy都指向TimeBasedRollingPolicy的实例对象。
c. 如果file指定,前一天的文件名改为fileNamePattern的值(/logs/heuristic-2013-11-15.log)。
通过设置TimeBasedRollingPolicy的maxHistory属性,可以控制已产生日志的数量。如果maxHistory设置为30,那么超过30天的log文件会被自动删除,这是通过RollingFileAppender的rollover()方法来实现的。
该方法会调用
ch.qos.logback.core.rolling.TimeBasedRollingPolicy类
的rollover方法:
默认的archiveRemover为ch.qos.logback.core.rolling.helper.DefaultArchiveRemover抽象类:
cleanByPeriodOffset为抽象方法,这里交由
ch.qos.logback.core.rolling.helper.TimeBasedArchiveRemover子类实现:
d. 如果要启用压缩,需要将fileNamePattern的后缀名设置为压缩格式,如:/logs/heuristic-%d{yyyy-MM-dd}.zip。
看下ch.qos.logback.core.rolling.RollingPolicyBase类相关的代码:
e. RollingFileAppender保证append的值为true,这样当天先写入的日志内容就不会丢失:
ch.qos.logback.core.rolling.RollingFileAppender类的start()方法:
f. prudent模式不支持file设定;如果启用了压缩,logback将不会记录日志:
ch.qos.logback.core.rolling.RollingFileAppender类
的start()方法:
不好意思没写清楚,logback已经实现了,只需要在logback[-test].xml文件中配置maxHistory属性就可以了。
logback系列之二:输出日志到文件
logback系列之三:输出日志到文件(滚动)
logback系列之四:输出日志到不同文件
实际生产中,每天都有大量的日志生成,单个文件(FileAppender)已经不能满足要求,RollingFileAppender继承了FileAppender,并提供了更多的功能:
- 每天生成一个日志文件
- 将前一天的日志重命名为包含日期的格式
- 根据需要,删除过期历史日志
配置
和logback系列之二:输出日志到文件类似,改动的地方:
1. logback[-test].xml文件:
<appender name="rollingAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/heuristic.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/logs/heuristic-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder><!-- 必须指定,否则不会往文件输出内容 --> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern> </encoder> <append>false</append> <prudent>false</prudent> </appender> <root level="DEBUG"> <appender-ref ref="rollingAppender" /> </root>
调用测试类的方法,生成heuristic-2013-11-16.log文件。
源码分析
a. 如果指定了file属性,当天的文件名为file属性值(/logs/heuristic.log):
ch.qos.logback.core.rolling.RollingFileAppender类
public void start() { ... currentlyActiveFile = new File(getFile()); // 获取日志文件名 } public String getFile() { return rollingPolicy.getActiveFileName(); // 从滚动策略获取 }
上面logback[-test].xml的rollingPolicy配置为
ch.qos.logback.core.rolling.TimeBasedRollingPolicy类
看下实现:
public String getActiveFileName() { String parentsRawFileProperty = getParentsRawFileProperty(); if (parentsRawFileProperty != null) { // logback.xml指定了file属性 return parentsRawFileProperty; // 使用file值 } else { return timeBasedFileNamingAndTriggeringPolicy .getCurrentPeriodsFileNameWithoutCompressionSuffix(); } } public String getParentsRawFileProperty() { return parent.rawFileProperty(); }
ch.qos.logback.core.FileAppender类
final public String rawFileProperty() { return fileName; }
b. 必须指定TriggeringPolicy<E>和RollingPolicy,否则不会打印日志:
看下
ch.qos.logback.core.rolling.RollingFileAppender类:
public void start() { if (triggeringPolicy == null) { addWarn("No TriggeringPolicy was set for the RollingFileAppender named " + getName()); addWarn("For more information, please visit "+CODES_URL+"#rfa_no_tp"); return; } if (rollingPolicy == null) { addError("No RollingPolicy was set for the RollingFileAppender named " + getName()); addError("For more information, please visit "+CODES_URL+"rfa_no_rp"); return; }
TimeBasedRollingPolicy类实现了上面的两个接口,triggeringPolicy和rollingPolicy都指向TimeBasedRollingPolicy的实例对象。
c. 如果file指定,前一天的文件名改为fileNamePattern的值(/logs/heuristic-2013-11-15.log)。
通过设置TimeBasedRollingPolicy的maxHistory属性,可以控制已产生日志的数量。如果maxHistory设置为30,那么超过30天的log文件会被自动删除,这是通过RollingFileAppender的rollover()方法来实现的。
该方法会调用
ch.qos.logback.core.rolling.TimeBasedRollingPolicy类
的rollover方法:
public void rollover() throws RolloverFailure { // 当此方法调用时,假定前一天日志文件已经关闭 String elapsedPeriodsFileName = timeBasedFileNamingAndTriggeringPolicy .getElapsedPeriodsFileName(); String elpasedPeriodStem = FileFilterUtil.afterLastSlash(elapsedPeriodsFileName); if (compressionMode == CompressionMode.NONE) { if (getParentsRawFileProperty() != null) { renameUtil.rename(getParentsRawFileProperty(), elapsedPeriodsFileName); // file指定,重命名为fileNamePattern格式。如果目标文件存在,则重命名失败 } // else { nothing to do if CompressionMode == NONE and parentsRawFileProperty == null } } else { if (getParentsRawFileProperty() == null) { future = asyncCompress(elapsedPeriodsFileName, elapsedPeriodsFileName, elpasedPeriodStem); // file未指定,异步压缩 } else { future = renamedRawAndAsyncCompress(elapsedPeriodsFileName, elpasedPeriodStem); // file指定,重命名并异步压缩 } } if (archiveRemover != null) { archiveRemover.clean(new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime())); // 删除历史日志 } }
默认的archiveRemover为ch.qos.logback.core.rolling.helper.DefaultArchiveRemover抽象类:
public void clean(Date now) { long nowInMillis = now.getTime(); int periodsElapsed = computeElapsedPeriodsSinceLastClean(nowInMillis); lastHeartBeat = nowInMillis; if (periodsElapsed > 1) { addInfo("periodsElapsed = " + periodsElapsed); } // 从待删除日志的终止日期开始,每次回退一天,删除过期日志 for (int i = 0; i < periodsElapsed; i++) { cleanByPeriodOffset(now, periodOffsetForDeletionTarget - i); } } public void setMaxHistory(int maxHistory) { // 待删除日志的终止日期:回退(maxHistory+1)天 this.periodOffsetForDeletionTarget = -maxHistory - 1; }
cleanByPeriodOffset为抽象方法,这里交由
ch.qos.logback.core.rolling.helper.TimeBasedArchiveRemover子类实现:
protected void cleanByPeriodOffset(Date now, int periodOffset) { Date date2delete = rc.getRelativeDate(now, periodOffset); // 计算需要删除日志的日期 String filename = fileNamePattern.convert(date2delete); File file2Delete = new File(filename); if (file2Delete.exists() && file2Delete.isFile()) { file2Delete.delete(); // 删除文件 addInfo("deleting " + file2Delete); if (parentClean) { removeFolderIfEmpty(file2Delete.getParentFile()); } } }
d. 如果要启用压缩,需要将fileNamePattern的后缀名设置为压缩格式,如:/logs/heuristic-%d{yyyy-MM-dd}.zip。
看下ch.qos.logback.core.rolling.RollingPolicyBase类相关的代码:
protected void determineCompressionMode() { if (fileNamePatternStr.endsWith(".gz")) { addInfo("Will use gz compression"); compressionMode = CompressionMode.GZ; } else if (fileNamePatternStr.endsWith(".zip")) { addInfo("Will use zip compression"); compressionMode = CompressionMode.ZIP; } else { // 如果后缀名不是.gz或.zip,不会启用压缩 addInfo("No compression will be used"); compressionMode = CompressionMode.NONE; } }
e. RollingFileAppender保证append的值为true,这样当天先写入的日志内容就不会丢失:
ch.qos.logback.core.rolling.RollingFileAppender类的start()方法:
if (!append) { // append为false时 addWarn("Append mode is mandatory for RollingFileAppender"); append = true; // 改成true }
f. prudent模式不支持file设定;如果启用了压缩,logback将不会记录日志:
ch.qos.logback.core.rolling.RollingFileAppender类
的start()方法:
if (isPrudent()) { // 安全模式,但效率低 if (rawFileProperty() != null) { addWarn("Setting \"File\" property to null on account of prudent mode"); setFile(null); // 取消file属性设置 } if (rollingPolicy.getCompressionMode() != CompressionMode.NONE) { // 启用了压缩 addError("Compression is not supported in prudent mode. Aborting"); return; // 返回,不会进行后面的记录日志操作 } }
评论
4 楼
xunux
2016-04-01
如何按日期分目录,按小时和文件大小滚动策略? 我下面的配置无效, 不按日期分目录就有效。
该如何实现呢?
该如何实现呢?
<appender name="downloadLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.dir}/downloadLog.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.dir}/%d{yyyy-MM-dd}/downloadLog-%d{yyyy-MM-dd_HH}.%i.log</fileNamePattern> <maxHistory>365</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <MaxFileSize>5MB</MaxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder charset="UTF-8"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</pattern> </encoder> </appender>
3 楼
PlunderColor
2015-12-16
很好的文章
把前一天的log日志压缩的时间是什么时候呢, 第二天开始打log的时候吗?
把前一天的log日志压缩的时间是什么时候呢, 第二天开始打log的时候吗?
2 楼
czj4451
2014-11-12
在世界的中心呼喚愛 写道
不错的文章。
这里删除过期的日志,通过编码实现?
这里删除过期的日志,通过编码实现?
不好意思没写清楚,logback已经实现了,只需要在logback[-test].xml文件中配置maxHistory属性就可以了。
1 楼
在世界的中心呼喚愛
2014-11-10
不错的文章。
这里删除过期的日志,通过编码实现?
这里删除过期的日志,通过编码实现?
发表评论
-
Netty系列之二、Netty组件
2014-10-12 19:55 0Netty主要由以下几个组件构成: Bootstrap o ... -
Netty系列之二:传输方式
2014-09-17 22:35 0NIO (Non-blocking I/O) io.netty ... -
Java正则表达式实例
2014-08-25 22:50 1887题目: 有两个文件context.txt和words ... -
quartz系列之九:存储
2014-08-05 13:16 0这里以1.8.x为例: 任务 ... -
JVM 四种引用
2014-04-24 19:56 17151. 强引用 指通过普通 ... -
Proxy 源码分析
2014-04-21 10:47 0public class Proxy implements ... -
NIO UDP 编程
2014-04-17 23:18 4202和TCP的SocketChannel类似,UDP的Dat ... -
Matcher 源码分析
2014-04-15 14:45 0首先看下接口: public interface Matc ... -
BTrace 使用
2014-03-20 18:03 0简介 Btrace (Byte Trace)是Sun推出的一款 ... -
NIO Socket 编程
2014-04-11 22:48 1602Java NIO (Nonblocking IO)解决了常规I ... -
hessian系列之二:上传文件
2014-02-17 17:16 6146hessian较早版本通过 byte[] 进行文件传输;4.0 ... -
hessian系列之三:与Spring集成
2014-02-17 20:21 17807Spring封装了hessian客户端和服务端的通用代码,把实 ... -
hessian系列之一:Hello world
2014-01-06 20:51 2253Hessian是一个Web Service的轻量级二进制协议, ... -
XStream:自定义转换器
2013-12-30 22:47 0XStream是一款不错的oxm (Object-XML ma ... -
Http连接工具类
2013-12-28 16:13 0public class HttpConnUtil { ... -
Integer源码分析
2013-12-26 19:59 0private static String toU ... -
全排序
2013-12-23 21:02 0写一个函数, 如 foo(String str), 打印出 s ... -
logback系列之四:输出日志到不同文件
2013-12-03 16:25 68753logback系列之一:输出日志到控制台 logback系列之 ... -
Properties 源码分析
2013-11-26 10:32 01. Properties类扩展了Hashtable,用来保存 ... -
logback系列之二:输出日志到文件
2013-11-15 15:20 30232logback系列之一:输出日志到控制台 logback系列之 ...
相关推荐
springboot+logback输出日志文件1
扩展logback将日志输出到Kafka实例源码,详情请参见博文:http://blog.csdn.net/l1028386804/article/details/79135948
springboot 日志配置文件 logback 它当前分为以下三个模块: logback-core:其它两个模块的基础模块。 logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如...
logback+slf4j 异步日志输出到不同级别的文件-配置文件,下载即可使用。结合lombok【@slf4j】即可方便愉快的输出日志了 666
分享的文件包括Logback的相关jar包和核心配置文件。 Logback是由log4j创始人设计的另一个开源日志组件,基于slf4j的日志规范实现的框架,性能比log4j要好。 Logback主要分为三个技术模块: logback-core:该模块为...
这是logback日志输出需要的jar包,以及最基础的logback.xml配置
关闭HttpClient日志的logback文件
异步输出日志的原理 1、配置文件logback-spring.xml SpringBoot工程自带logback和slf4j的依赖,所以重点放在编写配置文件上,需要引入什么依赖,日志依赖冲突统统都不需要我们管了。 logback框架会默认加载classpath...
appender:指定日志输出的媒介,即输出地(可以是控制台,可以是文件,远程套接字服务器等); layout:用来格式化日志信息的输出。 二.logback优于log4的原因 Logback对log4j进行了大量改进,Logback就是更好的log...
该配置使日志先按日期进行归类,然后按大小输出异步日志
扩展logback将日志输出到Kafka实例扩展源码,详情参见博文:http://blog.csdn.net/l1028386804/article/details/79136841
每次日志输出到文件都会进行一次磁盘IO,在多应用的时候这种效果会导致一定的线程运行延迟,所以可以采用异步的方式处理。 采用异步写日志的方式,通过不让主线程去写日志文件而减少磁盘IO,避免并发下造成线程阻塞...
在日常工程开发中,日志是非常重要的一部分,通过...本资源基于maven,使用logback搭建日志结构,实现多种级别日志的输出控制,并封装各个级别的日志输出方法,可以作为日志管理基础进行扩展以满足其他场景的日志管理。
内置三个jar包 一个配置文件 logback.txt logback-classic-1.2.3.jar logback-core-1.2.3.jar slf4j-api-1.7.26.jar
springboot整合logback保存日志到文件,日志持久化
logback日志的jar包和配置介绍:logback-classic-1.1.2.jar、logback-core-1.1.2.jar、slf4j-api-1.7.7.jar、logback.xml、rsframework.properties
logback日志配置文件的详细注解,介绍指定哪个java包或者java类输出日志,输出什么level的日志,日志的文件命名,路径等
LogBack配置文件,主要包括LOGBack的配置文件内容
在SpringBoot中使用logback优化异常堆栈的输出.doc
该压缩包包含 logback类库所包含的jar包以及logback.xml配置文件(放到 src 目录),用于开发学习使用。