1. 程式人生 > >springboot學習(十) springboot 新增druid監控,開啟慢日誌,配置spring監控

springboot學習(十) springboot 新增druid監控,開啟慢日誌,配置spring監控

springboot 新增druid監控,開啟慢日誌,配置spring監控

1 新增druid依賴

 compile group: 'com.alibaba', name: 'druid-spring-boot-starter', version: "${druidVersion}"

2 新增druid properties檔案內的資料庫連線資訊配置


spring.datasource.name=optocon
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid
.filters=stat,wall,logback spring.datasource.druid.filter.stat.log-slow-sql=true spring.datasource.druid.filter.stat.merge-sql=true spring.datasource.druid.filter.stat.slow-sql-millis=1 spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306
/optocon?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.druid.username=root spring.datasource.druid.password=root #配置初始化大小/最小/最大 spring.datasource.druid.initial-size=1 spring.datasource.druid.min-idle=1 spring.datasource.druid.max-active=20 #獲取連線等待超時時間 spring.datasource
.druid.max-wait=60000 #間隔多久進行一次檢測,檢測需要關閉的空閒連線 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.validation-query=SELECT 'x' spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return=false #開啟PSCache,並指定每個連線上PSCache的大小。oracle設為true,mysql設為false。分庫分表較多推薦設定為false spring.datasource.druid.pool-prepared-statements=false spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20

3 配置druid連線池以及慢日誌配置

其中statFilter 配置了慢日誌開啟,慢日誌閾值等。

package com.iscas.business.config.db;



import java.sql.SQLException;
import java.util.Arrays;

import javax.sql.DataSource;

import com.alibaba.druid.filter.logging.Slf4jLogFilter;
import com.alibaba.druid.filter.stat.StatFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.alibaba.druid.pool.DruidDataSource;

import lombok.extern.slf4j.Slf4j;

/**
 *
 *
 * @author zhuquanwen
 * @vesion 1.0
 * @date 2018/8/31 11:01
 * @since jdk1.8
 */

@Slf4j
@Configuration
@RefreshScope
public class DruidConfiguration {
    @Value("${spring.datasource.druid.url}")
    private String dbUrl;
    @Value("${spring.datasource.druid.username}")
    private String username;
    @Value("${spring.datasource.druid.password}")
    private String password;
    @Value("${spring.datasource.druid.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.druid.initial-size}")
    private int initialSize;
    @Value("${spring.datasource.druid.min-idle}")
    private int minIdle;
    @Value("${spring.datasource.druid.max-active}")
    private int maxActive;
    @Value("${spring.datasource.druid.max-wait}")
    private int maxWait;
    @Value("${spring.datasource.druid.time-between-eviction-runs-millis}")
    private int timeBetweenEvictionRunsMillis;
    @Value("${spring.datasource.druid.min-evictable-idle-time-millis:60000}")
    private int minEvictableIdleTimeMillis;
    @Value("${spring.datasource.druid.validation-query}")
    private String validationQuery;
    @Value("${spring.datasource.druid.test-while-idle}")
    private boolean testWhileIdle;
    @Value("${spring.datasource.druid.test-on-borrow}")
    private boolean testOnBorrow;
    @Value("${spring.datasource.druid.test-on-return}")
    private boolean testOnReturn;
    @Value("${spring.datasource.druid.pool-prepared-statements}")
    private boolean poolPreparedStatements;
    @Value("${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}")
    private int maxPoolPreparedStatementPerConnectionSize;
    @Value("${spring.datasource.druid.filters:stat,wall,logback}")
    private String filters;

    @Value("${spring.datasource.druid.filter.stat.log-slow-sql:true}")
    private boolean logslowSql;
    @Value("${spring.datasource.druid.filter.stat.merge-sql:true}")
    private boolean mergeSql;
    @Value("${spring.datasource.druid.filter.stat.slow-sql-millis:200}")
    private long slowSqlMill;
//    @Value("${spring.datasource.connectionProperties}")
//    private String connectionProperties;
//    @Value("${spring.datasource.useGlobalDataSourceStat}")
//    private boolean useGlobalDataSourceStat;

