搭建SpringBoot+dubbo+zookeeper+maven框架(二)


上一篇文章是關於搭建SpringBoot+dubbo+zookeeper+maven框架的,但是里面的功能還不夠完善,今天就日志管理方面做一些改善。

下了demo的網友可能會發現項目在啟動時會有警告:

SLF4J: Class path contains multiple SLF4J bindings.

截圖如下:

意思是說logback-classic-1.2.3.jar和slf4j-log4j12-1.7.25.jarjre包沖突了,所以要刪掉一個。點擊file<project structure<libraries,找到slf4j-log4j12-1.7.25.jarjre包,把他刪掉,

 

再次啟動還有一個警告: 

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的系統配置,所以這里要在customer和provider項目的resource下添加一個log4j.properties配置文件,內容如下:

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

 

再次啟動就沒有剛剛的警告了。

 

現在控制台就沒有報錯和警告了。

當我們發送一個請求時,這個請求要執行sql語句對數據庫的數據進行增刪改查,我想在控制台打印輸出,這時應該怎么辦呢?

其實SpringBoot在啟動項目的時候已經把logback集成進去了,而操作數據庫是在provider這個模塊中進行的,所以我們可以在provider模塊中加一個logback.xml配置文件,文件內容如下:

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="30 seconds">

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder 默認配置為PatternLayoutEncoder -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!--記錄所有輸出日志-->
    <appender name="allLogFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${catalina.base}/logs/allLog.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${catalina.base}/logs/allLog.%d{yyyy-MM-dd}.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</Pattern>
        </layout>
    </appender>

    <!--記錄錯誤輸出日志-->
    <appender name="errorLogFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--過濾 Error-->
            <level>ERROR</level>
            <!--&lt;!&ndash;匹配到就禁止&ndash;&gt;-->
            <!--<onMatch>DENY</onMatch>-->
            <!--&lt;!&ndash;沒有匹配到就允許&ndash;&gt;-->
            <!--<onMismatch>ACCEPT</onMismatch>-->
        </filter>
        <file>${catalina.base}/logs/errorLog.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${catalina.base}/logs/errorLog.%d{yyyy-MM-dd}.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</Pattern>
        </layout>
    </appender>

    <!--記錄警告輸出日志-->
    <appender name="errorLogFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--過濾 Error-->
            <level>WARN</level>
            <!--&lt;!&ndash;匹配到就禁止&ndash;&gt;-->
            <!--<onMatch>DENY</onMatch>-->
            <!--&lt;!&ndash;沒有匹配到就允許&ndash;&gt;-->
            <!--<onMismatch>ACCEPT</onMismatch>-->
        </filter>
        <file>${catalina.base}/logs/warnLog.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${catalina.base}/logs/warnLog.%d{yyyy-MM-dd}.zip</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</Pattern>
        </layout>
    </appender>

    <!-- <logger name="com.hengbao.fundcheck.repository" level="DEBUG"/> -->
    <!-- 以下這一句至關重要如果沒有,就無法輸出 sql 語句 -->
    <!--注意:在 spring boot 中,想在控制台打印 mybatis 的 sql 語句,只需要配置下邊這一句就好了。-->
    <!--如果想要記錄更詳細的 SQL 日志,只需要把下面的日志級別改成 TRACE 就可以了-->
    <!--即將 mapper 接口打入 logger 就行。-->
    <logger name="com.lj.provider.mapper" level="DEBUG"/>
    <logger name="org.mybatis.spring" level="DEBUG" />
    <logger name="org.apache.mybatis" level="DEBUG" />
    <logger name="java.sql.PreparedStatement" level="DEBUG" />
    <logger name="java.sql.Statement" level="DEBUG" />
    <logger name="java.sql.Connection" level="DEBUG" />
    <logger name="java.sql.ResultSet" level="DEBUG" />

    <logger name="com.alibaba" level="INFO" />
    <logger name="org.apache.commons" level="INFO" />
    <logger name="org.apache.zookeeper" level="INFO" />
    <logger name="org.springframework" level="INFO" />
    <logger name="org.quartz" level="INFO" />

    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="allLogFile" />
        <appender-ref ref="STDOUT" />
        <!--<appender-ref ref="logFile"/>-->
    </root>
</configuration>

 

 這樣不僅可以在控制台中輸出sql等日志信息外,還會在本地分別輸出所有日志、錯誤日志和應該日志,功能很強大!!!

這樣就可以了,是不是很簡單,這里要注意的是 <logger name="com.lj.provider.mapper" level="DEBUG"/>,沒寫這個就還是不會打印輸出sql語句。

至此,就完成了對記錄日志的集成。

 

在該項目中,我是把sql語句放在一個mapper接口中寫的,但是最好項目開發時,sql語句能夠單獨抽出來比較好,那應該怎么做呢?

首先在UserMapper中把sql語句都注釋掉,注釋后的代碼如下:

package com.lj.provider.mapper;

import com.lj.common.domin.User;
import org.apache.ibatis.annotations.*;

@Mapper
public interface UserMapper {
    User getOne(int id);

    void insertUser(User user);

}

 

然后是在provider模塊的resource文件夾中添加mapping文件夾,在里面添加UserMapper.xml文件,內容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.lj.provider.mapper.UserMapper" >
    <resultMap id="BaseResultMap" type="com.lj.common.domin.User" >
        <result column="userId" property="userId" jdbcType="INTEGER" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="age" property="age" jdbcType="INTEGER" />
        <result column="sex" property="sex" jdbcType="VARCHAR" />
    </resultMap>
    <sql id="Base_Column_List" >
        userId, name, age, sex
    </sql>
    <select id="getOne" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
        select
        <include refid="Base_Column_List" />
        from u_user t
        where t.userId = #{userId,jdbcType=INTEGER}
    </select>

    <insert id="insertUser" parameterType="com.lj.common.domin.User" >
        insert into u_user
        <trim prefix="(" suffix=")" suffixOverrides="," >
            <if test="userId != null" >
                userId,
            </if>
            <if test="name != null" >
                name,
            </if>
            <if test="age != null" >
                age,
            </if>
            <if test="sex != null" >
                sex,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides="," >
            <if test="userId != null" >
                #{userId,jdbcType=INTEGER},
            </if>
            <if test="name != null" >
                #{name,jdbcType=VARCHAR},
            </if>
            <if test="age != null" >
                #{age,jdbcType=INTEGER},
            </if>
            <if test="sex != null" >
                #{sex,jdbcType=VARCHAR},
            </if>
        </trim>
    </insert>

</mapper>

 

 這時你要通知項目框架應該在哪里才能找到sql語句,所以要在application.yml中添加配置,內容如下:

## 該配置節點為獨立的節點,有很多同學容易將這個配置放在spring的節點下,導致配置無法被識別
mybatis:
  mapper-locations: classpath:mapping/*.xml  #注意:一定要對應mapper映射xml文件的所在路徑
  type-aliases-package: com.lj.common.domin  #注意:對應實體類的路徑

 

 至此,xml文件單獨管理sql語句就完成了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM