blogApp編寫之slf4j日誌記錄數據庫讀寫耗時

   咱們繼續咱們的博客建立。html

          在一個項目平常的運行中,經常會爲服務過慢而致使用戶體驗很差,在這一點上,經常須要進行性能優化,而若是沒有針對性的對某一個java

模塊進行優化,那麼效果每每是不理想的,所以須要對日誌進行記載,得知是數據庫讀寫性能過差,仍是由於程序邏輯寫的過於繁瑣而致使項目運行mysql

過慢,所以在此就須要對每次的讀寫進行日誌記錄。spring

         這裏採用了slf4j以及spring的aop特性來作到日誌記錄。sql

         具體須要的maven依賴以下:mongodb

          

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <!--logback-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
        <!--slf4j-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
這裏我採用了logback,logback的速度很是快,相比於log4j的記錄日誌,有着明顯的優點。

        logback的配置文件爲:數據庫

        

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="UTF-8">
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!--天天生成一個日誌文件,保存30天的日誌文件。-->
    <appender name="DayFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    <!--指定logger name爲包名或類全名 指定級別 additivity設置是否傳遞到root logger -->
    <logger name="slf4j" level="INFO" additivity="true">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="DayFile"/>
    </logger>
    <!--slf4j2包下的類在ERROR級別時候傳遞到root logger中-->
    <logger name="slf4j2" level="ERROR" />
    <!--根logger控制-->
    <root level="INFO">
        <appender-ref ref="stdout" />
        <appender-ref ref="DayFile"/>
    </root>
</configuration>
在這裏,在項目啓動時,會自動在相應的模塊中建立一個文件夾爲log,用來存放日誌。

        在這些配置完成以後,咱們能夠開始咱們的日誌記錄。express

        在這裏,首先編寫一個日誌記錄的註解:api

  能夠採用直接在對應的方法中添加log來記錄耗時,可是這種方法太過繁瑣,以及不夠優雅,所以不採用這種方法進行日誌記錄。性能優化

        註解LogPerformance:

package cn.com.log;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by Administrator on 2016/1/20.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogPerformance {
}
在這裏咱們還另外須要一個攔截器來攔截有這個註解的相應方法。

攔截器LogPerformanceInterceptor:

package cn.com.log;

import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * Created by Administrator on 2016/1/20.
 */
@Slf4j
public class LogPerformanceInteceptor implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        long methodegin = System.currentTimeMillis();
        Object result = invocation.proceed();
        long during = System.currentTimeMillis() - methodegin;
        //只有加上註解的才進行解析
        if (invocation.getMethod().isAnnotationPresent(LogPerformance.class)) {
            log.info("blog-db : Class {} , Method {} execute time {} ms ",
                    invocation.getMethod().getDeclaringClass().getName(), invocation.getMethod().getName(), during);
        }
        return result;
    }
}
上述代碼中,檢查到相應的方法上有Logperformance註解以後,對這個方法進行日誌記錄其耗時。

        具體的代碼就是如上,可是還有spring的配置文件中,要對攔截器進行配置才能起做用。

       相應的配置爲:

       

<bean id="logPerformanceInteceptor" class="cn.com.log.LogPerformanceInteceptor">
	</bean>
	<aop:config>
		<!--切入點-->
		<aop:pointcut id="loginPoint"
					  expression="execution(public * cn.com.*.*.*(..)) "/>
		<!--在該切入點使用自定義攔截器-->
		<aop:advisor pointcut-ref="loginPoint" advice-ref="logPerformanceInteceptor"/>
	</aop:config>
在這裏,由於我採用的數據庫並不僅是mysql,還有mongodb往後可能還會採用cassandra,所以不能只監控一個package下的類,這個其切入點的配置,基本對全部的

package下的類都進行了監控。

       如此,就能夠進行日誌記錄了,這個操做比較簡單,在這裏我就不演示項目運行時如何記錄日誌。

相關文章
相關標籤/搜索