springmvc+log4j2+mybatis+slf4j

(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必须“启动”。 它的工作原理取决于您的应用程序是Servlet 3.0还是更新版本或Servlet 2.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是当前类的类名-->
private static final 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: Class path 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_bindings for 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 found for 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#noconfig for 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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值