(五)Spring Boot 日志管理——log4j框架


1、SLF4J和Logback和Log4j的关系

slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback),使用接口的好处是当项目需要更换日志框架的时候,只需要更换jar和配置,不需要更改相关java代码。

Logback和Log4j 就相当于对slf4j的实现,类似于jdbc和MySQL与Oracle的关系。
在这里插入图片描述

2、如何在spring boot中使用log4j

Spring boot其实已经默认集成了LogBack,同时也是默认开启的。但是我们都习惯性使用log4j,之前学习Spring框架也是用的log4j。

2.1、排除自带的logback

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
	<exclusions>
		<!-- 排除spring-boot-starter-web中自带的logback依赖 -->
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

2.2、引入log4j的依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j</artifactId>
	<version>1.3.8.RELEASE</version>
</dependency>

2.3、代码示例

@RestController
public class Log4jController
{
    private static final Logger logger = LoggerFactory.getLogger(Log4jController.class);
    
    @RequestMapping("/log4jIndex")
    public String lo4jIndex()
    {
        logger.info("lo4jIndex-log4j打印日志-info");
        logger.error("lo4jIndex-log4j打印日志-error");
        return "使用log4j打印日志:" + this.getClass();
    }
}

2.4、添加配置文件log4j.properties

3、log4j配置文件

3.1、格式化符号说明

%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:输出自应用程序启动到输出该log信息耗费的毫秒数。
%t:输出产生该日志事件的线程名。
%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:输出日志信息所属的类目,通常就是所在类的全名。
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L::输出代码中的行号。
%m::输出代码中指定的具体日志信息。
%n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。

3.2、配置示例

3.2.1、按大小产生日志文件备份

#按大小产生日志文件备份
log4j.rootLogger=A1,ERROR
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target = System.out
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c:%L]-[%-5p] %m%n

#全局过滤器 过滤低于info级别的日志
log4j.appender.ERROR.Threshold=ERROR
log4j.appender.ERROR=org.apache.log4j.RollingFileAppender
log4j.appender.ERROR.layout=org.apache.log4j.PatternLayout  
log4j.appender.ERROR.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c:%L]-[%-5p] %m%n
log4j.appender.ERROR.MaxFileSize=10240KB
log4j.appender.ERROR.MaxBackupIndex=10
log4j.appender.ERROR.Encoding=UTF-8
log4j.appender.ERROR.File=./logs/test.log 

3.2.2、不同级别日志分别打印

log4j.rootLogger=DEBUG,R,CONSOLE,INFO,ERROR
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c:%L]-[%-5p] %m%n

log4j.logger.INFO=INFO
log4j.appender.INFO=org.apache.log4j.DailyRollingFileAppender
log4j.appender.INFO.layout=org.apache.log4j.PatternLayout
log4j.appender.INFO.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c:%L]-[%-5p] %m%n
log4j.appender.INFO.datePattern='.'yyyy-MM-dd
log4j.appender.INFO.Encoding=UTF-8
log4j.appender.INFO.Threshold=INFO
log4j.appender.INFO.append=false
log4j.appender.INFO.File=./logs/info.log

log4j.logger.ERROR=ERROR  
log4j.appender.ERROR=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERROR.layout=org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c:%L]-[%-5p] %m%n
log4j.appender.ERROR.datePattern='.'yyyy-MM-dd
log4j.appender.ERROR.Encoding=UTF-8
log4j.appender.ERROR.Threshold=ERROR
log4j.appender.ERROR.append=false
log4j.appender.ERROR.File=./logs/error.log

log4j.logger.R=R  
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c:%L]-[%-5p] %m%n
log4j.appender.R.datePattern='.'yyyy-MM-dd
log4j.appender.R.Encoding=UTF-8
log4j.appender.R.Threshold=DEBUG
log4j.appender.R.append=false
log4j.appender.R.File=./logs/debug.log

3.2.3、每天产生一个日志文件

log4j.rootLogger=CONSOLE,INFO
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c:%L]-[%-5p] %m%n

log4j.appender.ERROR.Threshold =INFO
log4j.appender.ERROR=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERROR.layout=org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c:%L]-[%-5p] %m%n
log4j.appender.ERROR.datePattern='.'yyyy-MM-dd
log4j.appender.ERROR.Encoding=UTF-8
log4j.appender.ERROR.append=false
log4j.appender.ERROR.File=./logs/info1.log

4、代码地址

spring-boot2-log4j

### Spring Boot多日志框架兼容性配置方法 Spring Boot 提供了强大的灵活性,使开发者能够轻松切换和集成不同的日志框架。以下是关于如何在 Spring Boot 中实现多日志框架兼容性的详细说明。 #### 默认日志框架及其替代方式 Spring Boot 的默认日志框架是 Logback[^1]。然而,在实际开发过程中,可能需要根据具体需求更换为其他日志框架(如 Log4j2 或 SLF4J)。为了禁用默认的日志框架并启用自定义框架,可以通过修改 `application.properties` 文件来完成此操作[^2]: ```properties logging.framework=LOG4J2 ``` 上述设置会通知 Spring Boot 不再加载其内置的 Logback 配置,而是尝试寻找外部指定的日志框架。 #### 替换默认日志框架的具体步骤 要完全移除默认的 Logback 并引入新的日志框架(例如 Log4j2),需执行以下操作: 1. **排除默认依赖项** 在项目的 Maven 构建文件 (`pom.xml`) 中,通过 `<dependency>` 节点中的 `<exclusions>` 来剔除默认的日志绑定模块 `spring-boot-starter-logging`: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> ``` 2. **添加目标日志框架依赖** 接下来,显式声明所需的日志框架作为项目的新依赖。例如,如果希望使用 Log4j2,则应加入如下依赖项[^4]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> ``` 3. **调整日志配置文件路径** 同样重要的是确保新选用的日志框架对应的配置文件被正确放置于资源目录下。对于 Log4j2,通常命名为 `log4j2.xml` 并存放在 `src/main/resources/` 下面。 #### 日志抽象层的作用 无论采用何种具体的底层实现技术,Spring Boot 始终推荐利用统一的日志门面接口——SLF4J (Simple Logging Facade for Java)[^3] 进行业务逻辑编码。这不仅简化了跨不同环境下的迁移工作量,还增强了应用程序可维护性和一致性表现力。 ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ExampleService { private static final Logger logger = LoggerFactory.getLogger(ExampleService.class); public void performAction() { logger.info("Executing action..."); } } ``` 以上代码片段展示了基于 SLF4J API 编写的标准日志记录语句形式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值