写点什么

Apache Log4j2 详解,【高级 Java 架构师系统学习

用户头像
极客good
关注
发布于: 刚刚

[](

)引用依赖


在一般项目中使用 Log4j2 至少需要引用log4j-api-2.xlog4j-core-2.x这两个 jar 包。


<dependency>


<groupId>org.apache.logging.log4j</groupId>


<artifactId>log4j-core</artifactId>


<version>2.12.0</version>


</dependency>


<dependency>


<groupId>org.apache.logging.log4j</groupId>


<artifactId>log4j-api</artifactId>


<version>2.12.0</version>


</dependency>


在 spring boot 项目中使用 Log4j2


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-web</artifactId>


<exclusions>


<exclusion>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-logging</artifactId>


</exclusion>


</exclusions>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-log4j2</artifactId>


</dependency>


小编在使用中遇到一些坑,同时引入 spring-boot-starter 和 spring-boot-starter-web 依赖时,需要在 spring-boot-starter 中排除 spring-boot-starter-logging 依赖,因为 spring-boot-starter-web 依赖于 spring-boot-starter,根据 Maven 依赖关系,在 spring-boot-starter 中排除 spring-boot-starter-logging 依赖才能排除成功。

[](

)添加配置文件


默认情况下,Log4j2 在 classpath 下查找名为log4j2.xml的配置文件。你也可以使用 Java 启动命令指定配置文件的全路径。-Dlog4j.configurationFile=opt/demo/log4j2.xml,你还可以使用 Java 代码指定配置文件路径


import org.apache.logging.log4j.LogManager;


import org.apache.logging.log4j.core.LoggerContext;


import java.io.File;


public static void main(String[] args) {


LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);


File file = new File("opt/demo/log4j2.xml");


loggerContext.setConfigLocation(file.toURI());


}


[](


)同步日志,混合日志和异步日志配置详解




[Log4j2 同步日志,混合日志和异步日志配置详解](


)


[](


)配置文件详解




[Log4j2 配置文件详解](


)


[](


)日志重复打印问题




如果Root中的日志包含了Logger中的日志信息,并且AppenderRef是一样的配置,则日志会打印两次。


这是 log4j2 继承机制问题,在 Log4j2 中,logger 是有继承关系的,root 是根节点,在 log4j2 中,有个 additivity 的属性,它是子 Logger 是否继承 父 Logger 的 输出源(appender) 的属性。具体说,默认情况下子 Logger 会继承父 Logger 的 appender,也就是说子 Logger 会在父 Logger 的 appender 里输出。若是 additivity 设为 false,则子 Logger 只会在自己的 appender 里输出,而不会在父 Logger 的 appender 里输出。


要打破这种传递性,也非常简单,在 logger 中添加 additivity = “false”,如下所示:


<?xml version="1.0" encoding="UTF-8"?>


<Configuration>


<Appenders>


<Console name="Console">


<PatternLayout>


<Pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5level %logger{0} - %msg%n</Pattern>


</PatternLayout>


</Console>


</Appenders>


<Loggers>


<Logger name="com.jourwon" level="debug" additivity="false">


<AppenderRef ref="Console"/>


</Logger>


<Ro


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


ot level="error">


<AppenderRef ref="Console"/>


</Root>


</Loggers>


</Configuration>


[](


)使用 Lombok 工具简化创建 Logger 类




lombok 就是一个注解工具 jar 包,能帮助我们省略一繁杂的代码。具体介绍可以看我的博客[Lombok 简介、使用、工作原理、优缺点](


)

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Apache Log4j2详解,【高级Java架构师系统学习