一、前言
前段时间爆出Log4j安全漏洞的事情,XX云因未及时报告漏洞被工信部暂停网络安全威胁和漏洞信息共享平台合作单位(https://www.cstis.cn/),话说Java的日志组件真是多而且也比较乱,后续几篇文章就聊一下各日志组件的使用及区别。
注:话说XX云的ICON还在平台上是忘记删除了吗?
二、JDK内置日志
java.util.logging.Logger是从JDK1.4开始就存在,但项目中使用的比较少。
1、JDK自带日志默认配置文件
jre/lib/logging.properties
-
默认仅配置了控制台输出,如果要输出文件需要把FileHandler配置起来。
-
默认全局日志级别是INFO,可以定义某个包的日志级别。
-
日志级别排序:SEVERE(最高) -> WARNING -> INFO -> CONFIG -> FINE -> FINER -> FINEST(最低),如果设置为INFO级别,只会输出INFO及以上级别WARNING或者SEVERE,低级别的都不会输出。别外两个类型OFF代表关闭所有级别日志,ALL代表开放所有级别日志。
2、例子
-
同名的logger仅会创建一个对象,内部LogManager.LoggerContext使用Map来保存已经创建的对象。
private final Hashtable<String,LoggerWeakRef>
namedLoggers = new Hashtable<>();
-
设定了日志级别仅能打印本级别及更高级级别日志信息。
3、自定义文件输出日志格式
上面代码会生成4个日志文件testLog0.log、testLog1.log、testLog2.log、testLog3.log,其中testLog0.log为空文件比较奇怪,是BUG吧?
默认文件的输出格式是XML,可以自定义日志输出格式。
三、common-logging
common-logging是apache提供的一个通用日志接口,可以让应用程序使用日志不依赖于具体的实现类,提供了对Log4j、jdk内置Log、Avalon LogKit进行简单的包装,在应用程序运行时会动态适配找到对应的日志实现类。
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
动态查找具体流程如下
commons-logging.properties
1、查找 org.apache.commons.logging.LogFactory配置对应的工厂类。
2、如果step1未找到则再通过SPI机制查找扫描所有依赖包中的 /META-INF
/services/org.apache.commons.logging.LogFactory,如果找到则使用里边的配置。
注:SPI机制的原理,见 SPI机制详解。
3、如果step2未找到,再通过查找
org.apache.commons.logging.Log属性配置,如果存在使用它的配置。如上面例子中commons-logging.properties配置为SimpleLog,则会使用commons-loggings提供的简单日志实现。这里可以配置log4j的实现类和工厂类。
4、如果step3未找到,则使用默认JDK内置实现java.util.logging.Logger, Jdk14Logger。
common-logging具体实现类有如下几种: