集成Log4J日志

Posted 阿_毅

tags:

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

开心一笑

【牛顿一辈子没结婚,他创立牛顿三定律,万有引力定律,张三丰一辈子没结婚,活到了200多岁,在一百二十多岁创造了太极拳,威震江湖!孙悟空一辈子没结婚,活了不知道多少岁,大闹过天宫,闯过龙宫,闹过地府,最后成了斗战胜佛…不用我多说了吧 ,都TMD别惹我,我也是单身狗!】

8.1 Log4J介绍

8.1.1 Log4J概述

Log4j是Apache下的一个开源项目,通过使用Log4j,我们可以将日志信息打印到控制台、文件等。我们也可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
在应用程序中添加日志记录有三个目的:
1) 监视代码中变量的变化情况,周期性的记录到文件中供其它应用进行统计分析工作。
2) 跟踪代码运行时轨迹,作为日后审计的依据。
3) 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
Log4j中有三个主要的组件,它们分别是:Loggers(记录器),Appenders (输出源)和Layouts(布局),这三个组件可以简单的理解为日志类别,日志要输出的地方和日志以何种形式输出。Log4J原理如图8-1所示。

图8-1 Log4J日志框架简单原理图
Loggers(记录器):Loggers组件被分为七个级别:all、debug、info、warn、error、fatal、off。这七个级别是有优先级的:all<debug< info< warn< error< fatal<off,分别用来指定这条日志信息的重要程度。 Log4j有一个规则:只输出级别不低于设定级别的日志信息。假设Loggers级别设定为info,则info、warn、error和fatal级别的日志信息都会输出,而级别比info低的debug则不会输出。Log4j允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。
Appenders(输出源):Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。
Layouts(布局):Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件 log4j2.properties (键 = 值),properties文件简单易读,而XML文件可以配置更多的功能(比如过滤),没有好坏,能够融会贯通就是最好的。具体的XML配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%dHH:mm:ss.SSS [%t] %-5level %logger36 - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

8.2 集成Log4j2

8.2.1 引入依赖

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

<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>

8.2.2 添加Log4J配置

在8.1节当中,我们已经讲过,Log4j2支持两种配置文件格式,一种是XML格式的文件,一种是properties文件的格式。这里我们使用XML格式配置Log4j2,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="[%dHH:mm:ss:SSS] [%p] - %l - %m%n"/>
        </Console>
    </appenders>
    <loggers>
        <root level="all">
			<!-- 控制台输出 -->
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</Configuration>

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

/**
 * 描述:监听器
 * @author Ay
 * @date   2017/11/4
 */
@WebListener
public 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="[%dHH:mm:ss:SSS] [%p] - %l - %m%n"/>
        </Console>
        <RollingFile name="RollingFileInfo" fileName="D:/info.log"
                     filePattern="D:/$$date:yyyy-MM/info-%dyyyy-MM-dd-%i.log">
            <Filters>
                <ThresholdFilter level="INFO"/>
            </Filters>
            <PatternLayout pattern="[%dHH: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.log。filePattern定义日志的匹配方式。
< Filters>标签:日志过滤策略,标签用于指定日志信息的最低输出级别,默认为DEBUG,
现在我们修改3.2.3节当中AyUserServiceImpl类的删除方法delete,我们希望删除用户这个操作可以被记录到日志文件中,AyUserServiceImpl类代码具体的修改点如下:

/**
 * 描述:用户服务层实现类
 * @author 阿毅
 * @date   2017/10/14
 */
//@Transactional
@Service
public 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 Boot中整合了Redis。项目重启的过程中,我们可以在Intellij IDEA控制台中看到如图8-2所示的信息。同时,我们可以到D盘查看日志文件info.log,在日志文件中按住Ctrl + F,查询到和图8-2所示一样的信息。


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

@RunWith(SpringRunner.class)
@SpringBootTest
public 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 Boot整合Log4j以及在Spring Boot中运用Log4j成功。


图8-3 redis断点调试界面 图8-4 redis断点调试界面

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


读书感悟

来自《女士品茶》

  • 有些读者会说:这绝对是吃饱了撑的!他们会问:“不管这位女士能否分辨两种饮品,这件事有什么意义呢?”“这个问题一点儿也不重要,对科学也没有益处,”他们嘲笑道,“这些聪明人应该把他们的头脑用在能够造福人类的事情上。” 不幸的是,不管普通大众如何看待科学及其影响,根据我的经验,大多数科学家之所以投入到研究当中,是因为他们对结果感兴趣,并能从工作中获得知识性的乐趣。优秀的科学家很少会考虑他们的工作是否具有重要意义。回到剑桥那个阳光明媚的夏日午后。女士有可能猜中饮品的混合方式,也有可能猜错。这件事的乐趣在于找出一种方法判断她的说法是否正确。在尖髯男子的指导下,他们开始讨论如何验证这种判断。

经典故事

祖父用纸给我做过一条长龙。长龙腹腔的空隙仅仅只能容纳几只蝗虫,投放进去,它们都在里面死了,无一幸免!祖父说:“蝗虫性子太躁,除了挣扎,它们没想过用嘴巴去咬破长龙,也不知道一直向前可以从另一端爬出来。因而,尽管它有铁钳般的嘴壳和锯齿一般的大腿,也无济于事。”当祖父把几只同样大小的青虫从龙头放进去,然后关上龙头,奇迹出现了:仅仅几分钟,小青虫们就一一地从龙尾爬了出来。

【命运一直藏匿在我们的思想里。许多人走不出人生各个不同阶段或大或小的阴影,并非因为他们天生的个人条件比别人要差多远,而是因为他们没有思想要将阴影纸龙咬破,也没有耐心慢慢地找准一个方向,一步步地向前,直到眼前出现新的洞天。】


大神文章


其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎鼓励,点赞、顶、欢迎留下宝贵的意见、多谢支持!

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

Spring集成Log4j日志框架

SSH集成log4j日志环境

springboot集成log4j + sql打印日志

集成Log4J日志

集成Log4J日志

springboot项目集成logf4j详细流程记录