log4j2的使用

Log4j2 是一个常用的日志工具。本文把试用结果和遇到的问题记录一下。

Java文件

Java代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.shizhihua.example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class TestLog {

private static final Logger logger = LogManager.getLogger();

public static void main(String[] args) {
logger.info("Hello, world!");
logger.error("What are you doing?");
}

}

Log4j2配置

log4j2默认在console上输出ERROR级别的信息。为了显示INFO信息,需要通过配置更改默认设置。试用中采用XML文件来进行设置。log4j2.xml的具体设置内容如下(Root level设置为INFO):

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

代码的组织按照gradle/maven的默认结构。

Q1: 程序找不到log4j2的配置文件?

A1: 配置文件必须放在src\main\resources下面,否则运行时需要指定配置文件。

Gradle脚本

build.gradle文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apply plugin: 'java'

repositories {
mavenCentral()
}

dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.5'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.5'
}

jar {
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }

manifest {
attributes 'Main-Class': 'com.shizhihua.example.TestLog'
}
}

Q2: 运行jar文件,找不到依赖包?

A2: Gradle能自动解决编译过程中的第三方依赖,但是我们直接从命令后直接运行程序时,还是要指定第三方依赖才行。为了能直接运行jar文件,上述脚本中在jar文件生成配置中增加了一行代码,这样就把第三方依赖包也打包起来了,形成了“胖”jar。

1
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }

运行结果

直接执行下面命令:

1
2
gradle build
java -jar build\libs\testLog.jar

得倒下面的输出(与时间有关)

1
2
07:33:56.484 [main] INFO  com.shizhihua.example.TestLog - Hello, world!
07:33:56.485 [main] ERROR com.shizhihua.example.TestLog - What are you doing?