Java 日志体系

由一张图说起

图来源于https://www.slf4j.org/legacy.html

图中讲的如何通过SLF2J把各种日志框架桥接起来(可见java的日志框架之多)。
主要有三部分:

都变为logback

  • commons loging api –(jcl-voer-slf4j.jar)–> logback
  • log4j –(log4j-over-slf4j.jar)–> logback
  • java.util.logging –(jul-to-slf4j.jar)–> logback

都变为log4j

  • commons loging api –(jcl-voer-slf4j.jar)–> log4j
  • java.util.logging –(jul-to-slf4j.jar)–> log4j

都变为java.util.logging

  • commons loging api –(jcl-voer-slf4j.jar)–> slf4j-jdk14.jar
  • log4j –(log4j-over-slf4j.jar)–> slf4j-jdk14.jar

总之,通过slf4j的桥接可以替换现有程序中的日志框架。

实践由java.util.logging 替换成logback

示例代码,没加任何第三方依赖

1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
Logger loger = Logger.getLogger(Main.class.getName());
loger.info("this is info");
}
}

现在把上面的程序java.util.logging库换成logback。

先是要按上面的那图,把依赖加好。

  • jul-to-slf4j
  • slf4j-api
  • logback-classic

结果运行,还是一样的结果。经过搜索,还要做一些替换的安装的工作。
替换后的代码如下

1
2
3
4
5
6
7
8
9
public class Main {
public static void main(String[] args) {
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();

Logger loger = Logger.getLogger(Main.class.getName());
loger.info("this is info");
}
}

新加的两行可以放在别的代码初始化的位置。

举一反三,其它的几种,按上面的介绍,也是能顺利桥接的。

各日志系统的介绍

log4j

Apache 的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。

Logback

Logback 是由 log4j 创始人设计的又一个开源日记组件,Logback 当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块,logback-classic是log4j的一个 改良版本。此外logback-classic 完整实现 SLF4J API 使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。

Logback 作为一个通用可靠、快速灵活的日志框架,Logback 声称具有极佳的性能。

SLF4J

简单日志门面(Facade) SLF4J 是为各种 loging APIs 提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。

Apache Common-Logging

目前广泛使用的Java日志门面库。通过动态查找的机制,在程序运行时自动找出真正使用的日志库。


那么这些日志怎么用,之间的依赖是什么样子的,还有启动初始化的过程究竟干了什么,怎么找到相应的实现类及配置的。

可以看下oschina上的系列文章

这几篇的作者从源码解析的角度分析日志库的原理。

总结

  • 了解java系统中常见的几种日志系统
  • 能桥接和切换各个日志系统
  • logback+slf4j是目前比较公认较好的日志组合,新项目建议选用

参考


Java 日志体系
https://blog.fengcl.com/2017/09/08/java-log-system/
作者
frank
发布于
2017年9月8日
许可协议