commons与slf4j
commons-logging和slf4j都是日志门面库, 提供统一日志接口, 再由实际的日志框架(如log4j, logback, jdk-logging)实现. 不同的是, commons-logging在程序运行时自动查询实际的日志库, 而log4j是在编译阶段静态绑定实际日志库, 并且有占位符绑定功能, 因此log4j的执行效率更高, 目前使用较多.
logback与log4j
logback和log4j由同一个创始人设计. logback-classic是log4j的一个改良版本. logback当前分成三个模块 : logback-core, logback- classic和logback-access. logback-core是其它两个模块的基础模块. 此外logback-classic完整实现slf4j api, 可以很方便地更换成其它日志系统如log4j或JDK14 Logging. logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能.
logback的优势包括:
- 实现更快, 性能更好
- 测试全面, 文档丰富
- 自然地实现slf4j api
- 能自动重载配置文件
spring使用slf4j+logback
spring默认使用commons-logging, 首先需要排除commons-logging. 需要的jar包如下:
- slf4j-api : slf4j接口库, 基础组件
- jcl-over-slf4j : commons-logging到slf4j的桥接包
- logback-core : logback基础组件
- logback-classic : 实现slf4j接口
<!-- springmvc, 其他依赖的spring组件由maven自动引入 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
<!-- 排除commons-logging -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- jcl-over-slf4j是commons-logging转换为slf4j的桥梁,
基础模块slf4j-api由maven自动引入 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- logback-classic实现slf4j接口,
基础模块logback-core由maven自动引入 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
logback.xml
在classpath目录新建logback.xml, logback配置与log4j基本相同.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<Encoding>UTF-8</Encoding>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,
%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
代码用法
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
private static final Logger logger =
LoggerFactory.getLogger(UserService.class);
public void getUser() {
logger.info("user {} is {} years old", "Aray", 13);
}
}