多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例相关的知识,希望对你有一定的参考价值。


多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例

  • ​​分别使用三个日志框架建好测试​​
  • ​​log4j​​
  • ​​log4j2​​
  • ​​logback​​
  • ​​上面的三个同时引入一个应用中​​
  • ​​将日志统一使用slf4j标准​​
  • ​​不能修改pom文件如何操作统一日志格式​​
  • ​​log4j2 桥接器​​

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_mvc

分别使用三个日志框架建好测试

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();

效果

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_mvc_02

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();

效果

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_mvc_03

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();

效果

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_java_04

上面的三个同时引入一个应用中

添加依赖:

<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();

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_java_05

从上面我们发现完全是可以的每个应用使用自己的日志,但是这样我们发现日志打出来就是五花八门,不能使用同一的格式输入,我们如何操作

将日志统一使用slf4j标准

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_jar_06


根据这个手写方案进行修改:

将上面的代码注释部分放开即可,这里不贴代码了

说明一定logback已经实现了slf4j的标准:所以不需要处理

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_java_07

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_mvc_08


上面这个警告比较好处理排除掉就可以:

<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>

想使用那个就把不需要使用的排除掉:

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_java_09


多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_mvc_10

这已经很方便了发现,也可以完全达到我们的目的了,格式统一,但是有一个问题就是,我们这个地方是我们自己写的应用可以随时修改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>

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_java_11


也达到格式统一的要求了;

依赖关系:

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_zookeeper_12

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三个日志框架为例_java_13

多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_jar_14


多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_jar_15


多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例_zookeeper_16


以上是关于多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例的主要内容,如果未能解决你的问题,请参考以下文章

log4j日志输出级别

日志学习-log4j

如何在log4j2.xml中动态设置日志文件路径

多进程log4j日志混乱问题分析

log4j源码探究

在 WebSphere Application Server、log4j 中启用 MyBatis SQL 日志