说明
maven工程中增加对Log4j 2的依赖
下面代码示例的maven工程中的pom.xml文件中需要增加对Log4j 2的依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
log4j 2的配置
配置说明参考文档
https://logging.apache.org/log4j/2.x/manual/configuration.html
配置文件中pattern的详细说明
例如,下面配置文件片段中用到了pattern:
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File1" fileName="${filename}">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
pattern的详细说明请参考:
https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
通常给每个类创建自己的Logger
为了便于对日志的过滤、搜索、排序等,通常每个类都获取它自己的带名字的Logger,而不是所有类共用一个Logger。
例如通常的做法:
private static final Logger logger = LogManager.getLogger();
创建一个Logger ,名字就是调用类的全限定名。
建议将Logger 声明为static的
Logger 可以声明为static的、或者非static的,但建议声明为static的。这样做的目的是为了节约实例化的成本。
代码示例
代码示例公共说明
如果没有特别说明,下面代码示例中maven工程中src/main/resources/log4j2.xml的配置内容如下:
<?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>
<File name="File1" fileName="${filename}">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
用LogManager.ROOT_LOGGER_NAME获取root Logger的名字
LogManager.ROOT_LOGGER_NAME是root Logger的名字,这个名字是空字符串""。
package com.thb;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
public static Logger logger = LogManager.getLogger();
public static void main(String[] args) {
System.out.println("root logger name: " + LogManager.ROOT_LOGGER_NAME);
//System.out.println("logger name: " + logger.getName());
}
}
运行结果:
从上面输出结果可以发现,root Logger的名字是空字符串""。
用LogManager的getLogger()获取一个带名字的Logger
LogManager.getLogger()返回一个带名字的Logger,这个Logger的名字就是调用的类的全限定名称。这个方法经常使用。
下面代码中获取Logger的方法是典型的获取方法。
package com.thb;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
System.out.println("logger name: " + logger.getName());
}
}
运行输出:
从上面输出可以看出,Logger的名字是调用类的全限定名称,此处是com.thb.Test。
在控制台打印一条INFO级别的日志
打印日志的代码:
package com.thb;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
System.out.println("logger name: " + logger.getName());
logger.info("hello");
}
}
输出:
在控制台打印日志,信息为合成信息
package com.thb;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
double r = 2;
logger.info("面积为:" + Math.PI * Math.pow(r, 2));
}
}
运行输出:
15:25:00.167 [main] INFO com.thb.Test - 面积为:12.566370614359172
两个类都定义了静态的Logger,并且在一个类中调用另外一个类的方法
定义一个类,类中定义了自己的静态Logger:
package com.thb;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class AnotherClass {
private static final Logger logger = LogManager.getLogger();
public void method() {
logger.info("hello from AnotherClass");
}
}
定义一个主类,在主类中也定义了一个静态Logger:
package com.thb;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.info("hello from Test");
AnotherClass another = new AnotherClass();
another.method();
}
}
运行结果:
15:10:28.161 [main] INFO com.thb.Test - hello from Test
15:10:28.199 [main] INFO com.thb.AnotherClass - hello from AnotherClass