集成Log4J日志
本章主要回顾Log4J的基础知识、在Spring Boot中集成Log4J、Log4J在Spring Boot中的运用以及如何把日志打印到控制台和记录到日志文件中等内容。
Spring Boot支持Java Util Logging、Log4J2及Lockback作为日志框架,如果你使用Starters启动器,Spring Boot将使用Logback作为默认日志框架。
1.Log4J概述
Log4J是Apache下的一个开源项目,通过使用Log4J可以将日志信息打印到控制台、文件等,也可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,更加细致地控制日志的生成过程。
在应用程序中添加日志记录有3个目的:
- 监视代码中变量的变化情况,周期性地记录到文件中供其他应用进行统计分析工作。
- 跟踪代码运行时轨迹,作为日后审计的依据。
- 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
Log4J中有3个主要的组件,它们分别是:Logger(记录器)、Appender(输出源)和Layout(布局),这3个组件可以简单地理解为日志类别、日志要输出的地方和日志以何种形式输出。Log4J的原理如图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/5023b374d91d62079307c31e960ff131.png)
- 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键,可以查询到和图所示一样的信息。
![](https://i-blog.csdnimg.cn/blog_migrate/6c2a9c3584e9ee70343c47e514b6d322.png)
接着,再测试一下删除用户的时候,日志是否可以打印到控制台或者记录到日志文件中。在测试类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服务器,否则会报错。