Spring Boot微服务项目实战(第2版)学习笔记-第8章集成Log4J日志

本章主要回顾Log4J的基础知识、在Spring Boot中集成Log4J、Log4J在Spring Boot中的运用以及如何把日志打印到控制台和记录到日志文件中等内容。

Spring Boot支持Java Util LoggingLog4J2Lockback作为日志框架,如果你使用Starters启动器,Spring Boot将使用Logback作为默认日志框架。

1.Log4J概述

Log4J是Apache下的一个开源项目,通过使用Log4J可以将日志信息打印到控制台、文件等,也可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,更加细致地控制日志的生成过程。

在应用程序中添加日志记录有3个目的:

  1. 监视代码中变量的变化情况,周期性地记录到文件中供其他应用进行统计分析工作。
  2. 跟踪代码运行时轨迹,作为日后审计的依据。
  3. 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

Log4J中有3个主要的组件,它们分别是:Logger(记录器)、Appender(输出源)和Layout(布局),这3个组件可以简单地理解为日志类别、日志要输出的地方和日志以何种形式输出。Log4J的原理如图所示。

  • Logger(记录器):Logger组件被分为7个级别:all、debug、info、warn、error、fatal、off。这7个级别是有优先级的,即:all<debug< info< warn<error< fatal<off,分别用来指定这条日志信息的重要程度。Log4J有一个规则——只输出级别不低于设定级别的日志信息。假设Logger级别设定为info,则info、warn、error和fatal级别的日志信息都会输出,而级别比info低的debug则不会输出。Log4J允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。
  • Appender(输出源):Log4J日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其他地方等。
  • Layout(布局):Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。

Log4J支持两种配置文件格式:一种是XML格式的文件;另一种是Java特性文件log4J2.properties(键=值)。XML文件可以配置更多的功能(如过滤),properties文件简单易读,没有好坏,能够融会贯通就是最好的。具体的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>
	</Appenders>
	<Loggers>
		<Root level="debug">
			<AppenderRef ref="Console"/>
		</Root>
	</Loggers>
</Configuration>

2.集成Log4J2

2.1 引入依赖

在Spring Boot中集成Log4J2,首先需要在pom.xml文件中引入所需的依赖,具体代码如下:

<!-- log4j2 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

Spring Boot默认使用Logback日志框架来记录日志,并用INFO级别输出到控制台,所以我们在引入Log4J2之前,需要先排除该包的依赖,再引入Log4J2的依赖。具体做法是,找到pom.xml文件中的spring-boot-starter-web依赖,使用exclusion标签排除Logback,具体排除Logback依赖的代码如下:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
	<!--排除Spring Boot默认日志-->
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

2.2 添加Log4J配置

Log4J2支持两种配置文件格式:一种是XML格式的文件;另一种是properties文件的格式。这里使用XML格式配置Log4J2,properties格式可以作为大家的自学任务。使用XML格式配置很简单,只需要在application.properties文件中添加如下的配置信息:

### Log4J配置
logging.config=classpath:log4j2.xml

配置完成之后,Spring Boot就会帮我们在classpath路径下查找log4j2.xml文件,所以最后一步,只需要配置好log4j2.xml文件即可。

2.3 创建log4j2.xml文件

application.properties配置完成之后,在目录/src/main/resources下新建空的日志配置文件log4j2.xml。具体代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Confiquration status-"WARN">
	<appenders>
	
	</appenders>
	<loggers>
		<root level="all">
		
		</root>
	</loggers>
</Configuration>

3.使用Log4J记录日志

3.1 打印到控制台

