目录
一篇文章读懂Java日志框架
日志组件 | 作者 | 发布时间 | 目前状态 |
---|---|---|---|
System.out | JDK1.0 | 1996年6月 | - |
Log4j1 | Ceki Gülcü 创建 & Apache维护 | 2000年 | 停止维护 |
JUL(java.util.logging) | JDK1.4 | 2002年2月 | - |
JCL(Jakarta Commons Logging) | Apache | 2002年8月 | - |
Slf4j | Ceki Gülcü | 2005年4月 | - |
Logback | Ceki Gülcü | 2006年7月 | - |
Log4j2 | Apache | 2012年7月 | - |
对现有常用的一些日志框架的整理和简单的分析(如果不是日志框架有冲突,其实我也懒得搞)。
大概半年前换了项目组,之前主要使用的日志框架是Logback,现在项目组使用的日志框架为公司内部封装的Log4j。不是很习惯目前的日志格式,使用中也经常出现一些碎片化的问题,整理成此文(想到哪写到哪,可能有逻辑不通顺或者不完整的地方)。
一、日志框架发展简史
1. 从功能上看
- Log4j、JUL、Logback、Log4j2 为日志实现
- JCL、Slf4j 为日志门面(Log4j2中log4j-api其实也是,用得不多)
为什么要区分日志实现和日志门面?
2. 从时间上看
- 最早使用的日志为JDK自带的System.out
- Log4j是一个最早的通用Java日志框架
- 目前最晚出现的通用日志框架为Log4j2
一般来说,晚出现的日志框架的性能和通用性会好与先前的日志框架(存在即合理)
3. 从作者上看
- System.out|err,JUL的作者为
JDK
- Log4j、JCL、Log4j2目前是
Apache
在维护的 - Log4j、Slf4j、Logback的作者是
Ceki Gülcü
从时间线和作者上来看,这几种日志框架的背景是有故事的。
- JUL 的产生时间再Log4j之后,当时Log4j已经是一个很流行的框架了,为何JDK不采用其作为日志标准呢?
- Log4j和JCL成熟之后
Ceki Gülcü
为何又要推出Slf4j+Logback呢?
JCL存在类加载问题
Logback比Log4j更好- 有了Slf4j和Logback之后Apache为何又要弄个Log4j2呢?
- 在实际应用中应该选用哪种日志框架呢?
建议的是按需使用,冲突升级,新业务启动采用目前最好的,下面给一个简单的优先级排序
Log4j2+Slf4j > Logback+Slf4j > Log4j+Slf4j > Log4j + JCL > Log4j > JUL > 不用日志框架
二、几种日志框架的分析
每种日志框架主要会从如下几点进行分析
- 使用方式
- 代码实现
- 输出样式
1. System.out|err
使用方式: JDK自带,直接用
代码实现:
public static void printLog() throws IOException {
// 控制台输出
System.out.println("log info");
System.err.println("log error");
PrintStream printStream = null;
// 重定向到文件
File file = new File("sys.log");
if (!file.exists()) {
file.createNewFile();
}
printStream = new PrintStream(new FileOutputStream(file));
System.setOut(printStream);
System.setErr(printStream);
// 文件输出
System.out.println("log info");
System.err.println("log error");
}
public static void main(String[] args) throws IOException {
printLog();
}
输出样式:
2.Log4j
使用方式: 需要引入一个Jar包,增加一个配置文件
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
log4j.properties
# LOG4J配置
log4j.rootCategory=DEBUG,stdout,file
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{
yyyy-MM-dd HH:mm:ss,SSS} %5p %c{
1}:%L - %m%n
# 日志输出到文件
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=resources/log/log4j.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{
yyyy-MM-dd HH:mm:ss,SSS} %5p %c{
1}:%L - %m%n
代码实现:
public class Log4jDemo {
static Logger logger = Logger.getLogger(Log4jDemo.class);
public static void mai