    @Bean     //宣告其為Bean例項
    @Primary  //在同樣的DataSource中,首先使用被標註的DataSource
    @RefreshScope
    public DataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);

        //configuration
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);

        //        datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
        try {
            datasource.setFilters(filters);
        } catch (SQLException e) {
            log.error("druid configuration initialization filter: "+ e);
        }
        datasource.setProxyFilters(Arrays.asList(statFilter(),logFilter()));
//        datasource.setConnectionProperties(connectionProperties);
        return datasource;
    }

    @Bean
    @Primary
    public StatFilter statFilter(){
        StatFilter statFilter = new StatFilter();
        statFilter.setSlowSqlMillis(slowSqlMill);
        statFilter.setLogSlowSql(logslowSql);
        statFilter.setMergeSql(mergeSql);
        return statFilter;
    }

    @Bean
    public Slf4jLogFilter logFilter(){
        Slf4jLogFilter filter = new Slf4jLogFilter();
//        filter.setResultSetLogEnabled(false);
//        filter.setConnectionLogEnabled(false);
//        filter.setStatementParameterClearLogEnable(false);
//        filter.setStatementCreateAfterLogEnabled(false);
//        filter.setStatementCloseAfterLogEnabled(false);
//        filter.setStatementParameterSetLogEnabled(false);
//        filter.setStatementPrepareAfterLogEnabled(false);
        return  filter;
    }
}

4 配置druid監控,過濾URL使用者名稱密碼黑名單白名單等

package com.iscas.business.config.db;

import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.iscas.business.config.StaticInfo;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

/**
 * Druid監控
 *
 * @author zhuquanwen
 * @vesion 1.0
 * @date 2018/8/31 16:07
 * @since jdk1.8
 */
@Configuration
public class DruidMonitorConfiguration {




    /**

     * 註冊一個StatViewServlet

     * @return

     */

