多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例相关的知识,希望对你有一定的参考价值。
多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例
- 分别使用三个日志框架建好测试
- log4j
- log4j2
- logback
- 上面的三个同时引入一个应用中
- 将日志统一使用slf4j标准
- 不能修改pom文件如何操作统一日志格式
- log4j2 桥接器
分别使用三个日志框架建好测试
log4j
依赖:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
测试代码
import org.apache.log4j.Logger;
//import org.slf4j.LoggerFactory;
public class MyLog4j
public void test1()
Logger logger = Logger.getLogger(MyLog4j.class);
logger.info("MyLog4j "+ logger.getClass().getName());
logger.error("MyLog4j "+ logger.getClass().getName());
// public void test2()
// org.slf4j.Logger logger = LoggerFactory.getLogger(MyLog4j.class);
// logger.info("MyLog4j test2 clzz= ",logger.getClass().getName());
//
public static void main(String[] args)
new MyLog4j().test1();
// new MyLog4j().test2();
效果
log4j2
依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
测试代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
//import org.slf4j.LoggerFactory;
public class MyLog4j2
public void test()
Logger logger = LogManager.getLogger();
logger.info("MyLog4j2 clzz=",logger.getClass().getName());
public void test2()
// org.slf4j.Logger logger = LoggerFactory.getLogger(MyLog4j2.class);
// logger.info("MyLog4j test2 clzz= ",logger.getClass().getName());
public static void main(String[] args)
new MyLog4j2().test();
new MyLog4j2().test2();
效果
logback
依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.5</version>
</dependency>
测试代码
在这里插入代码片
配置文件:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyLogBack
public void test()
Logger logger = LoggerFactory.getLogger(MyLogBack.class);
logger.info("MyLogBack clzz=",logger.getClass().getName());
public static void main(String[] args)
new MyLogBack().test();
效果
上面的三个同时引入一个应用中
添加依赖:
<dependency>
<groupId>log</groupId>
<artifactId>mylog4j</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.slf4j</groupId>-->
<!--<artifactId>slf4j-log4j12</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
<dependency>
<groupId>log</groupId>
<artifactId>MyLog4j2</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.apache.logging.log4j</groupId>-->
<!--<artifactId>log4j-slf4j-impl</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
<dependency>
<groupId>log</groupId>
<artifactId>myLogBack</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
public class SDK2
public static void main(String[] args)
new MyLog4j2().test();
new MyLog4j().test1();
new MyLogBack().test();
// new MyLog4j2().test2();
// new MyLog4j().test2();
// new MyLogBack().test();
从上面我们发现完全是可以的每个应用使用自己的日志,但是这样我们发现日志打出来就是五花八门,不能使用同一的格式输入,我们如何操作
将日志统一使用slf4j标准
根据这个手写方案进行修改:
将上面的代码注释部分放开即可,这里不贴代码了
说明一定logback已经实现了slf4j的标准:所以不需要处理
上面这个警告比较好处理排除掉就可以:
<dependencies>
<dependency>
<groupId>log</groupId>
<artifactId>mylog4j</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.slf4j</groupId>-->
<!--<artifactId>slf4j-log4j12</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
<dependency>
<groupId>log</groupId>
<artifactId>MyLog4j2</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.apache.logging.log4j</groupId>-->
<!--<artifactId>log4j-slf4j-impl</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
<dependency>
<groupId>log</groupId>
<artifactId>myLogBack</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
想使用那个就把不需要使用的排除掉:
这已经很方便了发现,也可以完全达到我们的目的了,格式统一,但是有一个问题就是,我们这个地方是我们自己写的应用可以随时修改pom文件,直接统一升级到slf4j标准,但是如果我们使用的是第三方jar包如何办,里面的pom文件没法升级,同时jar也没有实现slf4j标准
不能修改pom文件如何操作统一日志格式
这里我使用my2log4j 和 mylogback两个模块演示
这两个分别使用log4j 和 mylogback
sdk3 进行测试:
依赖:
<dependencies>
<dependency>
<groupId>log</groupId>
<artifactId>my2log4j</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>log</groupId>
<artifactId>myLogBack</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
思路就是:讲log4j中的依赖排除掉,使用桥接器来实现,
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.32</version>
</dependency>
也达到格式统一的要求了;
依赖关系:
log4j2 桥接器
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.13.3</version>
</dependency>
原理都一样的不再赘述了
这一篇完全从操作层面出发,下一篇从理论讲解一下
总结:
1.自己使用日志,全部使用slf4j
2.如果引用第三方jar,第三方没有使用slf4j这种日志门面,而是直接使用的日志实现框架
a。如果可以修改源码的情况可以将日志第三方jar升级到slf4j标准
b。如果不可以修改源码的情况下,我们引用第三方jar,排除其使用的日志实现,利用slf4j的桥接器来实现升级到slf4j
ps: 在引用jar包时一定要排除日志实现jar,不然会导致不起作用
slf4j的桥接器如下图:
以上是关于多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例的主要内容,如果未能解决你的问题,请参考以下文章