首页 > 编程知识 正文

java全端项目,java 日志收集系统

时间:2023-05-03 23:17:33 阅读:20223 作者:2721

jva % E6 % 97 % a5 % E5 % BF % 97 % 20 slf4j % E6 % 98 % af % E6 % 97 % a5 % e9 % A8 % e9 % a2api % e9 % 25 API 22 % 25 % 20j % 20从属% 20 groupid log4j % 2f groupid % 20 artifact id log4j %2fartifactid % 20版本1.2.17 % 2f版本% 0a % 20 log4j.root logger % 3d info % 2c控制台log4j.appender.console % 3d org % 20 arget % 3d system.out log4j.apppender og4j.appender.console.appender % 20h : mm 3360 ss % 7d % 20 % 5b % 25p % 5d % 20 % c : % 25m % 20 % E4 % BD % bb 28 main.class % 29 % 3b % 202 % 20 log4j2% 20 dependency % 20 groupid org.Apache.20 % 20 fact id % 20版本2.12.1 % 2f versid es % 0a % 20根日志ger.0 % 20 % 20 % 3d % 20 stdout appender.console.type % 20 % 3d % 20 console appender.console.name % % 20 % 25d % 7b yyyy-mm-DD % 20hh : mm 3360 ss % 7d % 20 % 5b % 25p % 5d % 20 % c 3360 % 25 % 20rt % 20 org.Apache.loging 0 log manager.get loger % 200 groupid ch.QoS.logback % 2f groupid % 20 artifactidlogback-classic %2fartifactid % 20 version 1 ion % 3d % 271.0 % 27 % 20编码% 3d % 27 utf-8 % 27 %3fconfiguration % 20 appender % 20 name % 3d % 27 console % 2027 % 20 ender % 20 % 5b % 25p % 5d % 20 % c : % 25m % 25 % 207调试% 27 % 20 appender-ref % 20 ref % 3d % 27 console % 27 % 20 % 2f % 20 0 logger % 20 % 3d % 20 logger factory.getlogger % 28 main.class % 29 % 3b % 20 % E5 % 90 % 84 % E4 % 25 % 20 % BD % BF % E7 % 5 % B0 % B1 % 20b % a3 % E7 % A0 % 81 % E4 % b8 % ad % E7 % 9a % 84 logger % E6 % 9c % AC % E5 % B0 % B1 % E6 % 98 % afsl f4j % fgroupid % 20 artifact id log4j %2fartifactid % 20 versi iid

ndency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.29</version></dependency>

log4j2的实现方式,引入log4j-slf4j-impl

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.12.1</version></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.9.0</version></dependency>

这样组装后就可以用slf4j的写法了

import org.slf4j.Logger;import org.slf4j.LoggerFactory;...static final Logger LOGGER = LoggerFactory.getLogger(Main.class); 多依赖项目的日志统一

事实上,我们的项目可能有很多依赖,各个依赖有可能有着各不相同的日志实现方式。比如我们有五个依赖,他们分别是:

独立log4j独立log4j2slf化log4jslf化log4j2slf化logback 因为logback只能slf化,没有独立使用的方式,所以是5种。

而当前我们项目期望使用logback,并期望统一为slf化的logback形式,只配置一个logback.xml就能对所有依赖进行配置。以下配置几乎是万能的,当遇到问题的时候,直接全部拷贝进去,稳定解决,绝不复发。

<!-- 处理单独log4j的依赖: --><!-- 用log4j-over-slf4j替换log4j,使依赖中的log4j也能"实现"slf4j--><dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.29</version></dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>99.99.99</version></dependency><!-- 处理单独log4j2的依赖: --><!-- 用log4j-to-slf4j替换log4j2,使依赖中的log4j2也能"实现"slf4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.12.1</version></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>99.99.99</version></dependency><!-- 处理slf化的log4j的依赖: --><!-- 因为slf选binding的时候有多个候选,为防止slf4j-log4j12选中,直接去掉他 --><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>99.99.99</version></dependency><!-- 处理slf化的log4j2的依赖: --><!-- 因为slf选binding的时候有多个候选,为防止log4j-slf4j-impl选中,直接去掉他 --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>99.99.99</version></dependency><!-- 最后引个新版本的logback --><dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version></dependency> 小结 slf4j-log4j12:与log4j联合使用,用于使当前项目的log4j实现slf标准log4j-slf4j-impl:与log4j2联合使用,用于使当前项目的log4j实现slf标准log4j-over-slf4j:与剔除log4j联合使用,替换log4j,使log4j实现slf。用于让单独用log4j的依赖能遵循slf,进而统一日志配置。log4j-to-slf4j:与剔除log4j2联合使用,替换log4j2,使log4j2实现slf。用于让单独用log4j2的依赖能遵循slf,进而统一日志配置。 原理

slf4j是门面,大的设计模式是门面系统,而logback是直接实现了slf4j-api中的接口,是通过接口实现的方式完成了门面的实现。

而log4j和log4j2没有直接实现接口,所以需要个适配器。slf4j-log4j12和log4j-slf4j-impl就是适配器,将原本不能实现slf4j的变得也能实现这个标准了。添加了适配器后,就能使用slf4j的接口来使用log4j了。

项目的依赖中独立使用了log4j/log4j2,注意是依赖中,这时候想要统一到slf4j上来,就需要log4j-over-slf4j/log4j-to-slf4j。 以log4j-over-slf4j为例,他实际上是重写了log4j所有的类,将原来的info、debug等等方法委托给slf4j执行了,上面我们将log4j用不存在版本的方式彻底剔除了log4j中的类,使依赖加载的类被偷梁换柱为log4j-over-slf4j中的logger,这个logger中方法又委托给slf4j,slf4j向下找binding找到仅存的logback。

下面是log4j和log4j-over-slf4j重写的logger类,他们形式上一样包括包名,这里就放一张图了

然后都是继承Category这个类,实际上主要的方法实现都在这里,下面分别是log4j包和log4j-over-slf4j包中的Category:

从图中可以看出log4j就是自己在写日志,而后者则委托给了slf4j。

这是slf官网的图。

不存在版本的方式剔除log4j是一种暴力方式,其实目的是让原来的log4j不要先加载就行,可以在pom中将log4j-over-slf4j写在log4j前面就行,log4j写存在的版本就行(因为也不会加载)。

疑惑:pom中不写log4j会有问题吗?

f62732e636e2d6e6f7274682d312e6d79687561776569636c6f75642e636f6d2f313931312f6c65676163792e706e67)

不存在版本的方式剔除log4j是一种暴力方式,其实目的是让原来的log4j不要先加载就行,可以在pom中将log4j-over-slf4j写在log4j前面就行,log4j写存在的版本就行(因为也不会加载)。

疑惑:pom中不写log4j会有问题吗?

回答:可能会有问题。maven决定了依赖的加载顺序,假如用了log4j的依赖叫A。不写log4j在pom中就必须保证log4j-over-slf4j写在A前面。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。