Gradle 历险记(三):gradle从slf4j-simple迁移到log4j2

上线时候,公司要求使用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