    @Bean
    public ServletRegistrationBean DruidStatViewServle2(){

        //org.springframework.boot.context.embedded.ServletRegistrationBean提供類的進行註冊.
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid2/*");
        //新增初始化引數:initParams
        //白名單:
//        servletRegistrationBean.addInitParameter("allow","127.0.0.1");
        //IP黑名單 (存在共同時,deny優先於allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
        servletRegistrationBean.addInitParameter("deny","192.168.1.73");
        //登入檢視資訊的賬號密碼.
        servletRegistrationBean.addInitParameter("loginUsername","druid");
        servletRegistrationBean.addInitParameter("loginPassword","druid");
        //是否能夠重置資料.
        servletRegistrationBean.addInitParameter("resetEnable","false");

        return servletRegistrationBean;

    }

    /**
     * 註冊一個:filterRegistrationBean
     * @return
     */
    @Bean
    public FilterRegistrationBean druidStatFilter2(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //新增過濾規則.
        filterRegistrationBean.addUrlPatterns("/*");
        //新增不需要忽略的格式資訊.
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid2/*," +
                "/swagger-resources/*,/loginTest/*,/api/*,/webjars/*./webSocketServer/*,/webSocketTest/*,*.html,*.json");
        return filterRegistrationBean;
    }
}

5 logback.xml中新增druid慢日誌配置單獨打包到一個檔案內

<appender name="DruidFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌檔案的路徑及檔名 -->
        <file>${LOG_PATH}/${APPDIR}/log_druid.log</file>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日誌檔案的路徑,例如今天是2013-12-21日誌,當前寫的日誌檔案路徑為file節點指定,可以將此檔案與file指定檔案路徑設定為不同路徑,從而將當前日誌檔案或歸檔日誌檔案置不同的目錄。
            而2013-12-21的日誌檔案在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-druid-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日誌記錄之外,還配置了日誌檔案不能超過2M,若超過2M,日誌檔案會以索引0開始,
            命名日誌檔案,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日誌 -->
        <append>true</append>
        <!-- 日誌檔案的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日誌檔案只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
<logger name="com.alibaba.druid.filter.stat.StatFilter" level="ERROR">
        <appender-ref ref="DruidFILE" />
    </logger>

6 開啟spring監控

package com.iscas.business.config.db;

import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * //TODO
 *
 * @author zhuquanwen
 * @vesion 1.0
 * @date 2018/8/31 17:37
 * @since jdk1.8
 */
@Configuration
public class SpringDaoMethodAspect {

    @Bean
    public DruidStatInterceptor druidStatInterceptor() {
        DruidStatInterceptor dsInterceptor = new DruidStatInterceptor();
        return dsInterceptor;
    }

    @Bean
    @Scope("prototype")
    public JdkRegexpMethodPointcut druidStatPointcut() {
        JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
        pointcut.setPatterns("com.iscas.business.test.controller.*",
                "com.iscas.business.controller.*");

        return pointcut;
    }

    @Bean
    public DefaultPointcutAdvisor druidStatAdvisor(DruidStatInterceptor druidStatInterceptor, JdkRegexpMethodPointcut druidStatPointcut) {
        DefaultPointcutAdvisor defaultPointAdvisor = new DefaultPointcutAdvisor();
        defaultPointAdvisor.setPointcut(druidStatPointcut);
        defaultPointAdvisor.setAdvice(druidStatInterceptor);
        return defaultPointAdvisor;
    }
}

這裡寫圖片描述

sql監控,按照配置的慢SQL,大於閾值的就顯示為紅色,也會記錄上上面定義的慢日誌檔案中
這裡寫圖片描述

URI監控
這裡寫圖片描述

Spring監控

這裡寫圖片描述

相關推薦

springboot學習() springboot 新增druid監控開啟日誌配置spring監控

springboot 新增druid監控,開啟慢日誌,配置spring監控 1 新增druid依賴 compile group: 'com.alibaba', name: 'druid-spring-boot-starter', version: "$

SpringBoot入門五,新增Activiti5.22工作流線上編輯器

線上編輯器可以直接參考,springMVC整合activiti-explorer5.22(一)中的第2、3、4步,以及springMVC整合activiti-explorer5.22(二)的配置,基本整合基本完成,這裡來著重說一下在springboot中需要修改的地方. 1.修改ModelSaveRestR

SpringBoot入門六,新增Thymeleaf模板支援

專案基本配置參考文章SpringBoot入門一,使用myEclipse新建一個SpringBoot專案,使用myEclipse新建一個SpringBoot專案即可。現在來給專案新增一個log4j2支援,新增方式非常簡單,僅需兩步即可,具體內容如下: 1. pom.xml新增thymeleaf支援

SpringBoot學習(七)之使用RabbitMQ

Message Broker與AMQP簡介 Message Broker是一種訊息驗證、傳輸、路由的架構模式,其設計目標主要應用於下面這些場景: 訊息路由到一個或多個目的地 訊息轉化為其他的表現方式 執行訊息的聚集、訊息的分解,並將結果傳送到他們的目的地,然後重新

spring boot 學習()SpringBoot配置傳送Email

SpringBoot配置傳送Email 引入依賴 在 pom.xml 檔案中引入郵件配置: <dependency> <groupId>org.springframework.boot</groupId>

springboot學習SpringBoot的環境配置

SpringBoot集成了很多常用的第三方jar包,比如mysql,redis等,並且內部也做了很多的預設配置,具體可以看spring-boot-autoconfigure-1.5.6.RELEASE.jar內部的各種配置類,當然SpringBoot也提供了我們自己能夠自己配置環境。 Sprin

SpringBoot學習筆記-SpringBoot配置

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-famil

SpringBoot教程()springboot整合redis

一.redis的安裝  =檢視reids列表安裝博文 二.spring整合redis    1.pom檔案依賴引用      sb2.x以後redis等資料處理元件都封裝到 spring data 工程裡了

八、瀏覽器不能開啟jenkins報告報錯Opening Robot Framework report failed

解決方案一:(推薦) 開啟jenkins----系統管理---輸入:  System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")   後,點選執行,再清理瀏覽器快取(ctrl+shift+dele

lvs/dr+keepalived搭建成功後開啟防火墻虛擬IP不能訪問但是真實IP卻可以訪問

p地址 地址 搭建 訪問 roc 奮鬥 mask col 實現 lvs/dr+keepalived搭建成功後,開啟防火墻,虛擬IP不能訪問,但是真實IP卻可以訪問,如果關閉防火墻虛擬IP就可以訪問網站了,這個問題肯定是防火墻在作怪. 經過這兩的不懈奮鬥和大家的幫助,我的lv

rsync通過服務同步Linux系統日誌screen工具

日誌 哪些 存在 ins ssa 博客 後臺 etc 數據 筆記內容:l 10.32/10.33 rsync通過服務同步l 10.34 linux系統日誌l 10.35 screen工具筆記日期:2017.9.3 10.32/10.33 rsync通過服務同步rsync還可

LAMP(php動態擴展模塊httpd的rewritephp錯誤日誌php.ini配置詳解)

php動態擴展模塊 httpd的rewrite php錯誤日誌 php.ini配置詳解 一、php動態擴展模塊比如我們需要用到php一個模塊,恰好他沒有這個模塊。我們需要編一個.so出來?/usr/local/php/bin/php -m //查看模塊 ? 下面安裝一個redis的模塊 ? c

八周三課 rsync通過服務同步linux系統日誌screen工具

rsync 系統日誌 screen工具 rsync通過服務的方式同步通過服務的方式首先我們要開啟一個服務,它的架構是cs架構。客戶端和服務端。服務端開啟一個服務,rsync服務,並且要監聽一個端口,默認為873,並且這個端口是可以自定義的。開啟服務後,客戶端究竟可以通過873這個端口和服務端進行通

win10連接無線網開啟移動熱點手機連接它手機一直顯示獲取ip地址中。

菜單 手機 無線網卡 color 開啟 p地址 地址 計算機管理 計算機 *必須要有無線網卡才能設置WIFI首先打開電腦,選中“計算機”或者“我的電腦”,右擊進入“管理”選項“。打開“計算機管理”窗口之後,在左欄菜單選項中找到“服務和應用程序”下的“服務”選項,如圖點擊進入

windows下啟動cmd開啟指定目錄執行指定命令

本地專案環境執行需要不斷進行如 cmd 下: C:\Users\MeetYou\Desktop>d: D:\>cd meiyou-wjt D:\meiyou-wjt>vagrant up 有點麻煩,改用bat 一鍵啟動本地環境 start cmd /k "

關於MySQL日誌你想知道的都在這

作者介紹 鄒鵬,現任職於騰訊雲資料庫團隊,負責騰訊雲資料庫MySQL中介軟體研發,多年的資料庫、網路安全研發經驗,對雲端計算平臺的網路、計算、儲存、安全有著深入的瞭解,在MySQL的高可用、高可靠、中介軟體方面有豐富的經驗。 目錄: 什麼是慢日誌? 什麼情況下產生慢日誌? 慢日誌相關引數 慢日誌

Windows系統下 開啟mongodb使用者名稱密碼登入

開啟安全性驗證1)管理員許可權執行cmd,進入你安裝mongod的bin目錄下輸入以下命令,重新安裝 MongoDB服務mongod --auth --logpath "g:\mongodb\logs\MongoDB.log" --logappend --dbpath "g:

現象:頁面開啟一片空白相應 日誌列印錯誤:java.io.IOException: Connection reset by peer

解決方法:重啟tomcat。Connection reset 會在客戶端不知道 channel 被關閉的情況下, 觸發了 eventloop 的 unsafe.read() 操作丟擲問題出現原因:(轉載)這個異常是由於以下幾個原因造成。1、客戶端再發起請求後沒有等伺服器端相應

檔案描述符表開啟檔案表索引節點表

 下圖是一個例項,其中描述符1和4通過不同的開啟檔案表表項來引用兩個不同的檔案,這是一種典型的情況,沒有檔案共享,並且每個描述符對應一個不同的檔案:       多個描述符也可以通過不同的檔案表表項來引用同一個檔案。例如,如果以同一個檔名呼叫open函式2次,就會發生這種情況。關鍵思想是每個檔案描

除錯列印TXT檔案列印TXT日誌 file_put_contents()

file_put_contents() 函式用於把字串寫入檔案,成功返回寫入到檔案內資料的位元組數,失敗則返回 FALSE。 file_put_contents('seshi123.txt'