一、log4j.jar
适用于普通java项目只导入该包,加上配置文件就可以实现记录日志的功能
1. pom.xml
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. 代码示例
package com.ykq;
import org.apache.log4j.Logger;
/**
* @author YKQ
* 当没有配置文件log4j.properties时,并且使用了log4j的工具类
* 报如下错:
* log4j:WARN No appenders could be found for logger (com.ykq.Log4jLearn).
* log4j:WARN Please initialize the log4j system properly.
* log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
*
*/
public class Log4jLearn {
private static final Logger LOGGER = Logger.getLogger(Log4jLearn.class);
public static void main(String[] args) {
// error级别日志.
LOGGER.error("一二三四五六七八九");
// info级别日志.
LOGGER.info("123456789");
// info级别及以下等级日志带参数.不建议直接使用+拼接,建议如下方式
if(LOGGER.isInfoEnabled()) {
LOGGER.info("123456789" + new Object());
}
// debug级别日志.
LOGGER.debug("壹贰叁肆伍陆柒捌玖");
if(LOGGER.isDebugEnabled()) {
LOGGER.debug("壹贰叁肆伍陆柒捌玖" + new Object());
}
}
}
3. log4j.properties
# 根logger设置,定义info级别的日志的,则比info等级低的日志,都不会打印,比info高的都会打印
# 例如:error级别的日志都会打印,而debug级别的日志都不会打印
# 这表示日志级别为INFO,而console和file是别名,都是INFO级别日志的别名
log4j.rootLogger = INFO,console,file
# 输出信息到控制台
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
# 输出到控制台的布局格式
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%p] %d{yyyy-MM-dd HH:mm:ss} %l-%m%n
# 输出INFO 级别以上的日志文件设置
# 每天只产生一个文件
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
# 输出到文件以及文件的位置
log4j.appender.file.File = target/LogProject-interface.log
log4j.appender.file.Append = true
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %l - [ %p ]-%m%n
二、commons-logging.jar
common-logging不具体实现日志功能,只是提供java.util.logging和log4j的高层实现接口。当没有导入log4j时,common-logging默认实现java.util.logging。当导入了log4j时,优先实现log4j。
1. pom.xml
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2.代码实现
package com.ykq;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author YKQ
* 没有导入log4j情况下
*/
public class CommonsLogLearn {
/**
* 使用common-logging的类
*/
private static final Log LOG = LogFactory.getLog(CommonsLogLearn.class);
/**
* 使用java.util.logging的类
*/
private static final Logger LOGGER = Logger.getLogger("com.ykq.CommonsLogLearn");
public static void main(String[] args) {
LOG.error("123456789");
if(LOG.isInfoEnabled()) {
LOG.info("一二三四五六七八九");
}
/**
* 由于java.util.logging没有debug级别的日志,不会打印
*/
if(LOG.isDebugEnabled()) {
LOG.debug("壹贰叁肆伍陆柒捌玖");
}
/**
* 严重级别
*/
LOGGER.log(Level.SEVERE, "123456798");
/**
* 信息级别
*/
LOGGER.log(Level.INFO, "一二三四五六七八九");
}
}
3.结果演示
可以看到commons-logging打印的日志和java.util.logging的日志格式是一样的。这是因为common-logging此时就是一个java.util.logging的一个接口。
4.导入log4j代码演示
package com.ykq;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author YKQ
*/
public class CommonsLogLearn {
/**
* 使用common-logging的类
*/
private static final Log LOG = LogFactory.getLog(CommonsLogLearn.class);
/**
* 使用java.util.logging的类
*/
private static final Logger LOGGER = Logger.getLogger("com.ykq.CommonsLogLearn");
/**
* 使用log4j的方式.
*/
private static final org.apache.log4j.Logger LOGG
= org.apache.log4j.Logger.getLogger(CommonsLogLearn.class);
public static void main(String[] args) {
LOG.error("common-logging-123456789");
if(LOG.isInfoEnabled()) {
LOG.info("common-logging-一二三四五六七八九");
}
/**
* 由于java.util.logging没有debug级别的日志,不会打印
*/
if(LOG.isDebugEnabled()) {
LOG.debug("common-logging-壹贰叁肆伍陆柒捌玖");
}
/**
* 严重级别
*/
LOGGER.log(Level.SEVERE, "java.util.logging-123456798");
/**
* 信息级别
*/
LOGGER.log(Level.INFO, "java.util.logging-一二三四五六七八九");
LOGG.error("log4j-123456798");
LOGG.info("log4j-一二三四五六七八九");
}
}
5.效果演示
可以看出commons-logging的类打印的日志是和log4j的打印日志实现效果是一样的。
三、slf4j.jar通过java.util.logging实现记录日志
slf4j类似commons-logging也只是接口,不过他更全面,提供了各种日志的实现接口。
1. pom.xml
<!-- slf4j api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 桥接jdk记录日志的方式 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
</dependency>
2.代码实现
package com.ykq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jLogLearn {
/**
* slf4j实现记录日志的方式.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jLogLearn.class);
public static void main(String[] args) {
LOGGER.error("123456789");
}
}
3.实现效果
可以看出是java.utl.logging记录日志的格式。
四、slf4j.jar通过log4j实现记录日志
导入上面章节log4j.jar的包以及配置文件,同时导入下面pom.xml包,按下面方式实现。
1. pom.xml
<!-- slf4j api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 桥接log4j记录日志的方式 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
2.代码实现
package com.ykq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jLogLearn {
/**
* slf4j实现记录日志的方式.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jLogLearn.class);
public static void main(String[] args) {
LOGGER.error("123456789");
}
}
3.实现效果
可以看到代码实现没有变,但打印日志的方式变成了log4j的方式。
五、slf4j通过logback(slf4j的原生实现)记录日志
slf4j虽然给java.util.logging和log4j以及commons-logging都提供了接口方式实现记录日志,但其实他本身也有一套实现记录日志的方式,即通过logback方式记录日志.
1.pom.xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- logback记录日志 -->
<!--logback-classic依赖logback-core,会自动级联引入-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
2.代码实现
package com.ykq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jLogLearn {
/**
* slf4j实现记录日志的方式.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jLogLearn.class);
public static void main(String[] args) {
LOGGER.error("123456789");
}
}
3.实现效果
上面在pom中没有导入桥接logback的包,同时也没有配置logback.xml,但是还是打印了日志,可以看出slf4j与logback的兼容性极好。