0%

log4j2的踩坑日记

最近在做一个项目, 需要用到log4j来生成日志, 方便debug

但是log4j是分版本的, 现在的最新版是log4j2, 而不是log4j.

我一开始以为只是版本新旧有不同, 后来发现配置文件log4j.properties怎么都加载不进去. 查了好多资料才发现log4j2和log4j是不兼容的.

1. pom.xml

事实上从maven导包这一过程中就可以看出来两者的不一样了,

log4j的依赖为

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

log4j2的依赖为

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version>
</dependency>

很明显的不一样嘛.

只可惜第一次接触日志系统的我显然没有意识到事情的严重性, 天真的以为反之都是log4j, 差不到哪里去. 就没当回事. 所以引入依赖后就开始了谷歌和必应各种示例 😂😂

2. 创建实例

在官网搜到了示例, 自然就是自己运行测试一下了, 把demo复制下来竟然发现报错了,

报错的原因是log4j这个类没有找到. 很奇怪, 明明我导入了maven依赖啊.

1
2
3
4
5
6
7
8
9
10
11
12
// Import log4j classes.
import org.apache.log4j.Logger;

public class MyApp {
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
static Logger logger = Logger.getLogger(MyApp.class);
public static void main(String[] args) {
logger.info("Entering application.");
logger.info("Exiting application.");
}
}

这时, 我又自作聪明地分析起来了, 官网的导入是在org.apache.log4j下面, 而我导入的maven依赖是org.apache.logging.log4j, 少一个logging啊. 于是我自以为是的把 import org.apache.log4j.Logger; 修改为了 import org.apache.logging.log4j.Logger;

这下发现Logger中没有getLogger()方法, 又搜了几篇博客. 发现应该要用这个LogManager

static Logger logger ==LogManager.getLogger(Test.class);

然后看似这下所有的错误都解决了, 即将能用了, 事实上我又踩进了一个坑

3. 配置文件

上面的问题解决后, 我就开始考虑写配置文件自定义日志输出. 但是这时候问题就来了, 配置文件log4j.properties无论如何也不会生效.

我一开始认为是配置文件放的位置有问题, 反复检查发现没错, 又上网搜, 办法都试过了也没用. classpath什么的又检查了一遍也没问题

快要放弃的时候看到一篇博客, 配置文件是log4j2.xml, 我这才想起来版本的问题. 后来一查才发现这两个版本的配置文件确实不一样. 一个是log4j.xml一个是log4j2.xml!!! 据说log4j2之前的版本不支持log4j2.properties, 但是在后来的版本也加入了支持.

把配置文件改为log4j2.xml就ok了, 真没想到一个小小的2会造成这么大的麻烦.

事实上, 前面有2次提早发现错误的机会maven依赖的异常和创建实例时的异常, 如果趁早发现趁早弄清楚, 不会在这个坑上越陷越深.

也提醒自己以后碰到一个新组件的话还是要先弄清楚原理, 不要网上拿过一个demo就用, 会避免很多坑