这几天用了用Logback感觉挺爽的,性能上比log4j 1改善了不少performance(据说前些天出来的log4j 2 又相对于Logback在performance上又提升了不少),而且功能还是很强大的。
提到Logback就不得不了解SLF4j(Sample Logging Facade for java) Java简单的日志门面,从它的命名我们不难看出它是一个通用的logging接口,它兼容了Log4j 1 (Log4j 2 现在不得而知)、java.util.logging和Jakarta Commons Logging,这几个比较流行的日志框架,而Logback是SLF4j的默认实现。
使用Logback需要使用的jar:
logback-core-1.0.13.jar
logback-classic-1.0.13.jar
slf4j-api-1.7.5.jar
jcl-over-slf4j-1.7.5.jar 将common-logging.jar与slf4j对接,然后由Logback输出
Logback会在classpath 中按照如下顺序读取配置文件:
- logback.groovy
- logback-test.xml
- logback.xml
上例子:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="false">
<property name="logdir" value="D:/log"></property>
<!-- 控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- 出错日志 appender -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<!-- logdir 在maven profile里配置 -->
<fileNamePattern>${logdir}/errorlog-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- 访问日志 appender -->
<appender name="COMMON" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Encoding>UTF-8</Encoding>
<file>${logdir}/commonlog.log</file>
<!--按每小时滚动文件,如果一个天内达到10M(取决于fileNamePattern中的%d{yyyy-MM-dd_HH}还是%d{yyyy-MM-dd})也会回滚文件,回滚文件将会被压缩成zip格式 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${logdir}/commonlog-%d{yyyy-MM-dd}.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10M</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="info"/>
<!--错误日志-->
<logger name="error" level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ERROR"/>
</logger>
<logger name="com.sdw.soft" level="debug">
<appender-ref ref="STDOUT"/>
<appender-ref ref="COMMON"/>
</logger>
</configuration>
为了方便日志记录而又不手动重复一遍又一遍写private static final Logger logger = LoggerFactory.logger(XXX);
一下使用了AOP偷了懒。
/**
* @Author: Sonicery_D
* @Date: 2014-9-10
*/
@Component
@Aspect
public class LoggerUtils {
private static final Logger logger = LoggerFactory.getLogger(LoggerUtils.class);
@Pointcut(value="execution(* com.sdw.soft..*Service.*(..))")
public void printLog(){
}
@Before(value="printLog()")
public void beforeExecute(JoinPoint jp){
String methodName = jp.getSignature().getName();
String className = jp.getTarget().getClass().getName();
StringBuffer sb = new StringBuffer("类["+className+"]-方法["+methodName+"]开始执行------");
int i = 1;
for(Object obj : jp.getArgs()){
if(obj instanceof String){
sb.append("arg"+i+"="+obj.toString()+",");
}
i++;
}
logger.info("AOP 日志拦截---{}",sb.toString());
}
}