现在我们需要把日志打印到控制台,需要往log4j2.xml配置文件添加相关的配置,具体代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Confiquration status="WARN">
	<appenders>
		<Console name="Console" target="SYSTEM_OUT">
		<!--指定日志的输出格式-->
		<PatternLayout pattern="[%d(HH:mm:ss:SSS}] [%p] - %l- %m%n"/>
		</Console>
	</appenders>
	<loggers>![在这里插入图片描述](https://img-blog.csdnimg.cn/20210315193706669.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoZXphcHBsZQ==,size_16,color_FFFFFF,t_70)

		<root level="info">
		<!-控制台输出-->
		<appender-ref ref="Console"/>
	</root>
	</loggers>
</Configuration>
  • <Console/>:指定控制台输出。
  • <PatternLayout/>:指定日志的输出格式。

Spring Boot集成Log4J日志完成之后,在第6和第七章中,我们已经开发好AyUserListener监听器,但是使用System.out.println来打印信息是一种非常不合理的方式,现在我们把Logger类引入到AyUserListener.java监听器中,同时把System.out.println相关代码注释掉,改成用日志方式记录信息。这样,在项目启动过程中,调用上下文初始化和销毁方法的时候,就会记录日志到开发工具控制台或者日志文件中。AyUserListener具体代码如下:

@WebListener
public class AyUserListener implements ServletContextListener{
	//省略代码
	//需要添加的代码
	Logger logger = LogManager.getlogger(this.getclass());
	@Override
	public void contextInitialized(ServletContextEvent servletContextEvent) {
		//查询数据库所有的用户
		List<AyUser> ayuserList = ayUserse.findAll();
		//清除缓存中的用户数据
		redisTemplate.delete(ALL_USER);
		//存放到 Redis缓存中
		redisTemplate.opsForList().leftPushAll(ALL_USER, ayUserList);
		//真实项目中需要注释
		List<AyUser> queryUserList = redisTexplate.opsForList().range(ALL_USER,0,-1);
		//Syatem.out.println("缓存中目前的用户数有:"+ queryUserList.size()+"人");
		//System.out.printIn("ServletContext上下文初始化");
		logger.info("ServletContext上下文初始化");
		logger.info("缓存中目前的用户数有: "+queryUserList.size()+"人");
	}
	@Override
	public void context Destroyed(ServletContextEvent servletContextEvent){
		//System.out.println("Servletcontex上下文销毁");
		logger.info("ServletContext上下文销毁");
	}
}

3.2 记录到文件

上线环境中,项目的日志都是被记录到文件中的。我们继续在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}] [%p]  - %l - %m%n"/>
		</Console>
		<RollingFile name="RollingFileInfo" fileName="D:/info.log"
		filePattern="D:/$${date:yyyy-MM}/info-%d{yyyy-MM-dd} -%i.log">
			<Filters>
				<ThresholdFilter level="INFO"/>
			</Filters>
			<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
			<Policies>
				<TimeBasedTriggeringPol1icy/>
				<SizeBasedTriggeringPolicy size="100 MB"/>
			</Policies>
		</RollingFile>
	</appenders>
	<loggers>
		<root level="info">
			<appender-ref ref="Console"/>
			<appender-ref ref="RollingFileInfo"/>
		</root>
	</loggers>
</Configuration>
  • <RollingFile>标签:fileName用于定义日志的数据路径,如D:/info.log。filePattern定义日志的匹配方式。
  • <Filters>标签:日志过滤策略,标签用于指定日志信息的最低输出级别,默认为DEBUG。

现在修改AyUserServiceImpl类的删除方法Delete,我们希望删除用户这个操作可以被记录到日志文件中,AyUserServiceImpl类代码具体的修改如下:

//@Transactional
@Service
public class AyUserServiceImpl implements AyUserService {
	//省略代码
	//需要添加的代码
	Logger logger = LogManager.getLogger(this.getclass());
	
	@Override
	public void delete(String id){
		ayUserRepository.delete():
		//需要添加的代码
		logger.info("userId:"+id+"用户被删除");
	}
	//省略代码
}

3.3 测试

代码开发完成之后,接下来就是测试工作了。重新启动项目,启动之前,记得打开Redis服务器,因为之前的章节已经在Spring Boot中整合了Redis,项目重启的过程中,可以在Intellij IDEA控制台中看到如图所示的信息。同时,我们可以到D盘查看日志文件info.log,在日志文件中按住Ctrl+F键,可以查询到和图所示一样的信息。

接着,再测试一下删除用户的时候,日志是否可以打印到控制台或者记录到日志文件中。在测试类DemoApplicationTests下添加测试用例,具体代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests{
	//省略代码
	Logger logger = LogManger.getLogger(this.getClass());
	@Test
	public void testLog4j(){
		ayUserService.delete("4");
		logger.info("delete success!!!");
	}
}

在数据库ay_test表中存在4条数据。运行单元测试方法testLog4J,如果同样可以在Intellij IDEA控制台或者D盘的info.log文件中打印,证明SpringBoot整合Log4J以及在Spring Boot中运用Log4J成功。

Tips:启动项目的时候,记得启动Redis服务器,否则会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值