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的rewrite,php錯誤日誌,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'