Spring Boot 笔记 (2) - 使用 log4j2 记日志

日志框架的选用#

Spring 使用的默认日志框架是 logback, 默认情况下会采取默认的 autoconfiguration; 即便想对日志的一些配置进行修改也比较方便, 详细可以参考:

一个日志框架, 重点就是产生日志、控制台输出日志、存储日志和归档日志这几项工作. 而想要实现这些功能核心就是配置. 因此, 假如想要使用其他日志框架, 比如 log4j2 的话, 就需要自行创建配置文件.

配置文件#

Java 项目大量使用 xml 作为配置文件, log4j也一样, 那样繁琐的配置几乎是不可接受的, 但好在 SpringBoot 增加了 jsonyml 格式的支持.

Maven - 依赖管理#

  1. 首先要排除原有的 spring-boot-starter-logging
  2. 其次要增加 spring-boot-starter-log4j2 依赖
  3. 添加两个工具库用于 log4j2.yml 文件解析
Copy
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!--排除原有的 spring-boot-starter-logging --> <exclusions> <exclusion> <artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!-- 增加 spring-boot-starter-log4j2 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- log4j2.yml 文件解析工具库 --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>

log4j2.yml#

配置文件 log4j2.yml 应保存于 resources 文件夹下, 主要配置的内容有 Configuration 下的 statusPropertiesAppenders.ConsoleAppenders.RollingFileLoggers.

  • Properties 主要是为了定义字段在之后的配置中使用;
  • Appenders.Console 主要是为了对输出到控制台中的日志内容的格式进行配置;
  • Appenders.RollingFile 则是为了对输出到文件中的日志内容的存储和格式进行配置;
  • Loggers 则对目前启用的策略进行声明.

不难看出, 控制台输出中的 ThresholdFilter 是一个过滤器, 其中的 level 字段规定了当前输出的日志的级别, 下面的 RollingFile 也是同理. 同时两个 level 分别受到 Properties 所定义的变量的控制.

因为需要保存, 因此 RollingFile 对文件名和文件命名进行了规定, 其中 Policies 则是对归档策略进行规定, 归档也就是对一些较为早期的日志进行压缩处理. 而两个不同的 Trigger 则代表了不同的归档判断方法——一个是基于时间, 一个是基于大小. 而如下的配置, 就是在当前根目录下的 log 文件夹中存储日志.

Copy
Configuration: status: warn Properties: # 定义全局变量 Property: - name: CONSOLE_LEVEL value: info - name: ROLLING_FILE_LEVEL value: warn - name: LOG_PATH value: log - name: LOG_FILENAME value: tcm-health-log Appenders: Console: #输出到控制台 - name: CONSOLE target: SYSTEM_OUT PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss} : %4p %t (%F:%L) - %m%n" ThresholdFilter: level: ${sys:CONSOLE_LEVEL} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值 onMatch: ACCEPT onMismatch: DENY RollingFile: # 输出到文件,超过128MB归档 - name: ROLLING_FILE ignoreExceptions: false fileName: "${LOG_PATH}/${LOG_FILENAME}.log" filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz" PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss} : %4p %t (%F:%L) - %m%n" Policies: TimeBasedTriggeringPolicy: # 基于时间的归档策略 interval: "1" modulate: "true" # SizeBasedTriggeringPolicy: # 基于大小的封存策略 # size: "128 MB" ThresholdFilter: level: ${sys:ROLLING_FILE_LEVEL} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值 onMatch: ACCEPT onMismatch: DENY DefaultRolloverStrategy: max: 100 Loggers: Root: level: info AppenderRef: - ref: CONSOLE - ref: ROLLING_FILE

更多#

或许有些人会不明白为什么要在 properties 中配置变量, 其实重要目的是为了便于配置, 可以在执行时通过传参来改变配置, 这样可以使日志的使用更加灵活.

Copy
# 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下: ## 测试: -DCONSOLE_LEVEL=warn -DROLLING_FILE_LEVEL=trace ## 生产: -DCONSOLE_LEVEL=warn -DROLLING_FILE_LEVEL=info

使用#

首先是在 Spring 容器中注册, 简单的方法如下, 在Application.java 文件中直接注册.

Copy
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public Logger getLog4jLogger(){ return LogManager.getLogger(this.getClass()); } }

接着就可以使用了, 使用方法非常简单, 下面是一个简单的例子.

Copy
@AutoWired private Logger logger; @GetMapping("/test") public String test() { logger.info("connect to api server successfully"); logger.warn("connect to api server successfully"); logger.error("connect to api server successfully"); return "connect to api server successfully"; }

参考#

log4j2教程【RollingFileAppender】 - 山鬼谣的专栏 - CSDN博客: 对 log4j2 的配置做了详细阐述

Log4j 2使用教程 - 天外的星星 - 博客园: 对 log4j2 的用法进行了比较完整的介绍

posted @   质子  阅读(276)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示
CONTENTS