blogSite

我是谁?我在哪儿?我在干什么?

View project on GitHub

druid用logback记录sql日志

前提说明

logback 日志配置

  • application.properties中引入logback配置文件
      #Logback日志配置
      logging.config=classpath:zf-logback.xml
      logging.path=log
    
  • 配置logback的配置文件zf-logback.xml
      <configuration scan="true" scanPeriod="10 seconds">
          <include resource="org/springframework/boot/logging/logback/base.xml" />
            
          <!-- 参数定义 -->
          <property name="maxFileSize" value="100MB"/>
          <property name="maxHistory" value="2"/>
            
          <!-- 日志的级别:debug,info,warn,error -->
          <appender name="infoFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
              <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> 
                  </filter> -->
              <File>${LOG_PATH}/info.log</File>
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>${LOG_PATH}/zf-info-%d{yyyyMMdd}.log.%i
                  </fileNamePattern>
                  <timeBasedFileNamingAndTriggeringPolicy
                      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                      <maxFileSize>${maxFileSize}</maxFileSize>
                  </timeBasedFileNamingAndTriggeringPolicy>
                  <maxHistory>${maxHistory}</maxHistory>
              </rollingPolicy>
              <layout class="ch.qos.logback.classic.PatternLayout">
                  <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%logger{36} 表示logger名字最长36个字符,否则按照句点分割,%msg:日志消息,%n是换行符 -->
                  <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}
                      -%msg%n
                  </Pattern>
              </layout>
          </appender>
    
          <appender name="errorFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
              <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                  <level>ERROR</level>
              </filter>
              <File>${LOG_PATH}/error.log</File>
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>${LOG_PATH}/zf-error-%d{yyyyMMdd}.log.%i
                  </fileNamePattern>
                  <timeBasedFileNamingAndTriggeringPolicy
                      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                      <maxFileSize>${maxFileSize}</maxFileSize>
                  </timeBasedFileNamingAndTriggeringPolicy>
                  <maxHistory>${maxHistory}</maxHistory>
              </rollingPolicy>
              <layout class="ch.qos.logback.classic.PatternLayout">
                  <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%logger{36} 表示logger名字最长36个字符,否则按照句点分割,%msg:日志消息,%n是换行符 -->
                  <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}
                      -%msg%n
                  </Pattern>
              </layout>
          </appender>
          <root level="INFO">
              <appender-ref ref="infoFile" />
              <appender-ref ref="errorFile" />
          </root>
    
      </configuration>
    
  • 启动项目查看log文件夹下是否有相应log生成

druid使用logback输出sql日志

  • application.properties中对druid的配置里filters增加slf4j,以便druid识别项目日志记录工具
      ……
      # 在stat,wall过滤的基础上增加slf4j,如果使用的是log4j则做相应的修改
      # 配置监控统计拦截的filters,stat:监控统计;wall:用于防火墙,防御sql注入;slf4j:日志记录
      spring.datasource.filters = stat,wall,slf4j
      ……
    
  • 在logback日志记录文件zf-logback.xml中针对druid做相应的修改
      ……
      <!-- 参数定义 -->
      <property name="maxFileSize" value="100MB"/>
      <property name="maxHistory" value="2"/>
      ……
      <!-- druid log记录 开始 -->
      <appender name="druidFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <File>${LOG_PATH}/druid.log</File>
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <fileNamePattern>${LOG_PATH}/zf-druid-%d{yyyyMMdd}.log.%i</fileNamePattern>
              <timeBasedFileNamingAndTriggeringPolicy 
              	class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                  <maxFileSize>${maxFileSize}</maxFileSize>
              </timeBasedFileNamingAndTriggeringPolicy>
              <maxHistory>${maxHistory}</maxHistory>
          </rollingPolicy>
          <layout class="ch.qos.logback.classic.PatternLayout">
              <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%logger{36} 表示logger名字最长36个字符,否则按照句点分割,%msg:日志消息,%n是换行符 -->
              <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}
                  -%msg%n
              </Pattern>
          </layout>
      </appender>
      <!--配置druid的SQL日志输出-->
      <logger name="druid.sql.Statement" level="DEBUG" additivity="false">
          <appender-ref ref="druidFile" />
      </logger>
      <logger name="druid.sql.ResultSet" level="debug" additivity="false">
          <appender-ref ref="druidFile"/>
      </logger>
      <!-- 控制台输出 -->
      <logger name="druid.sql.Statement" level="DEBUG" additivity="false">
          <appender-ref ref="CONSOLE" />
      </logger>
      <logger name="druid.sql.ResultSet" level="debug" additivity="false">
          <appender-ref ref="CONSOLE"/>
      </logger>
      <!-- druid log记录 结束 -->
      ……
    
  • 启动项目,执行任何一个数据库查询,查看是否生成了相应的日志
  • ps:druid.sql.xxx
      包:com.alibaba.druid.filter.logging
      类:Slf4jLogFilter
      过滤类型:
          druid.sql.DataSource :datasource
          druid.sql.Connection :connection
          druid.sql.Statement  :执行的SQL
          druid.sql.ResultSet  :执行SQL后数据库返回的结果集
    

参考文件

  • 有时候在application.properties中直接配置logging.path没有效果,可以直接在logback.xml中直接指定
    .......
    <property name="LOG_PATH" value="logs"/>
    ......
    
  • 动态指定logback日志输出路径

上一篇:spring boot使用druid管理数据库连接池 下一篇:Apache Commons工具类

首页 > 学习总览 > 开发语言 > Java