logback 的官方文档还有一些后续的部分,只要是将日志采用网络的方式进行存储,以及采用SSL来保证日志传输的加密。普通情况下很少用到,因此后续部分目前暂不学习。 先对之前的学习做一个总结性的例子。
一, 日志需求:
1.可以通过系统属性文件对日志的生成目录(logfiles)进行设置。
2.系统的所有日志划分为四种方式:
(1)采用控制台(console)方式输出,系统的所有日志在控制台上都进行输出。
(2)INFO及以上级别( WARN 、ERROR)的日志存储到logfiles目录下的info.log中,该文件每天自动备份一次,备份一个月的。备份文件放置logfiles目录下, info\yyyy-mm\yyyy-mm-dd.log中,日志按月自动创建文件夹进行备份。
(3)WARN及以上级别(ERROR)的日志存储到logfiles目录下的warn.log中,该文件每月自动备份一次,备份一年的。备份文件放置logfiles目录下, info\yyyy\yyyy-mm.log中,日志按年自动创建文件夹进行备份。
(4)日志信息中含有特定信息的(目前设置为special字符的)日志 存储到logfiles目录下的special.log中,该文件每月自动备份一次,备份一年的。备份文件放置
logfiles目录下special\yyyy\yyyy-mm.log中,日志按年自动创建文件夹进行备份。
具体配置文件如下:
<configuration debug="false">
<!--logback 的一个综合使用。具体实现功能参见 com.wj.study.STLogBack.composite.CompositeTest的说明-->
<property file="src/main/resource/system.properties" />
<!-- 在控制台上输出所有的日志,简单不多解释-->
<appender name="consloeAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 输出WARN,ERROR级别的日志,采用 LevelFilter进行过滤,第一次先过滤warn级别的,将mismatch的设置为Neutral,在通过第二个过滤器
对error级别的进行过滤,将mismatch的deny掉,完成只输出warn级别和error级别的目标 -->
<appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${logfile}/warn.log</file>
<!-- 滚动策略,采用aux属性实现日志的分文件夹(此处按年存储)存储,这里可以将maxhistory的值设置的更大一些,这样可以存储更多的日志 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logfile}/warn/%d{yyyy,aux}/%d{yyyy-MM}.log</fileNamePattern>
<maxHistory>12</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 输出INFO,WARN和ERROR级别的日志 ,原理与上一个相同 -->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${logfile}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logfile}/info/%d{yyyy-MM,aux}/%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>31</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 输出包含指定字符的日志 ,采用JaninoEventEvaluator进行字符串包含的判断,需要注意,需要引入Janino的jar包-->
<appender name="specialAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<expression>return message.contains("special");</expression>
</evaluator>
<OnMismatch>DENY</OnMismatch>
<OnMatch>NEUTRAL</OnMatch>
</filter>
<file>${logfile}/special.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logfile}/special/%d{yyyy,aux}/%d{yyyy-MM}.log</fileNamePattern>
<maxHistory>12</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 对所有的日志进行过滤,在具体的项目中可以扩展一下,分成不同的包进行过滤 -->
<root level="All">
<appender-ref ref="consloeAppender" />
<appender-ref ref="infoAppender" />
<appender-ref ref="warnAppender" />
<appender-ref ref="specialAppender" />
</root>
</configuration>
package com.wj.study.STLogBack.composite;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CompositeTest {
/**
* 对Logback的使用做一个综合的总结,完成下述功能。
* 1.通过属性文件配置日志的生成目录,并自动生成info,warn,special文件夹
* 2.将系统生成的所有日志在console进行展示
* 3.将系统生成的info及以上级别的日志存储到info下的info.log中
* 4.将系统生成的warn及以上级别的日志存储到warn下的warn.log中
* 5.info级别的日志每天做一次备份,备份一个月的
* 6.warn级别的日志每月做一次备份,备份一年的
* 7.当日志中包含 speciallog 时,将日志放进special.log中,每月做一次备份,备份一年的。
* @throws InterruptedException
* TRACE < DEBUG < INFO < WARN < ERROR.
*/
final static Logger logger = LoggerFactory.getLogger(CompositeTest.class);
public static void main(String[] args) throws InterruptedException {
String logString="测试日志输出,logIndex:{}";
long logIndex =1;
while(true){
Thread.sleep(1000);
logger.trace(logString, logIndex);
logger.debug(logString, logIndex);
logger.info(logString, logIndex);
logger.warn(logString, logIndex);
logger.error(logString, logIndex);
logger.error("special{}", logIndex);
logIndex++;
}
}
}
属性配置文件的内容:
#如果想放置某个路径下,D:/stlogtest
logfile=logfile
所有的源代码可以从
http://git.oschina.net/wangjian/STLogBack中下载运行。直接运行CompositeTest.java即可执行。