日志服务们的区别

一. 常用的日志框架

  • SLF4J
  • Log4j
  • Logback

二. 概念

SLF4J(Simple logging Facade for Java):
  • 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j,logback,java.util.logging等,它们才实现了具体的日志系统的功能。
Log4j(log for java):
  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
Logback:
  • logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现(即直接实现了slf4j的接口,而log4j并没有直接实现,所以就需要一个适配器slf4j-log4j12.jar),
  • logback一共有以下几个模块:
    1. logback-core:其它两个模块的基础模块
    2. logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
    3. logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

三. 选择

为什么要使用SLF4J?
  • slf4j是一个日志接口,自己没有具体实现日志系统,只提供了一组标准的调用api,这样将调用和具体的日志实现分离,使用slf4j后有利于根据自己实际的需求更换具体的日志系统,比如,之前使用的具体的日志系统为log4j,想更换为logback时,只需要删除log4j相关的jar,然后加入logback相关的jar和日志配置文件即可,而不需要改动具体的日志输出方法,试想如果没有采用这种方式,当你的系统中日志输出有成千上万条时,你要更换日志系统将是多么庞大的一项工程。如果你开发的是一个面向公众使用的组件或公共服务模块,那么一定要使用slf4的这种形式,这有利于别人在调用你的模块时保持和他系统中使用统一的日志输出。

  • slf4j日志输出时可以使用{}占位符,如,logger.info(“testlog: {}”, “test”),而如果只使用log4j做日志输出时,只能以logger.info(“testlog:”+”test”)这种形式,前者要比后者在性能上更好,后者采用+连接字符串时就是new 一个String 字符串,在性能上就不如前者。

Logback都有哪些优势?
  • 更快的实现:内核被重写,关键执行路径性能提升10倍以上,且初始化内存加载更小;
  • 非常充分的测试:据说测试了几年(也不知道真的假的,不过不重要);
  • logback-classic实现了slf4j:方便切换其他日志系统,比如log4j,更换时只需要更换jar包,不需要变更通过slf4japi实现的代码
  • 官方充分的文档:据说有两百多页(无聊的时候可以瞅瞅);
  • 自动重新加载配置文件:当配置被修改,logback-classic能自动加载配置文件,并且不需要创建另一个扫描线程(快&安全)
  • Lilith是log事件的观察者,跟log4j的chainsaw类似。但lilith可以处理大数量的log数据;

参考链接:

https://www.cnblogs.com/hanszhao/p/9754419.html