Java日志体系 约定不等于承诺〃 2022-04-22 19:12 183阅读 0赞 > 日志框架可以说是软件系统的标配,平时使用日志的时候多数只是了解日志配置怎么配,对于这些日志框架的不同以及他们之间的关系很少了解。 Java中的日志体系可以用杂乱无章来形容,因为很多,今天就来梳理下这些日志框架到底是怎么回事。 ### 当前主流的log技术名词 ### * log4j * jcl(Jakarta Commons Logging) * jul(java util logging) * log4j2 * slf4j * logback * simple-log #### 一、jul(java util logging) #### java自带的日志记录技术,可以直接记录日志 **示例:** import java.util.logging.Logger; public class JUL { public static void main(String[] args) { Logger logger = Logger.getLogger("JUL"); logger.info("java util logging"); } } ![javautillogging][] #### 二、log4j #### log4j是Apache的一个开源项目,可以不需要依赖第三方技术,直接记录日志 **Dependency:** log4j-1.2.17.jar、log4j.properties **示例:** import org.apache.log4j.Logger; public class Log4j { public static void main(String[] args) { Logger logger = Logger.getLogger(Log4j.class); logger.info("log4j"); } } ![log4j][] #### 三、log4j2 #### log4j2和log4j是同一个作者开发,只不过log4j2是重新架构的一款日志组件,抛弃了log4j的不足,以及吸取了优秀的logback的设计重新推出的一款新组件。 **Dependency:** log4j-core-2.11.1.jar、log4j-api-2.11.1.jar、log4j2.xml **示例:** import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4j2 { public static void main(String[] args) { Logger logger = LogManager.getLogger("log4j2"); logger.info("log4j2"); } } ![log4j2][] #### 4.jcl(Jakarta Commons Logging) #### jcl是apache公司开发的一个抽象日志通用框架,本身不实现日志记录,但是提供了记录日志的抽象接口方法(info,debug,error…)。jcl默认使用jul打印日志,如果项目依赖了log4j jar包,则使用log4j打印日志。 **示例:** import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class JCL { public static void main(String[] args) { Log log = LogFactory.getLog("JCL"); log.info("jakatra common logging"); } } **Dependency:** commons-logging-1.2.jar ![jul][] **Dependency:** commons-logging-1.2.jar 、log4j-1.2.17.jar ![log4j][log4j 1] **为何是这种匹配机制呢?下面我们进入源码看下:** ![LogFactoryImpl][] ![classesToDiscover][] 通过查看源码可以看出,底层通过一个数组存放具体的日志框架的类名,然后循环数组依次去匹配这些类名是否在项目中被依赖了,如果找到依赖则直接使用,**有先后顺序,log4j>jul**。 #### 五、slfj(Simple Logging Facade for Java) #### Java的简单日志门面(SLF4J)用作各种日志框架的简单门面或抽象,像jul、logback和log4j等。SLF4J允许最终用户在部署时插入所需的日志框架,如果在项目中使用slf4j必须加一个依赖jar,即slf4j-api-xxx.jar。slf4j本身不记录日志,通过绑定器绑定一个具体的日志框架来完成日志记录。 **常用的绑定器类型:** <table> <thead> <tr> <th>绑定类型</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>slf4j-log4j12-xxx.jar</td> <td>绑定log4j,依赖log4j-xxx.jar</td> </tr> <tr> <td>slf4j-jdk14-xxx.jar</td> <td>绑定jul</td> </tr> <tr> <td>slf4j-jcl-xxx.jar</td> <td>绑定jcl</td> </tr> <tr> <td>logback-classic-xxx.jar</td> <td>绑定logback,依赖logback-core-xxx.jar</td> </tr> </tbody> </table> ![slfj绑定][slfj] **示例:** import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SL4J { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger("sl4j"); logger.info("slf4j"); } } **Dependency:** slf4j-api-1.7.25.jar、slf4j-log4j12-1.7.25.jar(绑定器) ![slf4j-log4j][] **Dependency:** slf4j-api-1.7.25.jar、sslf4j-jdk14-1.7.25.jar(绑定器) ![slfj-jul][] **总结** ![java日志体系][java] -------------------- \------------本文结束感谢您的阅读------------ [javautillogging]: /images/20220327/ddd08d3bd49648aea0a95c3381874a25.png [log4j]: /images/20220327/cf88e3ce68db4d178c5595f248bdf6e8.png [log4j2]: /images/20220327/05ea8f65e67d45c48ba37b7127202cc9.png [jul]: /images/20220327/b497266f97794234a26ebbc037ec485a.png [log4j 1]: /images/20220327/e3ead4f5c46d4e6ba5f91425cd7fb9ad.png [LogFactoryImpl]: /images/20220327/2d2801fe01f443ed8ca1b98d2a08a999.png [classesToDiscover]: /images/20220327/e3bec2d6046c4e7cb022982d209bd08f.png [slfj]: /images/20220327/f409d47108094e1fb8b4c512445c2db8.png [slf4j-log4j]: /images/20220327/f2324f8284f648a791326d3d640e56b1.png [slfj-jul]: /images/20220327/b9701f64a190462098cbc34276c5fa01.png [java]: /images/20220327/d0dfe0425edb49169d66dae4d7851299.png
还没有评论,来说两句吧...