上线时候,公司要求使用log4j2,而soot 用的是 slf4j-simple,这个老项目大改起来也不好改,所以比较坑,本文记述一下这个迁移过程。
一、删去原有的slf4j-simple
就拿 soot 来说,自己的依赖里写了slf4j-simple ,可以直接删去,但删去并没有什么用,因为 soot 的依赖项里也有slf4j-simple ,这就是我们做的第一件事。
原有的 build.gradle
1 2
| compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.5' compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.5'
|
在 build.gradle 的末尾加入全局的移除,把这依赖项里的 slf4j-simple 也删了,所以上面那句加入依赖其实是没有用的。
1 2 3 4 5
| configurations { all { exclude group: "org.slf4j", module: "slf4j-simple" } }
|
嗯,很好,gradle dependencies 里已经看不到 slf4j-simple 了 。
二、加入从 slf4j 到 log4j2 的连接器(驱动?)
1 2 3 4 5
| compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.5' compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.5' //已经被exclude掉了 compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.0' compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0' compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0'
|
参考链接 https://stackoverflow.com/questions/41498021/is-it-worth-to-use-slf4j-with-log4j2
后来发现上文并非最小集合,log4j-sl4j-impl已经包含了log4j-api和log4j-core了,所以只要包含log4j-slf4j-impl即可。
1 2 3 4 5 6 7
| compile - Dependencies for source set 'main' (deprecated, use 'implementation ' instead). +--- org.slf4j:slf4j-api:1.7.5 -> 1.8.0-alpha2 \\--- org.apache.logging.log4j:log4j-slf4j-impl:2.11.0 +--- org.slf4j:slf4j-api:1.8.0-alpha2 +--- org.apache.logging.log4j:log4j-api:2.11.0 \\--- org.apache.logging.log4j:log4j-core:2.11.0 \\--- org.apache.logging.log4j:log4j-api:2.11.0
|
三、检验成功与否
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory;
public class LoggerTest { @Test public void hello() { System.out.println("hello"); Logger logger = LoggerFactory.getLogger(getClass()); System.out.println(logger.toString()); System.out.println(logger.getClass()); logger.error("world"); } }
|
如果 logger 的类不是 NOPLogger
的话,就应该能打印出来,这里应该是 org.apache.logging.slf4j.Log4jLogger
。