zoukankan      html  css  js  c++  java
  • 搭建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语句就完成了!

  • 相关阅读:
    Python老男孩 day18 文件处理模式b模式
    Python老男孩 day17 文件操作
    Python老男孩 day17 函数(十一) 其他函数
    Python老男孩 day17 函数(十) max、min函数
    Python老男孩 day17 函数(九) zip函数
    Python老男孩 day16 函数(八) map函数、filter函数、reduce函数
    Python老男孩 day16 函数(七) 函数式编程
    sqlzoo答案--more join
    sqlzoo答案--join
    sqlzoo答案--sum and count
  • 原文地址:https://www.cnblogs.com/gaopengfirst/p/9562066.html
Copyright © 2011-2022 走看看