commons與slf4j
commons-logging和slf4j都是日志門面庫(kù), 提供統(tǒng)一日志接口, 再由實(shí)際的日志框架(如log4j, logback, jdk-logging)實(shí)現(xiàn). 不同的是, commons-logging在程序運(yùn)行時(shí)自動(dòng)查詢實(shí)際的日志庫(kù), 而log4j是在編譯階段靜態(tài)綁定實(shí)際日志庫(kù), 并且有占位符綁定功能, 因此log4j的執(zhí)行效率更高, 目前使用較多.
logback與log4j
logback和log4j由同一個(gè)創(chuàng)始人設(shè)計(jì). logback-classic是log4j的一個(gè)改良版本. logback當(dāng)前分成三個(gè)模塊 : logback-core, logback- classic和logback-access. logback-core是其它兩個(gè)模塊的基礎(chǔ)模塊. 此外logback-classic完整實(shí)現(xiàn)slf4j api, 可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging. logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能.
logback的優(yōu)勢(shì)包括:
- 實(shí)現(xiàn)更快, 性能更好
- 測(cè)試全面, 文檔豐富
- 自然地實(shí)現(xiàn)slf4j api
- 能自動(dòng)重載配置文件
spring使用slf4j+logback
spring默認(rèn)使用commons-logging, 首先需要排除commons-logging. 需要的jar包如下:
- slf4j-api : slf4j接口庫(kù), 基礎(chǔ)組件
- jcl-over-slf4j : commons-logging到slf4j的橋接包
- logback-core : logback基礎(chǔ)組件
- logback-classic : 實(shí)現(xiàn)slf4j接口
<!-- springmvc, 其他依賴的spring組件由maven自動(dòng)引入 -->
<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轉(zhuǎn)換為slf4j的橋梁,
基礎(chǔ)模塊slf4j-api由maven自動(dòng)引入 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- logback-classic實(shí)現(xiàn)slf4j接口,
基礎(chǔ)模塊logback-core由maven自動(dòng)引入 -->
<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:級(jí)別從左顯示5個(gè)字符寬度%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);
}
}