集成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日志的主要内容,如果未能解决你的问题,请参考以下文章