集成Log4J日志

Posted 阿毅的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集成Log4J日志相关的知识,希望对你有一定的参考价值。

8.1  Log4J介绍


8.1.1  Log4J概述


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

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

Log4j中有三个主要的组件,它们分别是:Loggers(记录器),Appenders (输出源)和Layouts(布局),这三个组件可以简单的理解为日志类别,日志要输出的地方和日志以何种形式输出。Log 4J 原理如图8- 1 所示。

8-1  Log4J日志框架简单原理图


Loggers(记录器):Loggers组件被分为七个级别:alldebuginfowarnerrorfataloff。这七个级别是有优先级的:all<debug< info< warn< error< fatal<off,分别用来指定这条日志信息的重要程度。Log4j有一个规则:只输出级别不低于设定级别的日志信息。假设Loggers级别设定为info,则infowarnerrorfatal级别的日志信息都会输出,而级别比info低的debug则不会输出。Log4j允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。


Appenders(输出源):Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。


Layouts(布局):Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。


Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件 log 4 j 2 .properties (键 = 值),properties文件简单易读,而XML文件可以配置更多的功能(比如过滤),没有好坏,能够融会贯通就是最好的。具体的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>



8.2  集成Log4j2


8.2.1  引入依赖


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

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


Spring Boot默认使用Logback日志框架来记录日志,并用INFO级别输出到控制台,所以我们在引入Log4j 2 之前,需要先排除该包的依赖,再引入Log4j 2 的依赖。具体做法就是找到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>


8.2.2  添加Log4J配置


8.1节当中,我们已经讲过,Log4j 2 支持两种配置文件格式,一种是XML格式的文件,一种是properties文件的格式。这里我们使用XML格式配置Log 4 j 2 properties格式可以作为大家自学任务。使用XML格式配置很简单,我们只需要 application .properties 文件中添加如下的配置信息:

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


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


8.2.3  创建log4j2.xml文件


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

 

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

</root> </loggers></Configuration>



8.3  使用Log4J记录日志


8.3.1  打印到控制台

现在我们需要把日志打印到控制台,所以需要往 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> </appenders> <loggers> <root level="all"><!-- 控制台输出 --> <appender-ref ref="Console"/> </root> </loggers></Configuration> <Console/>:指定控制台输出。<PatternLayout/>:控制日志的输出格式。


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

/** * 描述:监听器 * @author Ay * @date 2017/11/4 */@WebListenerpublic class AyUserListener implements ServletContextListener { //省略代码 //需要添加的代码 Logger logger = LogManager.getLogger(this.getClass()); @Override public void contextInitialized(ServletContextEvent servletContextEvent) { //查询数据库所有的用户 List<AyUser> ayUserList = ayUserService.findAll(); //清除缓存中的用户数据 redisTemplate.delete(ALL_USER); //存放到redis缓存中 redisTemplate.opsForList().leftPushAll(ALL_USER, ayUserList); //真实项目中需要注释掉 List<AyUser> queryUserList = redisTemplate.opsForList().range(ALL_USER, 0, -1); //System.out.println("缓存中目前的用户数有:" + queryUserList.size() + " 人"); //System.out.println("ServletContext上下文初始化"); logger.info("ServletContext上下文初始化"); logger.info("缓存中目前的用户数有:" + queryUserList.size() + " 人"); }  @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { //System.out.println("ServletContext上下文销毁"); logger.info("ServletContext上下文销毁"); }}


8.3.2  记录到文件


8.3.1节中,日志只是被打印到控制台中,当项目真正被上线之后,是没有控制台这个概念的,上线环境中,项目的日志都是被记录到文件中的。所以我们继续在 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> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> </appenders>  <loggers> <root level="all"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileInfo"/> </root> </loggers> </Configuration>


<RollingFile>标签:fileName用于定义日志的数据路径,如D:/info.logfilePattern定义日志的匹配方式。


<Filters>标签:日志过滤策略,<ThresholdFilter>标签用于指定日志信息的最低输出级别,默认为DEBUG。


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

 

/** * 描述:用户服务层实现类 * @author 阿毅 * @date 2017/10/14 *///@Transactional@Servicepublic class AyUserServiceImpl implements AyUserService { //省略代码 //需要添加的代码 Logger logger = LogManager.getLogger(this.getClass());  @Override public void delete(String id) { ayUserRepository.delete(id); //需要添加的代码 logger.info("userId:" + id + "用户被删除"); }  //省略代码}


8.3.3  测试

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

(八)集成Log4J日志

8-2  redis断点调试界面


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

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


在数据库ay _test 表中存在4条数据,如图8- 3 所示。运行单元测试方法 testLog4j ,如果同样可以在Intellij  IDEA 控制台或者D盘的info .log 文件中打印如图8- 4 所示信息,证明Spring  B oot整合Log 4 j以及在Spring  B oot中运用Log 4 j成功。


8-3  redis断点调试界面 

        

                    图8-4  redis断点调试界面


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


以上是关于集成Log4J日志的主要内容,如果未能解决你的问题,请参考以下文章

程序源代码Log4J 日志分割

Spring集成Log4j日志框架

SSH集成log4j日志环境

springboot集成log4j + sql打印日志

集成Log4J日志

集成Log4J日志