需求:SSM项目上添加log4j2
IDE工具:Eclipse
搭建环境:jdk1.8 tomcat8.5
当前目录结构:
开整。
1. 添加依赖,如下:
<!-- 添加slf4j依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 添加log4j2依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
<!-- web容器中需要添加log4j-web -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.11.1</version>
</dependency>
<!-- 桥接slf4j -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.1</version>
</dependency>
说明:简单说一下slf4j和log4j2
slf4j是一个为java程序提供日志输出的统一接口,并不是一个具体的的日志实现方案,就好像我们经常使用的jdbc一样。因此单独的slf4j是不能工作的,必须搭配其他具体的日志实现方案,比如apache的org.apache.log4j.Logger、jdk自带的java.util.logging.Logger等。
log4j2是Apache Log4j2,是对Log4j的升级,与其前身Log4j 1.X相比有了显著的改进,并提供了许多Logback中可用的改进,同时修复了Logback架构中一些固有问题。
2. 编写日志配置文件,该文件命名为log4j2.xml,具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<!--设置log4j2的自身log级别为DEBUG-->
<configuration status="DEBUG " monitorInterval="30">
<appenders>
<!-- 控制台输出 -->
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %contextName [%thread] %-5level %logger{36} [%file : %line] - %msg%n"/>
</console>
<!-- fileName:输出路径 filePattern:命名规则 -->
<RollingFile name="RollingFileInfo" fileName="D:\\SSMTest\\ssmtest.log"
filePattern="D:\\SSMTest\\$${date:yyyy-MM-dd}/allOut-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<!--控制台如果只输出info及以上级别的信息(onMatch),level=info,其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!-- 输出格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %contextName [%thread] %-5level %logger{36} [%file : %line] - %msg%n"/>
<Policies>
<TimeBasedTriggerzingPolicy interval="1"/>
<!-- SizeBasedTriggeringPolicy单个文件的大小限制 -->
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
<!-- DefaultRolloverStrategy同一个文件下的最大文件数,默认为最多同一文件夹下7个文件 -->
<DefaultRolloverStrategy max="50"/>
</RollingFile>
</appenders>
<loggers>
<!--过滤掉spring和hibernate的一些无用的debug信息-->
<logger name="org.springframework" level="INFO">
</logger>
<logger name="org.mybatis" level="INFO">
</logger>
<root level="trace">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<!-- <appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/> -->
</root>
</loggers>
</configuration>
3. 在web.xml添加日志监听和过滤器
<!-- 配置log4j监听器和过滤器 -->
<!-- 默认在class类路径下,不需要额外配置引用 ,如果更改到其他地方,则需配置 -->
<!-- <context-param>
<param-name>log4jConfiguration</param-name>
<param-value>classpath:log4j2.xml</param-value>
</context-param> -->
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
说明:如果配置文件没有放置在类路径下,需要指定配置文件的路径
4. 测试
4.1 将TestAll类中所有的sysout打印的方式改成如下:
package com.yzpt.test;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.yzpt.entity.Book;
import com.yzpt.entity.User;
import com.yzpt.mapper.UserMapper;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:applicationContext.xml"})
public class TestAll {
private static final Logger logger = LogManager.getLogger(TestAll.class);
@Autowired
private UserMapper usermapper;
@Test
public void testSpring() {
@SuppressWarnings("resource")
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Book book = (Book) ac.getBean("book");
logger.info(book.getBookId());
logger.info(book.getBookName());
logger.info(book.getWriter());
logger.info(book.getPublishingHouse());
}
@Test
public void testSSM() {
int id1 = 1;
try {
User user1 = usermapper.getUserInfor(id1);
logger.info("用户1姓名:" + user1.getUsername());
logger.info("用户1年龄:" +user1.getAge());
logger.info("用户1性别:" +user1.getSex());
}catch (Exception e) {
logger.info("SQL查询失败!"+e);
}
}
}
4.2 在testSpring()方法后面右击Debug as ,选择Junit Test,效果如下:
4.3 测试成功
说明:控制台输出打印的格式可以在log4j2.xml中配置,可以根据自己喜欢的格式来配置。