springmvc+log4j2+mybatis+slf4j

2022-07-19 13:28:43

(1)在pom.xml进行如下配置

<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><!--***Spring自身的日志系统是基于Commons-Logging接口的,而我们所采用的是Slf4j接口+ Log4j2组合模式,为了避免冲突,故需在配置依赖中将Spring中的Commons-Logging依赖取消,如果不实用slf4j,那就不用取消commons-logging依赖***--><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency>
<!--***log4j2核心包开始***--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8.2</version></dependency><!--***log4j2核心包结束***-->
<!--在Java EE Web应用程序中使用Log4j或任何其他日志记录框架时,您必须特别小心。 当容器关闭或取消部署Web应用程序时,正确清理日志资源(关闭数据库连接,关闭文件等)非常重要。 由于Web应用程序中类加载器的性质,无法通过常规方式清除Log4j资源。 当Web应用程序部署并在Web应用程序取消部署时“关闭”时,Log4j必须“启动”。 它的工作原理取决于您的应用程序是Servlet3.0还是更新版本或Servlet2.5 Web应用程序。在任何一种情况下,您都需要将log4j-web模块添加到您的部署中,详见Maven,Ivy和Gradle Artifacts手册页。为避免出现问题,当包含log4j-web jar时,将自动禁用Log4j关闭挂钩。上面是 log4j 官方的文档,上文的大意就是 Log4j 默认会用一个 Runtime.getRuntime().addShutdownHook 钩子用来在程序关闭时释放资源,可见源码部分,由于 web 服务比较特殊,避免像 kill-9 这种不触发钩子,可以使用 log4j-web 这个jar,它是利用的 Servlet 的生命周期来进行 log4j 的配置和资源的释放。--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>2.8.2</version><scope>runtime</scope></dependency>
<!--***slf4j核心包开始***--><!--slf4j-api: Slf4j的核心包,只有日志的接口,并没有实现--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><!--jcl-over-slf4j: 桥接器,将JCL的日志输出重定向到Slf4j中--><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.25</version><scope>runtime</scope></dependency><!--***slf4j核心包结束***-->
<!--***将log4j2 和 slf4j进行绑定开始***--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.8.2</version></dependency><!--***将log4j2 和 slf4j进行绑定结束***-->

(2)在mybatis.xml文件(mybatis的配置文件)中进行如下配置

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration
        PUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--logImpl指定MyBatis所用的日志工具,未指定时将自动查找,查找顺序是SLF4J、Apache Commons Logging、Log4j2、Log4j、JDK logging,如果一个都未找到,日志功能就会被禁用,我们可以设置mybatis使用的日志工具,value可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING--><settings><!--如果使用log4j2日志框架,不使用slf4j--><!--<setting name="logImpl" value="LOG4J2"/>--><!--如果使用slf4j接口+其他日志框架--><setting name="logImpl" value="SLF4J"/></settings></configuration>

(3)log4j2.xml文件的配置
首先Log4j2 配置文件后缀要求为".xml"、".json"或者".jsn"。系统选择配置文件的优先级为(从先到后):
1.classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
2.classpath下的名为log4j2-test.xml的文件.
3.classpath下名为log4j2.json 或者log4j2.jsn的文件.
4.classpath下名为log4j2.xml的文件.
5.如果classpath下没有相关配置文件,则使用默认日志系统.
需要把log4j2.xml文件直接放置在resources目录下面,如果不在它下面,就需要到web.xml文件中去说明log4j2.xml文件的位置,这个可以自己去网上查找资料

<?xml version="1.0" encoding="UTF-8"?><configuration status="debug"><appenders><Console name="Console" target="SYSTEM_OUT"><ThresholdFilter level="debug" onMatch="ACCEPT"
                             onMismatch="ACCEPT"/><PatternLayout pattern="[dataservice] %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></Console><RollingFile name="RollingFile"
                     fileName="/opt/tomcat_dataservice/logs/dataservice.log"
                     filePattern="/opt/tomcat_dataservice/logs/$${date:yyyy-MM}/dataservice-%d{MM-dd-yyyy}-%i.log.gz"><PatternLayout
                    pattern="[dataservice] %d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/><SizeBasedTriggeringPolicy size="100MB"/></RollingFile></appenders><loggers><logger name="com.bjpowernode.p2p.mapper" level="debug" additivity="false"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/></logger><root level="debug"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/></root></loggers></configuration>

如果有对上面的标签不理解的,可以去看我的另外一篇文章,里面有详细的解释:点击我,不过日志文件的生成位置和上面链接文件中的不同,如果日志文件的生成路径前面没有/,直接就是文件名称,例如log/aop.log,那就是生成到所使用的tomcat的bin目录下,如果日志文件的生成路径前面有/,例如/log/aop.log,那就是生成到所使用的tomcat的盘符根目录下,如果日志文件的生成路径直接是绝对路径,例如F:/log/aop.log,那就直接生成到绝对路径下
(4)配置logger,控制输出的日志信息

<!--UserInterceptor是当前类的类名-->privatestaticfinal Logger logger= LoggerFactory.getLogger(UserInterceptor.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");

注意导入的包是:

import org.slf4j.Logger;import org.slf4j.LoggerFactory;

如果没有使用slf4j,直接使用的就是log4j2,那生成logger的方式是:private static final Logger logger =LoggerManager.getLogger(UserInterceptor.class);,不过生成信息的方式是一致的,导入的包不一样,它是这样的:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
(5)解决jar包冲突问题和初始化log4j问题
错误1:

SLF4J: Classpath contains multiple SLF4J bindings.
SLF4J: Found binding in[jar:file:/E:/编程/后端开发/作品/IDEA-P2P/p2p-web/target/p2p-web-1.0.0/WEB-INF/lib/log4j-slf4j-impl-2.8.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in[jar:file:/E:/编程/后端开发/作品/IDEA-P2P/p2p-web/target/p2p-web-1.0.0/WEB-INF/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindingsfor an explanation.
SLF4J: Actual binding is of type[org.apache.logging.slf4j.Log4jLoggerFactory]

上面的意思就是说log4j-slf4j-impl-2.8.2.jar和slf4j-log4j12-1.6.1.jar中的StaticLoggerBinder.class冲突了,但是我们根本没有导入slf4j-log4j12-1.6.1.jar,说明其他jar包导入的时候依赖该jar包,所以是其他jar包导入的,我们需要找到个jar包,然后排除slf4j-log4j依赖,寻找方法如下:
在这里插入图片描述在这里插入图片描述发现zkclient依赖引入了slf4j-log4j12,我们可以在zkclient的依赖中加入下面的代码即可:

<dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency>

错误2:

log4j:WARN No appenders could be foundfor logger(com.alibaba.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfigfor more info.

上面说的意思和log4j有关,但是我使用的是log4j2+slf4j框架,和log4j没有什么关系,所以log4j的jar包肯定是其他jar包引入的,我们需要找到引入的这个jar包,方法如下:
在这里插入图片描述在这里插入图片描述我们需要去zkclient中排除log4j的jar包依赖,方法如下:

<dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency>
  • 作者:明快de玄米61
  • 原文链接:https://blog.csdn.net/qq_42449963/article/details/104643705
    更新时间:2022-07-19 13:28:43