如何配置logback 配置详解详细打印出类方法

logback系列之三:输出日志到文件(滚动) -
- ITeye技术网站
博客分类:
logback系列之三:输出日志到文件(滚动)
实际生产中,每天都有大量的日志生成,单个文件(FileAppender)已经不能满足要求,RollingFileAppender继承了FileAppender,并提供了更多的功能:
每天生成一个日志文件
将前一天的日志重命名为包含日期的格式
根据需要,删除过期历史日志
和类似,改动的地方:
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" /&
调用测试类的方法,生成heuristic-.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 parentsRawFileP // 使用file值
return timeBasedFileNamingAndTriggeringPolicy
.getCurrentPeriodsFileNameWithoutCompressionSuffix();
public String getParentsRawFileProperty() {
return parent.rawFileProperty();
ch.qos.logback.core.FileAppender类
final public String rawFileProperty() {
return fileN
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");
if (rollingPolicy == null) {
addError("No RollingPolicy was set for the RollingFileAppender named "
+ getName());
addError("For more information, please visit "+CODES_URL+"rfa_no_rp");
TimeBasedRollingPolicy类实现了上面的两个接口,triggeringPolicy和rollingPolicy都指向TimeBasedRollingPolicy的实例对象。
c. 如果file指定,前一天的文件名改为fileNamePattern的值(/logs/heuristic-.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 }
if (getParentsRawFileProperty() == null) {
future = asyncCompress(elapsedPeriodsFileName, elapsedPeriodsFileName, elpasedPeriodStem); // file未指定,异步压缩
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 = nowInM
if (periodsElapsed & 1) {
addInfo("periodsElapsed = " + periodsElapsed);
// 从待删除日志的终止日期开始,每次回退一天,删除过期日志
for (int i = 0; i & periodsE 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
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");
// 返回,不会进行后面的记录日志操作
浏览 22669
不错的文章。这里删除过期的日志,通过编码实现?不好意思没写清楚,logback已经实现了,只需要在logback[-test].xml文件中配置maxHistory属性就可以了。
浏览: 560670 次
来自: 杭州
引用[lis[color=indigo][/color]t][ ...
讲解的很不错,收益了。感谢发表者;
感谢整理,Java初学者受益良多
启动服务端项目: 浏览器输入:http://localhost ...logback配置---Spring集成logback
我的图书馆
logback配置---Spring集成logback
Spring集成logback有个链接:/qos-ch/logback-extensions/wiki/Spring暂时Spring还不直接支持logback,所以需要手动配置上监听器,需要logback-ext-spring-version.jar支持,这个jar包可以到百度网盘:/share/link?shareid=&uk= 下载,也可下载源代码手动打包&pom.xml文件中添加配置:&&& &&& &!-- logback start --&&&& &&& &&&& &dependency&&&&&&&&&&&&&& &groupId&org.slf4j&/groupId&&&&&&&&&&&&&& &artifactId&slf4j-api&/artifactId&&&&&&&&&&&&&& &version&1.7.5&/version&&&&&&&&&&&&&& &type&jar&/type&&&&&&&&&&&&& &scope&compile&/scope&&&&&&&&&&& &/dependency&&&&&&&&&&& &dependency&&&&&&&&&&&&&& &groupId&ch.qos.logback&/groupId&&&&&&&&&&&&&& &artifactId&logback-core&/artifactId&&&&&&&&&&&&&& &version&1.0.13&/version&&&&&&&&&&&&&& &type&jar&/type&&&&&&&&&&& &/dependency&&&&&&&&&&& &dependency&&&&&&&&&&&&&& &groupId&ch.qos.logback&/groupId&&&&&&&&&&&&&& &artifactId&logback-classic&/artifactId&&&&&&&&&&&&&& &version&1.0.13&/version&&&&&&&&&&&&&& &type&jar&/type&&&&&&&&&&& &/dependency&&&&&&&&& &!-- logback end --&&resources下添加配置文件:logback.xml&configuration&&!-- 尽量别用绝对路径,如果带参数不同容器路径解释可能不同 --&&&&&& &property name="LOG_HOME" value="logs/"/& &&&&&&& &appender name="Console" class="ch.qos.logback.core.ConsoleAppender"&&&& &&& &encoder&&&& &&& &&& &pattern&%d{H:mm} %-5level [%logger{16}] %msg%n&/pattern&&&& &&& &/encoder&&&& &/appender&&&&&&&& &!-- 按照每天生成日志文件 --&&&&&& &appender name="FILE"&&&&&&&& class="ch.qos.logback.core.rolling.RollingFileAppender"&&&&&&&&&& &Encoding&UTF-8&/Encoding&&&&&&&&&& &rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&&&&&&&&&&&&&& &FileNamePattern&${LOG_HOME}/myApp.%d{yyyy-MM-dd}.log&/FileNamePattern&&&&&&&&&&&&&& &MaxHistory&30&/MaxHistory&&&&&&&&&& &/rollingPolicy&&&&&&&&&& &layout class="ch.qos.logback.classic.PatternLayout"&&&&&&&&&&&&&& &pattern&%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n&&&&&&&&&&&&& &/pattern&&&&&&&&& &/layout&&&&&& &/appender&&&&&&& &!-- 用来设置某一个包或者具体的某一个类的日志打印级别,包名要与实际项目一致 --&&&& &logger name="com.bcc" level="debug" /& &!-- 将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root处理,本身并不打印 --&&&& &root level="info"& &!-- root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console; --&&&& &&& &appender-ref ref="Console" /& &!-- 标识这个appender将会添加到这个logger --&&&& &&& &appender-ref ref="FILE" /&&&& &/root&&/configuration&&web.xml中加入:&&& &context-param&&& &&&& &param-name&logbackConfigLocation&/param-name&&& &&&& &param-value&classpath:logback.xml&/param-value& &!-- classpath是指 WEB-INF文件夹下的classes目录& --&&& &&/context-param&&& &&listener&&& &&&& &listener-class&ch.qos.logback.ext.spring.web.LogbackConfigListener&/listener-class&&& &&/listener&注意路径保存位置&类中加入:private static Logger log = LoggerFactory.getLogger(ClassName.class)即可打log了 优先级由低到高分别为&&& log.trace("======trace");&&&&&& log.debug("======debug");&&&&("======info");&&&&log.warn("======warn");&&&&log.error("======error");&&& String&name&=&"Aub";&&&&String&message&=&"3Q";&&&&String[]&fruits&=&{&"apple",&"banana"&};&&&&&&&&//&logback提供的可以使用变量的打印方式,结果为"Hello,Aub!"&&&&("Hello,{}!",&name);&&&&&&&&//&可以有多个参数,结果为“Hello,Aub!&3Q!”&&&&("Hello,{}!&&&{}!",&name,&message);&参考:http://my.oschina.net/bshy/blog/118562&
发表评论:
TA的最新馆藏[转]&}

我要回帖

更多关于 slf4j logback 配置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信