一篇文章读懂Java日志框架

本文详细介绍了Java日志框架的发展历程,包括System.out|err、Log4j、JUL、JCL、Logback、Slf4j和Log4j2等。分析了各框架的使用方式、设计理念和性能,并给出了日志框架的优先级排序。Log4j2+Slf4j在性能上表现出色,而Slf4j作为一个门面,可以根据项目需求选择合适的实现。
摘要由CSDN通过智能技术生成

一篇文章读懂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. 从功能上看

  1. Log4j、JUL、Logback、Log4j2 为日志实现
  2. 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ü

从时间线和作者上来看,这几种日志框架的背景是有故事的。

  1. JUL 的产生时间再Log4j之后,当时Log4j已经是一个很流行的框架了,为何JDK不采用其作为日志标准呢?
  2. Log4j和JCL成熟之后 Ceki Gülcü 为何又要推出Slf4j+Logback呢?
    JCL存在类加载问题
    Logback比Log4j更好
  3. 有了Slf4j和Logback之后Apache为何又要弄个Log4j2呢?
  4. 在实际应用中应该选用哪种日志框架呢?
    建议的是按需使用,冲突升级,新业务启动采用目前最好的,下面给一个简单的优先级排序
    Log4j2+Slf4j > Logback+Slf4j > Log4j+Slf4j > Log4j + JCL > Log4j > JUL > 不用日志框架

二、几种日志框架的分析

每种日志框架主要会从如下几点进行分析

  1. 使用方式
  2. 代码实现
  3. 输出样式

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();
    }

输出样式:
System.out|err控制台输出样式

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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值